完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#define GPIO_KEY P1 //矩阵键盘的接口 #define GPIO_DIG P0 typedef unsigned char u8; u8 KEY; ***it SM = P3^1; //输入密码按键 ***it GM = P3^0; //修改密码按键 ***it OK = P3^2; //确认键 ***it LSA = P2^2; ***it LSB = P2^3; ***it LSC = P2^4; u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值 void delay_ms(unsigned int x) { unsigned int i,j; for(i = 0;i < x; i++) for(j = 0; j < 110; j++); } u8 Keyscan() { char a = 0; u8 KEY; GPIO_KEY = 0x0f; if(GPIO_KEY != 0x0f) //判断按键是否有按下 { delay_ms(10); //延时去抖 if(GPIO_KEY != 0x0f) //再次判断是否有按下 { //扫描列 GPIO_KEY = 0x0f; switch(GPIO_KEY) { case(0x07):KEY = 0;break; case(0x0b):KEY = 1;break; case(0x0d):KEY = 2;break; case(0x0e):KEY = 3;break; } //扫描行 GPIO_KEY = 0xf0; switch(GPIO_KEY) { case(0x70):KEY = KEY;break; case(0xb0):KEY = KEY+4;break; case(0xd0):KEY = KEY+8;break; case(0xe0):KEY = KEY+12;break; } while((a<50) && (GPIO_KEY != 0xf0)) //按键松开检查 { delay_ms(10); a++; } return KEY; } } } void Keyscan_duli() { if(GM == 0) { delay_ms(10); if(GM == 0) { KEY = 0x0b; } while(!GM); } else if(SM == 0) { delay_ms(10); if(SM == 0) { KEY = 0x0a; } while(!SM); } else if(OK == 0) { delay_ms(10); if(OK == 0) { KEY = 0x0c; } while(!OK); } } void main() { LSA = 0; LSB = 0; LSC = 0; while(1) { Keyscan_duli(); KEY = Keyscan(); GPIO_DIG = smgduan[KEY]; } } 想问下各位大佬,为什么不管按GM、SM、OK键数码管都显示A,而如果只有独立键盘扫描函数,即把主函数中的KEY=Keyscan()注释掉,按GM、SM、OK键就能分别显示A、B、C。 |
|
相关推荐
19个回答
|
|
本帖最后由 wulinwl 于 2017-8-2 18:13 编辑
全局变量KEY在Keyscan_duli();程序中获取的值被下一条语句KEY = Keyscan();覆盖掉了。改成这样看看:#include #define GPIO_KEY P1 //矩阵键盘的接口 #define GPIO_DIG P0 typedef unsigned char u8; u8 KEY; ***it SM = P3^1; //输入密码按键 ***it GM = P3^0; //修改密码按键 ***it OK = P3^2; //确认键 ***it LSA = P2^2; ***it LSB = P2^3; ***it LSC = P2^4; u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值 void delay_ms(unsigned int x) { unsigned int i,j; for(i = 0;i < x; i++) for(j = 0; j < 110; j++); } void Keyscan() { char a = 0; // u8 KEY; GPIO_KEY = 0x0f; if(GPIO_KEY != 0x0f) //判断按键是否有按下 { delay_ms(10); //延时去抖 if(GPIO_KEY != 0x0f) //再次判断是否有按下 { //扫描列 GPIO_KEY = 0x0f; switch(GPIO_KEY) { case(0x07):KEY = 0;break; case(0x0b):KEY = 1;break; case(0x0d):KEY = 2;break; case(0x0e):KEY = 3;break; } //扫描行 GPIO_KEY = 0xf0; switch(GPIO_KEY) { case(0x70):KEY = KEY;break; case(0xb0):KEY = KEY+4;break; case(0xd0):KEY = KEY+8;break; case(0xe0):KEY = KEY+12;break; } while((a<50) && (GPIO_KEY != 0xf0)) //按键松开检查 { delay_ms(10); a++; } // return KEY; } } } void Keyscan_duli() { if(GM == 0) { delay_ms(10); if(GM == 0) { KEY = 0x0b; } while(!GM); } else if(SM == 0) { delay_ms(10); if(SM == 0) { KEY = 0x0a; } while(!SM); } else if(OK == 0) { delay_ms(10); if(OK == 0) { KEY = 0x0c; } while(!OK); } } void main() { LSA = 0; LSB = 0; LSC = 0; while(1) { Keyscan_duli(); Keyscan(); GPIO_DIG = smgduan[KEY]; } }
最佳答案
|
|
|
|
不懂 大神求解
|
|
|
|
***
|
|
|
|
Keyscan_duli();
KEY = Keyscan(); 这两个函数都是修改同一个变量KEY,Keyscan_duli();是在函数内部修改,Keyscan();是执行完后返回给KEY,这样的话,执行完Keyscan_duli();后,不管KEY是什么值,再执行完Keyscan(); 就被修改了。 应该用两个不同的变量,或者用不同的按键码值 |
|
|
|
人中狼 发表于 2017-8-2 15:46 那显示时不就有两个变量名 |
|
|
|
不想有两个变量名,两个函数调用次序对调一下,先键盘矩阵,然后再是独立键盘
|
|
|
|
|
|
|
|
矩阵按键扫描函数错了。。。
//扫描列 GPIO_KEY = 0x0f; switch(GPIO_KEY) { case(0x07):KEY = 0;break; case(0x0b):KEY = 1;break; case(0x0d):KEY = 2;break; case(0x0e):KEY = 3;break; } //扫描行 GPIO_KEY = 0xf0; switch(GPIO_KEY) { case(0x70):KEY = KEY;break; case(0xb0):KEY = KEY+4;break; case(0xd0):KEY = KEY+8;break; case(0xe0):KEY = KEY+12;break; } 应该是&=吧??你直接赋值,case没有满足的! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
先键盘矩阵,然后再是独立键盘之后还不行,是键盘矩阵的显示不对,还是独立键盘的显示不对,测试时键盘矩阵应该避开键值是A,B,C的按键
|
|
|
|
单片机、ARM、嵌入式相关问题加群羊交流201030910
|
|
|
|
wulinwl 发表于 2017-8-2 18:04 这样就可以了,这是为啥啊 |
|
|
|
不管哪个先,都是独立键盘显示不对 |
|
|
|
这是因为全局变量KEY在独立键盘扫描程序Keyscan_duli();中获得的值会被矩阵键盘扫描程序KEY = Keyscan();改写。我把矩阵键盘扫描程序中的局部变量KEY注释掉,也取消返回值,这样两个键盘扫描程序共用全局变量KEY,在主程序中分别调用两个键盘扫描程序,谁有操作就显示谁的键值。 |
|
|
|
wulinwl 发表于 2017-8-4 06:10 哦,懂了,谢谢 |
|
|
|
谢谢各位大佬的回答
|
|
|
|
不错,感谢分享经验心得,值得学习,麻烦了,辛苦了,非常感谢。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
龙芯中科胡伟武:3B6600 八核桌面 CPU 性能将达到英特尔中高端酷睿 12~13 代水平
425 浏览 0 评论
树莓派Pico 2发布,搭载RP2350双核RISC-V和Arm Cortex-M33微控制器!
413 浏览 0 评论
嵌入式学习-搭建自己的ubuntu系统之VMware Tools安装
373 浏览 0 评论
嵌入式学习-搭建自己的ubuntu系统之ubuntu系统安装
590 浏览 0 评论
国产芯上运行TinyMaxi轻量级的神经网络推理库-米尔基于芯驰D9国产商显板
648 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10669 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-15 06:04 , Processed in 1.164962 second(s), Total 110, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191