资源描述:
《51单片机04矩阵按键逐行扫描,行列扫描代码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、矩阵键盘扫描原理 方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。 方法二: 行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值
2、判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。 //行列扫描#include#define GPIO_KEY P0#define GPIO_LCD P2unsigned char code a[17]={~0xfc,~0x60,~0xda,~0xf2,~0x66,~0xb6,~0xbe,~0xe0,~0xfe,~0xf6,~0xee,~0x3e,~0x9c,~0x7a,~0xde,~0x8e,~0x00};//按位取反的用法void delay10ms();void k
3、eydown();//要与下面的定义一致void main(){ GPIO_LCD=a[16];//初始化数码管 while(1) { keydown(); }}void delay10ms(){ unsigned char a,b; for(a=38;a>0;a--) for(b=130;b>0;b--);}void keydown()//检测按下,按下时需要消抖,检测松开,返回按键值//没有按键时保持{ unsigned char n=0,key; GPIO_K
4、EY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { delay10ms(); //延时10ms消抖 if(GPIO_KEY!=0x0f)//再次检测按键是否按下 { GPIO_KEY=0x0f;//测试列 switch(GPIO_KEY) { case 0x07: key=0;break; case 0x0b: key=1;break; case 0x0d: key=2
5、;break; case 0x0e: key=3;break; default : GPIO_LCD=a[16]; } 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
6、: key=key+12;break; default : GPIO_LCD=a[16]; } GPIO_LCD=a[key]; while(++n<5&&GPIO_KEY!=0xf0)//检测按键是否松开 { delay10ms(); } } }}//逐行扫描#include#define GPIO_KEY P0#define GPIO_LED P2unsigned char cod
7、e a[17]={~0xfc,~0x60,~0xda,~0xf2,~0x66,~0xb6,~0xbe,~0xe0,~0xfe,~0xf6,~0xee,~0x3e,~0x9c,~0x7a,~0xde,~0x8e,~0x00};//按位取反的用法void delay10ms();void keydown1();//要与下面的定义一致void main(){ GPIO_LED=a[16];//初始化数码管 while(1) { keydown1(); }}void keydown1()
8、{ unsigned char n=0,key; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//检测按键是否按下 { delay10ms();//延时10ms消抖 if(GPIO_KEY!=0x0f)//再次检测 { GPIO_KEY=0x7f;//高四位轮流输出低电平 if(GPIO_KEY!=0x7f) { switch(GPIO_KEY) {