除了这个电路外,还真没有见过用更少的I/O做这么多键盘的方案(除了借助芯片外),有人说能做,其实细细推敲,基本上都不成立。 code const byte KEY_VALUE[16] = {0x0c,0x0a,0x06,0x0c,0x09,0x05,0x0a,0x09,0x03,0x06,0x05,0x03,0x0e,0x0d,0x0b,0x07}; code const byte KEY_CTRL[16] = {0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x0f,0x0f,0x0f,0x0f}; byte bTmp,bDataNum,bTmp2; bDataNum = 16; do{ bTmp = P2 & 0xf0; bTmp2 = KEY_CTRL[bDataNum-1]; P2 = bTmp | bTmp2 ; vTimeDelay01ms(); bTmp = P2 & bTmp2; if(bTmp == KEY_VALUE[bDataNum-1]) goto KEYPRESS; }while(--bDataNum); KEYPRESS: if(bDataNum) { 说明有键值,进行处理 } else { 说明没有键值处理 }
不过,这个电路最好是在每个管脚上加去耦电容,增加硬件的抗干扰。 |