前言 ·主要介绍矩阵按键原理以及扫描方式和编写代码的思路 矩阵按键的扫描原理 矩阵按键的扫描原理主要由两种逐行扫描与行列扫描 逐行扫描:可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到数据不全为1时,说明有按键按下,然后通过接收到的数据是哪一位为0来进行判断是哪一个按键按下。 行列扫描:可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位就会有一位被拉低,不会全是高电平,说明有按键按下,通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出输出高电平,低四位输出低电平,然后根据接收到的高四位的值进行判断是哪一行有按键按下,这样就能够确定是哪一个按键按下了。 程序效果通过八段数码管来验证 矩阵按键的原理图如下所示: 单片机复位电路与晶振电路如下图所示: 单片机芯片图片如下所示: 八段数码管模块如下图所示:点亮最右边的一位数码管 程序代码主要用到扫描原理是方法二:行列扫描。 程序代码如下
#include <stc15.h>
typedef unsigned int uint;
typedef unsigned char uchar;
#defien key P3
#define smg_duan P0
sbit smg_wei P1^0;
uchar code smg_duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00};
uchar num=0;
void delay(uint i)
{
while(i--);
}
void Mode_IO()
{
P0M0=0;
P0M1=0;
P1M0=0;
P1M1=0;
P2M0=0;
P2M1=0;
P3M0=0;
P3M1=0;
}
void KeyDis()
{
uchar temp0,temp1,temp2,a;
key=0x0f;
if(key!=0x0f)
{
delay(1000);
if(key!=0x0f)
{
temp1=key;
}
key=0xf0;
if(key!=0xf0)
{
temp2=key;
}
temp0=temp1+tep2;
switch(temp0)
{
case(0x77): num=1;break;
case(0x7b): num=2;break;
case(0x7d): num=3;break;
case(0x7e): num=4;break;
case(0xb7): num=5;break;
case(0xbb): num=6;break;
case(0xbd): num=7;break;
case(0xbe): num=8;break;
case(0xd7): num=9;break;
case(0xdb): num=10;break;
case(0xdd): num=11;break;
case(0xde): num=12;break;
case(0xe7): num=13;break;
case(0xeb): num=14;break;
case(0xed): num=15;break;
case(0xee): num=16;break;
}
while((a<50)&&(key!=0xf0))
{
delay(1000);
a++;
}
}
}
void main()
{
Mode_IO();
smg_wei=0;
while(1)
{
KeyDis();
smg_duan=smg_duanma[num];
delay(100);
smg_daun=0x00;
}
}
程序效果图如下:
|