单片机4*4键盘处理程序

越详细越好,我很急. 谢谢谢谢谢谢谢谢谢谢谢谢谢

看看这两个吧。一。void delay(void) //5ms
{
unsigned char a,b;
for(b=19;b>0;b--)
for(a=130;a>0;a--);
}

unsigned char scanf(void)
{
unsigned char recode,i,j;
for(i=0;i<4;i++)
{
P1=~(0x01<<i);
recode=P1>>4;
if(recode<0x0f)
{
for(j=0;j<4;j++){if(!(recode&0x01<<j))break;}
return (i<<2)+(j+1); //返回键值 1-16
}
delay(); //延时5ms
}
return 0; //无按键返回
}二。void delay() //延时子程序{ unsigned char n, m; for (n = 100; n > 0; n--) for (m = 300; m > 0; m--); }unsigned char Keycan(void) //按键扫描程序 P1.0--P1.3为行线 P1.4--P1.7为列线{ unsigned char rcode, ccode; P1 = 0xF0; // 发全0行扫描码,列线输入 if((P1&0xF0) != 0xF0) // 若有键按下 { delay();// 延时去抖动 if((P1&0xF0) != 0xF0) { rcode = 0xFE; // 逐行扫描初值 while((rcode&0x10) != 0) { P1 = rcode; // 输出行扫描码 if((P1&0xF0) != 0xF0) // 本行有键按下 { ccode = (P1&0xF0)|0x0F; do{;}while((P1&0xF0) != 0xF0); //等待键释放 return ((~rcode) + (~ccode)); // 返回键编码 } else rcode = (rcode<<1)|0x01; // 行扫描码左移一位 } } } return 0; // 无键按下,返回值为0}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-23
如果放一个具体电路就好讲了。现在只能给你说可以用两种方式来1。逐行扫描的方式2。行反转的方式这些你可以字网上找找。应该有的。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网