51单片机04矩阵按键逐行扫描行列扫描代码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

if(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;

if(GPIO_KEY!=0xef)

相关文档
最新文档