6187|8

11

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

新人小白请教一段电子密码锁的代码! [复制链接]

在网上参考的一段代码,主要实现电子密码锁的键盘扫描功能,但是本人才疏学浅,孤陋寡闻,对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 (84.81 KB, 下载次数: 0)

微信图片_20190310214211.png
此帖出自单片机论坛

最新回复

好  详情 回复 发表于 2019-3-13 11:41
点赞 关注(1)
 

回复
举报

1368

帖子

6

TA的资源

版主

沙发
 
1) 先把矩阵按键的扫描原理理解透再看代码
2) 上面的代码参考就好,不适合应用在产品中,定时最好用定时器做定时事件
此帖出自单片机论坛
 
个人签名专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
这种程序实在看不下去,自己写个4*4的按键扫描程序吧,不超过10行就能搞定
此帖出自单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

4
 
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 18:20
 
 
 

回复

257

帖子

0

TA的资源

一粒金砂(高级)

5
 
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-12 14:03
 
 
 

回复

4008

帖子

0

TA的资源

版主

6
 
本帖最后由 huo_hu 于 2019-3-12 14:04 编辑

这段只负责取状态,取回状态和前次状态比较再消抖
这段是可以支持组合按键的,特别厉害
此帖出自单片机论坛

点评

对,厉害,不说还真没注意到;  详情 回复 发表于 2019-3-13 10:59
 
 
 

回复

257

帖子

0

TA的资源

一粒金砂(高级)

7
 
huo_hu 发表于 2019-3-12 14:03
这段只负责取状态,取回状态和前次状态比较再消抖
这段是可以支持组合按键的,特别厉害

对,厉害,不说还真没注意到;
此帖出自单片机论坛
 
 
 

回复

257

帖子

0

TA的资源

一粒金砂(高级)

8
 
LZ要注意 ,当有按键按下时,temp=P1还是=0xfe? 可能是 = 0xee; 或其它;
此帖出自单片机论坛
 
 
 

回复

326

帖子

1

TA的资源

一粒金砂(中级)

9
 
此帖出自单片机论坛
 
个人签名QQ:2213825928 语音芯片、模块。串口MP3芯片、模块 http://mk020.taobao.com
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表