本讲任务:
了解矩阵键盘检测原理及如何获得键盘扫描值。
逐行扫描:
我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
例程:
/*************************矩阵键盘扫描**************************
*单片机型号:STC89C52RC
*开发环境:KEIL
*功能:当按下一个按键后,在数码管进行数值的显示
******************************************************************/
#include<reg51.h>
sbit BEEP=P2^3;
sbit LE1=P2^6;
sbit LE2=P2^7;
void delay(int In,int Out);
unsigned char buffer,key_num;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(int In,int Out) //定义延时函数
{
int i,j;
for(i=0;i<In;i++)
{for(j=0;j<Out;j++){;}}
}
void display(unsigned char num) //数码管显示
{
P0=table[num]; LE1=1;LE1=0;
P0=0x00; LE2=1;LE2=0;
}
void main()
{
LE1=0;LE2=0;
while(1)
{
/**************************************************************/
P3=0xfe; //扫描S3,S4,S5,S6;
buffer=P3;
buffer=buffer&0xf0;
if(buffer!=0xf0)
{
delay(5,10);
if(buffer!=0xf0)
{
buffer=P3;
switch(buffer)
{
case 0xee:{key_num=0;}break;
case 0xde:{key_num=1;}break;
case 0xbe:{key_num=2;}break;
case 0x7e:{key_num=3;}break;
}
while(buffer!=0xf0)
{
buffer=P3;
buffer=buffer&0xf0;
BEEP=0;
}
BEEP=1;
display(key_num);
}
}
/**************************************************************/
P3=0xfd; //扫描S8,S9,S10,S11
buffer=P3;
buffer=buffer&0xf0;
if(buffer!=0xf0)
{
delay(5,10);
if(buffer!=0xf0)
{
buffer=P3;
switch(buffer)
{
case 0xed:{key_num=4;}break;
case 0xdd:{key_num=5;}break;
case 0xbd:{key_num=6;}break;
case 0x7d:{key_num=7;}break;
}
while(buffer!=0xf0)
{
buffer=P3;
buffer=buffer&0xf0;
BEEP=0;
}
BEEP=1;
display(key_num);
}
}
/**************************************************************/
P3=0xfb; //扫描S13,S14,S15,S16
buffer=P3;
buffer=buffer&0xf0;
if(buffer!=0xf0)
{
delay(5,10);
if(buffer!=0xf0)
{
buffer=P3;
switch(buffer)
{
case 0xeb:{key_num=8;}break;
case 0xdb:{key_num=9;}break;
case 0xbb:{key_num=10;}break;
case 0x7b:{key_num=11;}break;
}
while(buffer!=0xf0)
{
buffer=P3;
buffer=buffer&0xf0;
BEEP=0;
}
BEEP=1;
display(key_num);
}
}
/***************************************************************/
P3=0xf7; //扫描S18,S19,S20,S21
buffer=P3;
buffer=buffer&0xf0;
if(buffer!=0xf0)
{
delay(5,10);
if(buffer!=0xf0)
{
buffer=P3;
switch(buffer)
{
case 0xe7:{key_num=12;}break;
case 0xd7:{key_num=13;}break;
case 0xb7:{key_num=14;}break;
case 0x77:{key_num=15;}break;
}
while(buffer!=0xf0)
{
buffer=P3;
buffer=buffer&0xf0;
BEEP=0;
}
BEEP=1;
display(key_num);
}
}
}
}
对应电路图:
最后,求求看到的此文的小伙伴点赞和关注支持一下下哦。毕竟,码字不容易哦,您的支持是我最大的动力呀!!!呜呜呜~~~