(编写程序要从小的程序一步一步做起!)
//程序:矩阵键盘
//功能:验证矩阵键盘——按下不弄的键盘在数码管上显示不同的数字
#include<reg51.h> //头文件
#define uchar unsigned char //类型定义
#define uint unsigned int //类型定义
#define KEY P1 //定义端口
//子函数声明
void SCANkey(); //扫描键盘函数
bit hitkey(); //判断是否有键盘按下,有则返回1,没有返回0
uchar scan_key();//扫描键盘,返回键盘值
void delay(uint N);//延迟函数
void key_manage(uchar keycode);//键值处理函数
void display(uchar n);//数码管显示函数
//数码管显示码表
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//主函数
void main()
{
EA=0; //关中断
while(1) //无限循环
{
SCANkey();//进行键盘扫描
}
}
//函数名:SCANkey
//函数功能:扫描键盘程序,有键按下完成按键处理,无按键按下时直接返回
//形式参数:无
//返回值:无
void SCANkey()
{
uchar key_code;
if(hitkey()) //判断是否有按键按下
{
delay(2); //延时20ms,消除按键抖动干扰
if(hitkey()) //再次判断是否是有效按键
{
key_code=scan_key();
while(hitkey()); //等待按键释放
key_manage(key_code); //键盘扫描、键值处理跳转、按键处理
}
}
}
//函数名:hitkey
//函数功能:判断是否有键按下
//形式参数:无
//返回值:1表示有按键按下,0表示无按键按下
bit hitkey()
{
uchar scancode,keycode;
scancode=0x0f; //P1.4~P1.7输出全0
KEY=scancode; //扫描按键,换回键值
keycode=KEY; //读P1.0~P1.3的状态
if((keycode&0x0f)==0x0f) //屏蔽高4位
return(0); //全1则无按键闭合,换回0
else
return(1); //全0则有按键闭合,换回1
}
//函数名:delay
//函数功能:延时效果,实现(N*10ms)的延时。系统采用12MHZ的时钟时,延时满足要求,其他情况需要改动。
//形式参数:N
//返回值:无
void delay(uint N)
{
int i,j,k;
for(i=0;i<N;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++);
}
//函数名:sacn_key
//函数功能:扫描按键,换回键值。高4位代表行,低4位代表列
//形式参数:无
//返回值:keycode,相应的按键按下扫描出一个按键扫描码,送到key_manage函数提取扫描码
uchar scan_key()
{
uchar scancode,keycode,keycodeh,keycodel;
scancode=0xef; //扫描键盘,采用逐行扫描法,P1.4=0,扫描第一行
while(scancode!=0xff)
{
KEY=scancode; //输入扫描码,扫描P1.4对应的行
keycode=KEY; //读出数据,看是否在此行的某列键盘被按下
if((keycode&0x0f)!=0x0f)break; //扫描到按下十位键,怎退出
scancode=(keycode<<1)|0x0f; //否则,左移,更新扫描码继续扫描
}
keycode=~keycode; //键盘扫描码变反,返回
keycodeh=keycode<<4;
keycodel=keycode>>4;
keycode=keycodeh|keycodel;
return(keycode);
}
//函数名:key_manage
//函数功能:键值处理跳转,根据keycode而对应display参数
//形式参数:keycode扫描键盘返回的值。高4位代表行,低4位代表列
//返回值:display(?)函数
void key_manage(uchar keycode)
{
switch(keycode)
{
case 0x11:display(0);break;
case 0x12:display(1);break;
case 0x14:display(2);break;
case 0x18:display(3);break;
case 0x21:display(4);break;
case 0x22:display(5);break;
case 0x24:display(6);break;
case 0x28:display(7);break;
case 0x41:display(8);break;
case 0x42:display(9);break;
case 0x44:display(10);break;
case 0x48:display(11);break;
case 0x81:display(12);break;
case 0x82:display(13);break;
case 0x84:display(14);break;
case 0x88:display(15);break;
}
}
//函数名:display
//函数功能:让数码管显示相应正确的值
//形式参数:n key_manage函数根据扫描码返回的不同的值
//返回值:无
void display(uchar n)
{
P0=table[n];
}
转载于:https://blog.51cto.com/macfooter/579015