草莓味的棉花糖|基于proteus的51单片机开发实例24-矩阵键盘(行列式键盘)( 二 )


1.4.电路设计本实例电路图如图1所示 。 矩阵键盘电路与单片机的P3口的8额I/O连接 , P0口连接一个共阳极数码管 , 用于演示按键序号 , 指示那个按键被按下 。
1.5.程序设计本实例程序代码如下 。
为了能让大家更为直观的理解矩阵键盘的扫描原理 , 本例的代码非常详细的列出了整个矩阵键盘的行列扫描过程 , 没有采用更简洁的编程方法 。
#include//
sbitP34=P3^4;//端口引脚定义
sbitP35=P3^5;//
sbitP36=P3^6;//
sbitP37=P3^7;//
//共阳极数码管段码表 , 0~9,A,b,c,d,E,F,H,P
unsignedcharcodeTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89};//
//定义键值的全局变量
unsignedcharkeyval;
//延时函数
voidled_delay(void)
{
unsignedcharj;
for(j=0;j<200;j++)
;
}
//数码管显示键值
voiddisplay(unsignedchark)
{
P0=Tab[k];//键值送数码管显示
led_delay();//延时
}
//voiddelay20ms(void)
{
unsignedchari,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
voidmain(void)
{
EA=1;//总中断开启
ET0=1;//定时器T0中断开启
TMOD=0x01;//定时器T0工作方式1
TH0=(65536-500)/256;//定时器初值
TL0=(65536-500)%256;//定时器初值
TR0=1;//开启定时器
keyval=0x00;//键值初始化为0
P2=0xFC;//数码管公共端打开 , 允许显示
while(1)
{
display(keyval);//数码管显示键值
}
}
//定时器T0中断服务程序
voidtime0_interserve(void)interrupt1using1
{
TR0=0;//进中断后 , 先关闭定时器
P3=0xf0;//行线电平全部置低电平 , 列线全部置高电平
if((P3&0xf0)!=0xf0)//如果列线中有低电平 , 说明有键被按下
delay20ms();//延时 , 消除按键抖动
if((P3&0xf0)!=0xf0)//消抖后仍有列线为低电平 , 则认为确实有按键按下
{
//扫描第一行
P3=0xfe;//行线第一行置低电平 ,
if(P34==0)//第一列为低电平 , 则第一行第一列的按键按下
keyval=1;//按下的按键的键值
if(P35==0)//第二列为低电平 , 则第一行第二列按键按下
keyval=2;//键值
if(P36==0)//第三列为低电平 , 则第一行第三列按键按下
keyval=3;
if(P37==0)//第四列为低电平 , 则第一行第四列按键按下
keyval=4;//
//扫描第二行
P3=0xfd;
if(P34==0)
keyval=5;
if(P35==0)
keyval=6;
if(P36==0)
【草莓味的棉花糖|基于proteus的51单片机开发实例24-矩阵键盘(行列式键盘)】keyval=7;
if(P37==0)
keyval=8;
//扫描第三行
P3=0xfb;
if(P34==0)
keyval=9;
if(P35==0)
keyval=10;
if(P36==0)
keyval=11;
if(P37==0)
keyval=12;
//扫描第四行
P3=0xf7;
if(P34==0)
keyval=13;
if(P35==0)
keyval=14;
if(P36==0)
keyval=15;
if(P37==0)
keyval=16;
}
TR0=1;//重启定时器
TH0=(65536-500)/256;//定时器赋初值
TL0=(65536-500)%256;//
}
1.6.实例仿真编写程序代码 , 编译生成HEX文件 , 将HEX文件装载到proteus电路的单片机中 , 开始仿真 , 通过按下不同的按键观察数码管显示的键值 。
1.7.总结通过本实例 , 我们了解了如何用较少的按键实现矩阵键盘的按键识别 。 这为我们以后学习如何节约I/O端口打下了基础 。