完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
矩阵按键的原理图:
高定电平与低电平导通之后也变为低电平,当低电平消失之后,又变为高电平。 方法一: 先令P1为0x0f,如果有键按下,则前四位必定有一位由1变为0;然后,找到是哪一行哪一列,在检测按键函数中,一行一行的去寻找,从key_buf【】中循环取值,每一个值都是前四位只有一个值为0,意味着只有一行的引脚输出电平为零,如果P1&0x0f!=0x0f,则意味着后四位有一位变成了零,也就意味着按下的这个键在在这一行里,然后去判断是哪一列,从16个已经写好的数中循环,看跟哪个相等就是哪一个按键,取值是唯一的,所有结果也是唯一的,返回结果即可。再给P0赋值相应的显示数字的段选码。 #include "reg52.h" void delay(int x) //延时函数 { int i,j; for(i=0;i for(j=0;j<112;j++) { } } } char code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //字模 char code key_buf[]={0x77,0x7b,0x7d,0x7e,0xb7,0xbb,0xbd,0xbe,0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee}; // 按下键之后对应的P1值 int get_key() { char code key_scan[]={0xef,0xdf,0xbf,0x7f}; int i=0,j=0; for(i=0;i<4;i++) { P1=key_scan; if((P1&0x0f)!=0x0f) { delay(10); if((P1&0x0f)!=0x0f) { for(j=0;j<16;j++) { if(P1==key_buf[j]) { return j; } } } } } return -1; } void main() { char key=0; P0=~smgduan[key]; //P0控制数码管 while(1) { key=get_key(); if(key!=-1) { P0=~smgduan[key]; } } } 方法二: 先让P1前四位为零,后四位为1,然后判断是否P1&0x0f还等于0x0f,如果不相等,就说明有键按下,然后判断是是哪一列,记录下来,然后接着判断是哪一行,记录下来,给P0赋段码值,显示是哪个按键。 #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define GPIO_DIG P0 #define GPIO_KEY P1 u8 KeyValue; //用来存放读取到的键值 u8 code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void delay(u16 i) { while(i--); } void KeyDown(void) { char a=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { delay(1000);//延时10ms进行消抖 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下 { //测试列 GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=1;break; case(0X0d): KeyValue=2;break; case(0X0e): KeyValue=3;break; } //测试行 GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue;break; case(0Xb0): KeyValue=KeyValue+4;break; case(0Xd0): KeyValue=KeyValue+8;break; case(0Xe0): KeyValue=KeyValue+12;break; } } } while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测 { delay(100); a++; } } void main() { while(1) { KeyDown(); //按键判断函数 GPIO_DIG=~smgduan[KeyValue]; // } } 按键为什么要消抖: 按键在按下的5ms-10ms之内,信号由于机械的抖动,电平会多次变化,单片机cpu处理速度很快,如果做一个消抖延时,cpu会处理这次按键多次,产生严重的逻辑错误。 |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
329浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 08:01 , Processed in 1.148583 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号