51单片机04矩阵按键逐行扫描,行列扫描代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
矩阵键盘扫描原理
方法一:
逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
方法二:
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
//行列扫描
#include
#define GPIO_KEY P0
#define GPIO_LCD P2
unsigned char code a[17]=
{~0xfc,~0x60,~0xda,~0xf2,~0x66,~0xb6,~0xbe,~0xe0,
~0xfe,~0xf6,~0xee,~0x3e,~0x9c,~0x7a,~0xde,~0x8e,~0x00}; //按位取反的用法
void delay10ms();
void keydown();//要与下面的定义一致
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_KEY=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;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: 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 P2
unsigned char code 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()
{
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)
{
case 0x77: key=0;goto AA;
case 0x7b: key=1;goto AA;
case 0x7d: key=2;goto AA;
case 0x7e: key=3;goto AA;
}
}
GPIO_KEY=0xbf;
{
switch(GPIO_KEY)
{
case 0xb7: key=4;goto AA; case 0xbb: key=5;goto AA; case 0xbd: key=6;goto AA; case 0xbe: key=7;goto AA; }
}
GPIO_KEY=0xdf;
if(GPIO_KEY!=0xdf)
{
switch(GPIO_KEY)
{
case 0xd7: key=8;goto AA; case 0xdb: key=9;goto AA; case 0xdd: key=10;goto AA; case 0xde: key=11;goto AA; }
}
GPIO_KEY=0xef;