本文共 3127 字,大约阅读时间需要 10 分钟。
if不能嵌套,我之前嵌套一下,后来发现当key0==0(按下)是不允许有key==1(弹起),如果按下里面有弹起则视为抖动,所以不能嵌套。
void key() { if(key0==0&&flag==0) { flag=1; } if(flag==1&&key0==1) { num++; flag=0; } }
用矩阵编码形式进行赋值传递 0x0f 和 0xf0 分别作为L低位H高位的初始值edb7和edb7的排列组合1111 0000 :0xf00000 1111 :0x0f按下即为0(分别判断L位和H位)
void key_scan() { unsigned char temp0=0,temp1=0,temp=0; P1=0xf0; if(P1!=0xf0) { delay(20); temp0=P1; P1=0x0f; if(P1!=0x0f) { temp1=P1; } } temp=temp0+temp1; if(temp==0xee) { num=0; } if(temp==0xed) { num=1; } if(temp==0xeb) { num=2; } if(temp==0xe7) { num=3; } if(temp==0xde) { num=4; }
bit keysta = 1;//当前值 bit backup = 1; //前次备份值 void key() { if(keysta != backup) //说明按键有动作 { if(backup == 0)//前次值为0,则当前值为1(弹起动作) { num++; if(num>=10) { num = 0; } P2 = str[num]; } backup = keysta;//更新备份值为当前值,循环时进行比较 } }/* T0 中断服务函数,用于按键状态的扫描并消抖 */ void InterruptTime0() interrupt 1 { static unsigned char keybuf = 0xff;//按键抖动扫描缓冲区8位, //保留16ms里面的缓冲扫描值 TH0 = 0xF8; //重新加载初值2ms TL0 = 0xCD; keybuf = (keybuf<<1)|key0;//(0000000key0|xxxxxxx0) → key0 //是1就是1,是0就是0(或运算) if(keybuf == 0x00) //八位16ms都是0 { keysta = 0; } else if(keybuf == 0xFF) { keysta = 1; } else { }//其余情况代表未稳定,不做判断 }
矩阵行和列检测是否按下,每一行进行4ms,4行全部检测时间16ms
void key() { for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(backup[i][j] != keysta[i][j]) { if(backup[i][j] == 0) { P2 = str[i*4+j]; } backup[i][j] = keysta[i][j]; } } } }void InterruptTime0() interrupt 1 { static unsigned char keybuf[4][4] = { { 0xFF, 0xFF, 0xFF, 0xFF}, { 0xFF, 0xFF, 0xFF, 0xFF}, { 0xFF, 0xFF, 0xFF, 0xFF}, { 0xFF, 0xFF, 0xFF, 0xFF}}; static unsigned char keyout = 0; unsigned char k ; TH0 = 0xFC; TL0 = 0x67; keybuf[keyout][0] = (keybuf[keyout][0] << 1) | L0; keybuf[keyout][1] = (keybuf[keyout][1] << 1) | L1; keybuf[keyout][2] = (keybuf[keyout][2] << 1) | L2; keybuf[keyout][3] = (keybuf[keyout][3] << 1) | L3; //检测 L 列 + 选择 H 行 for(k=0;k<4;k++) { if((keybuf[keyout][k] & 0x0F) == 0x00) { keysta[keyout][k] = 0; } if((keybuf[keyout][k] & 0x0F) == 0x0F) { keysta[keyout][k] = 1; } } keyout++; keyout = keyout & 0x03;//小技巧:到四归零 switch(keyout)//选择H行 { case 0: H0 = 0; H3 = 1;break; case 1: H1 = 0; H0 = 1;break; case 2: H2 = 0; H1 = 1;break; case 3: H3 = 0; H2 = 1;break; default:break; }}
转载地址:http://tcgwi.baihongyu.com/