完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
#include
上面是我们一般写51单片机程序的头文件,但是在蓝桥杯开发板上注意到其中需要用到P4口,而此头文件并没有声明P4口。 sfr P4 = 0xC0; //端口声明,此版本reg52没有P4口 在需要使用P4口的函数前声明即可 矩阵键盘的扫描思想
在上面的矩阵键盘中,要识别出黄色按键的按下状态,应该怎么做呢? 对与矩阵键盘,我们只能逐行扫描,然后读取列的状态信号。如果R3行输出低电平,那么黄色按键如果有按下动作的话,那读取C2列信号也应该为低电平,而该行上其他没有按下动作的按键的列信号则为高电平。因此,我们可以得到矩阵键盘的基本扫描步骤:
如此循环往复,扫描的按键的状态。 /********************************************************** @功能模块:主函数 @作 者:朱明 @时 间:2020年2月6日/ #include #include "mode.h" #include "delay.h" #include "test.h" /********************************************************** 说明:"",<>,两种引用方式的区别: <>是指从当前安装目录处引用,如果找不到则报错。 “”,是先从当前工程文件夹寻找如果找不到则到安装目录中去找,找不到则报错。 **********************************************************/ void main() { while(1) { test(); } } /******************************************************** @功能模块:工程函数 @作 者:朱明 @时 间:2020年2月6日 *********************************************************/ #include "test.h" #include "testa.h" sfr P4 = 0xC0; //端口声明,此版本reg52没有P4口 ***it R1 = P3^0; ***it R2 = P3^1; ***it R3 = P3^2; ***it R4 = P3^3; ***it C4 = P3^4; ***it C3 = P3^5; ***it C2 = P4^2; ***it C1 = P4^4; unsigned char code SMG_duanma[18]= { /*0*/ 0xc0 ,/*1*/ 0xf9 ,/*2*/ 0xa4 , /*3*/ 0xb0 ,/*4*/ 0x99 ,/*5*/ 0x92 , /*6*/ 0x82 ,/*7*/ 0xf8 ,/*8*/ 0x80 , /*9*/ 0x90 ,/*a*/ 0x88 ,/*b*/ 0x80 , /*c*/ 0xc6 ,/*d*/ 0xc0 ,/*e*/ 0x86 , /*f*/ 0x8e ,/*g*/ 0xbf ,/*h*/ 0x7f }; unsigned char key_num; //按键对应的数码管值 void test() //单片机使用核心工程文件 /************************************************************ //按键S7和S6为选择键,确定控制键控制那组LED指示灯。 //简单来说就是S7按下后,S6/S5/S4无效,再按下S7后按键S6方才有效。 //只有当S6按键有效的时候(S7无效)S5/S4按键的控制才有效 ***********************************************************/ { R1 = 0; //扫描第一排按键 R2 = R3 = R4 = 1; C1 = C2 = C3 = C4 =1; if(C1 == 0) { while(C1 == 0); key_num = 0; testa(SMG_duanma[key_num]); } else if(C2 == 0) { while(C2 == 0); key_num = 1; testa(SMG_duanma[key_num]); } else if(C3 == 0) { while(C3 == 0); key_num = 2; testa(SMG_duanma[key_num]); } else if(C4 == 0) { while(C4 == 0); key_num = 3; testa(SMG_duanma[key_num]); } R2 = 0; //扫描第二排按键 R1 = R3 = R4 = 1; C1 = C2 = C3 = C4 =1; if(C1 == 0) { while(C1 == 0); key_num = 4; testa(SMG_duanma[key_num]); } else if(C2 == 0) { while(C2 == 0); key_num = 5; testa(SMG_duanma[key_num]); } else if(C3 == 0) { while(C3 == 0); key_num = 6; testa(SMG_duanma[key_num]); } else if(C4 == 0) { while(C4 == 0); key_num = 7; testa(SMG_duanma[key_num]); } R3 = 0; //扫描第三排按键 R2 = R1 = R4 = 1; C1 = C2 = C3 = C4 =1; if(C1 == 0) { while(C1 == 0); key_num = 8; testa(SMG_duanma[key_num]); } else if(C2 == 0) { while(C2 == 0); key_num = 9; testa(SMG_duanma[key_num]); } else if(C3 == 0) { while(C3 == 0); key_num = 10; testa(SMG_duanma[key_num]); } else if(C4 == 0) { while(C4 == 0); key_num = 11; testa(SMG_duanma[key_num]); } R4 = 0; //扫描第四排按键 R2 = R3 = R1 = 1; C1 = C2 = C3 = C4 =1; if(C1 == 0) { while(C1 == 0); key_num = 12; testa(SMG_duanma[key_num]); } else if(C2 == 0) { while(C2 == 0); key_num = 13; testa(SMG_duanma[key_num]); } else if(C3 == 0) { while(C3 == 0); key_num = 14; testa(SMG_duanma[key_num]); } else if(C4 == 0) { while(C4 == 0); key_num = 15; testa(SMG_duanma[key_num]); } } /******************************************************** @功能模块:模式函数 @作 者:朱明 @时 间:2020年2月6日 **********************************************************/ #include "mode.h" void mode(unsigned char channel) //单片机使用前清零以及模式选择 { switch(channel) { case 4: P2 = (P2 & 0x1f) | 0x80; break; case 5: P2 = (P2 & 0x1f) | 0xa0; break; case 6: P2 = (P2 & 0x1f) | 0xc0; break; case 7: P2 = (P2 & 0x1f) | 0xe0; break; } } /********************************************************* @功能模块:工程函数 @作 者:朱明 @时 间:2020年2月6日 ***********************************************************/ #include "testa.h" #include "mode.h" extern unsigned char key_num; void testa(unsigned char value) //单片机使用核心工程文件 { mode(6); P0 = 0x01; mode(7); P0 = value; mode(4); P0 = 0xff << (key_num+1); //数码管显示对应的按键数 if (key_num > 7) { P0 = 0xff00 >> (key_num+1); //先从左到右扫描再从右到左扫描 } } |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
3136 浏览 0 评论
3361 浏览 9 评论
3046 浏览 16 评论
3540 浏览 1 评论
9157 浏览 16 评论
1285浏览 3评论
661浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
652浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2398浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1964浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-12 21:32 , Processed in 1.034523 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191