社区导航

 

搜索
查看: 1156|回复: 8

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

[复制链接]

15

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 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不同其他都没太多区别,
所以我就。。。一筹莫展,不太明白这段程序,希望哪位大神可以给我讲解一下,十分感谢!







此帖出自单片机论坛


回复

使用道具 举报

1349

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-3-11 09:01 | 显示全部楼层
1) 先把矩阵按键的扫描原理理解透再看代码
2) 上面的代码参考就好,不适合应用在产品中,定时最好用定时器做定时事件
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void


回复

使用道具 举报

3425

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-3-11 12:00 | 显示全部楼层
这种程序实在看不下去,自己写个4*4的按键扫描程序吧,不超过10行就能搞定


回复

使用道具 举报

3425

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-3-11 12:03 | 显示全部楼层
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


回复

使用道具 举报

190

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-3-11 18:20 | 显示全部楼层
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


回复

使用道具 举报

3425

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-3-12 14:03 | 显示全部楼层
本帖最后由 huo_hu 于 2019-3-12 14:04 编辑

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

点评

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


回复

使用道具 举报

190

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

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

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


回复

使用道具 举报

190

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-3-13 11:02 | 显示全部楼层
LZ要注意 ,当有按键按下时,temp=P1还是=0xfe? 可能是 = 0xee; 或其它;


回复

使用道具 举报

363

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-3-13 11:41 | 显示全部楼层
QQ:2213825928 语音芯片、模块。串口MP3芯片、模块 http://mk020.taobao.com


回复

使用道具 举报

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

关闭

站长推荐上一条 /1 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-7-24 03:54 , Processed in 0.269274 second(s), 19 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表