3648|8

15

帖子

0

资源

一粒金砂(中级)

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

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

回复

1387

帖子

6

资源

版主

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

回复

3709

帖子

0

资源

版主

这种程序实在看不下去,自己写个4*4的按键扫描程序吧,不超过10行就能搞定

回复

3709

帖子

0

资源

版主

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

回复

250

帖子

0

资源

一粒金砂(高级)

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

回复

3709

帖子

0

资源

版主

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

这段只负责取状态,取回状态和前次状态比较再消抖
这段是可以支持组合按键的,特别厉害

点评

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

回复

250

帖子

0

资源

一粒金砂(高级)

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

对,厉害,不说还真没注意到;

回复

250

帖子

0

资源

一粒金砂(高级)

LZ要注意 ,当有按键按下时,temp=P1还是=0xfe? 可能是 = 0xee; 或其它;

回复

368

帖子

1

资源

一粒金砂(中级)

个人签名QQ:2213825928 语音芯片、模块。串口MP3芯片、模块 http://mk020.taobao.com

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

热门资料推荐 更多>>
    关闭
    站长推荐上一条 1/3 下一条

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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