[求助] 新人小白请教一段电子密码锁的代码!

落魄IV   2019-3-10 21:54 楼主
在网上参考的一段代码,主要实现电子密码锁的键盘扫描功能,但是本人才疏学浅,孤陋寡闻,对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不同其他都没太多区别,
所以我就。。。一筹莫展,不太明白这段程序,希望哪位大神可以给我讲解一下,十分感谢!







  • 微信图片_20190310214211.png

回复评论 (8)

1) 先把矩阵按键的扫描原理理解透再看代码
2) 上面的代码参考就好,不适合应用在产品中,定时最好用定时器做定时事件
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
点赞  2019-3-11 09:01
这种程序实在看不下去,自己写个4*4的按键扫描程序吧,不超过10行就能搞定
点赞  2019-3-11 12:00
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
点赞  2019-3-11 12:03
引用: huo_hu 发表于 2019-3-11 12:03
unsigned char Get_Key_Status (void) {
    unsigned char i,ret=0,line=0;
                for (i=1;i

消抖怎么处理?
点赞  2019-3-11 18:20
引用: viphotman 发表于 2019-3-11 18:20 消抖怎么处理?
这段只负责取状态,取回状态和前次状态比较再消抖 这段是可以支持组合按键的,特别厉害 本帖最后由 huo_hu 于 2019-3-12 14:04 编辑
点赞  2019-3-12 14:03
引用: huo_hu 发表于 2019-3-12 14:03
这段只负责取状态,取回状态和前次状态比较再消抖
这段是可以支持组合按键的,特别厉害

对,厉害,不说还真没注意到;
点赞  2019-3-13 10:59
LZ要注意 ,当有按键按下时,temp=P1还是=0xfe? 可能是 = 0xee; 或其它;
点赞  2019-3-13 11:02
QQ:2213825928 语音芯片、模块。串口MP3芯片、模块 http://mk020.taobao.com
点赞  2019-3-13 11:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复