在网上参考的一段代码,主要实现电子密码锁的键盘扫描功能,但是本人
才疏学浅,孤陋寡闻,对C语言
一知半解,特来请求各位
大神指教!
附上代码:
//扫描第一行
void key_scan() // 行扫描
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:
key_manage1();
break;
case 0xde:
key_manage2();
break;
case 0xbe:
key_manage3();
break;
case 0x7e:
key_manage4();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//扫描第二行
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:
key_manage5();
break;
case 0xdd:
key_manage6();
break;
case 0xbd:
key_manage7();
break;
case 0x7d:
key_manage8();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//扫描第三行
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:
key_manage9();
break;
case 0xdb:
key_manage10();
break;
case 0xbb:
key_manage11();
break;
case 0x7b:
key_manage12();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//扫描第四行
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:
key_manage13();
break;
case 0xd7:
key_manage14();
break;
case 0xb7:
key_manage15();
break;
case 0x77:
key_manage16();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
也许还需要部分元件的参考图!(如图所示)
本人脸皮较厚,所以特来讲讲我对第一段代码的理解,请求各位批评!(因为第二第三段与第一段的都有相似之处,所以略)
P1=0xfe,转化为八位二进制就是11111110,对应P.10口是低电平,然后temp=P1=0xfe,
接着temp逻辑与0xf0化成八位二进制就是11111110&11110000,结果是11110000,
然后很明显不满足if(temp != 0xf0)条件,也不满足while(temp != 0xf0),
然后我就不会了……因为扫描第二第三第四行的代码除了P1不同其他都没太多区别,
所以我就。。。一筹莫展,不太明白这段程序,希望哪位大神可以给我讲解一下,十分感谢!
-
1) 先把矩阵按键的扫描原理理解透再看代码
2) 上面的代码参考就好,不适合应用在产品中,定时最好用定时器做定时事件
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
这种程序实在看不下去,自己写个4*4的按键扫描程序吧,不超过10行就能搞定
unsigned char Get_Key_Status (void) {
unsigned char i,ret=0,line=0;
for (i=1;i<16;i<<=1) { //1,2,4,8
P1=(P1&0xf0)|~i; //P1列输出
line =(~P1 & 0xf0); //取行值
if (line >0) //P1口高四位不全1有键按下
ret |= (line+i); //当前行值和列值累加
}
return ret;
}//end fun
这段只负责取状态,取回状态和前次状态比较再消抖
这段是可以支持组合按键的,特别厉害
本帖最后由 huo_hu 于 2019-3-12 14:04 编辑
LZ要注意 ,当有按键按下时,temp=P1还是=0xfe? 可能是 = 0xee; 或其它;
好
QQ:2213825928 语音芯片、模块。串口MP3芯片、模块 http://mk020.taobao.com