电路图
简单
1.
void scanButton(void) {
unsigned char temp0=0,temp1=0,temp2=0;
P1 = 0xf0; //1111 0000
if(P1!=0xf0) { //当按下时电平发生改变 如1110 0000
delay(20);
temp0 = P1; //保存行结果
P1 = 0x0f; // 电平反转 0x0f 0000 1111
if(P1!=0x0f) { //当按下时电平发生改变 如0000 1110
temp1 = P1; //保存列结果
}
}
temp2=temp0+temp1;
if(temp2==0xee) {
num=1;
}
}
- 稳定
char key=0;
char ledArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};
char key_buf[] = {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d, //按键的编码
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
char scanKey(void) {
unsigned char key_scan[]={0xef,0xdf,0xbf,0x7f};
unsigned char i=0,j=0;
for(i=0;i<4;i++) { //扫描
P2 =key_scan[i];
if((P2&0x0f)!=0x0f) {
for(i=0;j<16;j++) {
if(key_buf[j]==P2)
return j; //返回键值
}
}
}
return-1;
}
int main(void) {
char key=0;
P0=0x00;
while(1) {
key=scanKey();
if (key!=-1)
P0=ledArray[key];
}
}
}