完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
(1)矩阵按键原理:话不多说,对于16个矩阵按键来说,要想知道哪个按键被按下,可以设置16个IO口,但是这样硬件电路过于繁琐,所以可以采用行列扫描法,由行推列,再由列推行。首先给四个行为低电平,四个列为高电平;如何某个按键被按下,那么该按键所在的列就变为低电平;再给四个行为高电平,四个列为低电平,那么刚才那个按键的所在的行就变为低电平,由此经过行列扫描就是锁定了具体是哪个按键被按下。
(2)矩阵按键原理图: (3)源代码: #include typedef unsigned char u8; typedef unsigned int u16; #define KEY P1 #define SMG P0 ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; u8 value; u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(u16 i) { while(i--); } void keypros() { u8 a=0; u8 i; KEY=0x0f; if(KEY!=0x0f) { delay(100); if(KEY!=0x0f) { KEY=0x0f; switch(KEY) { case 0x07:value=0;break; case 0x0b:value=1;break; case 0x0d:value=2;break; case 0x0e:value=3;break; } KEY=0xf0; switch(KEY) { case 0x70:value=value;break; case 0xb0:value=value+4;break; case 0xd0:value=value+8;break; case 0xe0:value=value+12;break; } while((a<50)&&(value!=0xf0)) { delay(1000); a++; } SMG=smgduan[value]; for(i=0;i<8;i++) { switch(i) { case 0:LSA=0;LSB=0;LSC=0;break; case 1:LSA=1;LSB=0;LSC=0;break; case 2:LSA=0;LSB=1;LSC=0;break; case 3:LSA=1;LSB=1;LSC=0;break; case 4:LSA=0;LSB=0;LSC=1;break; case 5:LSA=1;LSB=0;LSC=1;break; case 6:LSA=0;LSB=1;LSC=1;break; case 7:LSA=1;LSB=1;LSC=1;break; } delay(50000); } } } } void main() { while(1) { keypros(); } } |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
2433 浏览 0 评论
3341 浏览 9 评论
3021 浏览 16 评论
3514 浏览 1 评论
9118 浏览 16 评论
1242浏览 3评论
636浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
627浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2373浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1936浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-23 13:49 , Processed in 1.534806 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号