前言
·主要介绍矩阵按键原理以及扫描方式和编写代码的思路
矩阵按键的扫描原理
矩阵按键的扫描原理主要由两种逐行扫描与行列扫描
逐行扫描:可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到数据不全为1时,说明有按键按下,然后通过接收到的数据是哪一位为0来进行判断是哪一个按键按下。
行列扫描:可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位就会有一位被拉低,不会全是高电平,说明有按键按下,通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出输出高电平,低四位输出低电平,然后根据接收到的高四位的值进行判断是哪一行有按键按下,这样就能够确定是哪一个按键按下了。
程序效果通过八段数码管来验证
矩阵按键的原理图如下所示:
单片机复位电路与晶振电路如下图所示:
单片机芯片图片如下所示:
八段数码管模块如下图所示:点亮最右边的一位数码管
程序代码主要用到扫描原理是方法二:行列扫描。
程序代码如下
#include//定义头文件 typedef unsigned int uint; //定义无符号int数据类型,16位 typedef unsigned char uchar; //定义无符号char数据类型,8位 #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}; //共阴极数码管的0——F段码,0x00为熄灭数码管 uchar num=0; //存放矩阵按键按下的数据变量 void delay(uint i) //软件延时函数 { while(i--); } void Mode_IO() //设置STC15单片机端口IO模式,准双向IO模式 { P0M0=0; P0M1=0; P1M0=0; P1M1=0; P2M0=0; P2M1=0; P3M0=0; P3M1=0; } void KeyDis() //矩阵按键处理函数程序 { uchar temp0,temp1,temp2,a; //temp0存放temp1和temp2相加的结果,temp0存放确定那个按键的值,temp1存放列扫描后的值,temp2存放行扫描的值 key=0x0f; //列扫描赋值 if(key!=0x0f) //判断列是否有按键按下,按下则key不等于0x0f { delay(1000); //消抖 if(key!=0x0f) //再次判断 { temp1=key; //将列扫描后的值存到temp1 } key=0xf0; //行扫描赋值 if(key!=0xf0) //判断行是否有按键按下,按下则key不等于0xf0 { temp2=key; //将行扫描后的值存到temp2 } temp0=temp1+tep2; //将两个结果相加得到的结果赋给temp0,确定那个按键按下 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(); //调用IO模式子程序 smg_wei=0; //拉低第一位数码管 while(1) //主循环 { KeyDis(); //调用按键处理子程序 smg_duan=smg_duanma[num]; //发送数码管段码进行显示 delay(100); smg_daun=0x00; //消隐 } }
程序效果图如下:



