📄 51
字号:
//-----------------------函数声明,变量定义---------------------------
#include <reg51.h> //头文件
#define uchar unsigned char //类型定义
#define uint unsigned int //类型定义
#define KEY P1
//-----------------------函数声明------------------------------------
void SCANkey(); //程序扫描键盘,供主程序调用
void delay(uint N); //延时子程序,实现(16*N+24)us的延时
bit hitkey(); //判断是否有键按下,有返回1,没有返回0
uchar scan_key(); //扫描键盘,返回键值
void key_manage(uchar keycode); //键值处理跳转程序
void key1(void); //按键1处理程序
//…… //其它按键处理程序省略
//main():主函数
//在主函数中,先对系统进行初始化设置,其后主要任务是实时检测有无按键按下,有按键按下时,调用相应处理程序;无按键按下时,继续循环检测。
void main()
{
EA=0; //关中断
while(1) //循环检测按键,调用相应处理程序
{
SCANkey(); //调用扫描键盘程序
}
}
//SCANkey():扫描键盘程序
//扫描键盘程序,有键按下完成按键处理,无键按下直接返回。
void SCANkey()
{
uchar key_code;
if(hitkey()) //判断是否有键按下
{
delay(1000); //延时20ms左右,消除抖动干扰
if(hitkey()) //判断是否有效按键
{
key_code=scan_key();
while(hitkey()); //等待按键释放
key_manage(key_code); //键盘扫描、键值处理跳转、按键处理
}
}
}
//delay():延时子程序
//延时子程序,实现(16*N+24)us的延时。系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动。
void delay(uint N)
{
int i;
for(i=0;i<N;i++);
}
//hitkey():判断是否有键按下
//函数功能:判断是否有键按下,有返回1,没有返回0。
bit hitkey() //判断是否有键按下,有返回1,没有返回0
{
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); //否则有键闭合,返回1
}
//scan_key():扫描键盘子程序
//扫描键盘,返回键值。高四位代表行,低四位代表列。
uchar scan_key() //扫描键盘,返回键值(高四位代表行,低四位代表列)
{
uchar scancode,keycode;
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; //键盘扫描码变反,返回
return(keycode);
}
//键值处理跳转子程序
//keycode 扫描键盘返回的键值。高四位代表行,低四位代表列。
void key_manage(uchar keycode)
{
switch(keycode)
{
case 0x11: key1();break;
case 0x12: key2();break;
case 0x14: key3();break;
case 0x18: key4();break;
case 0x21: key5();break;
case 0x22: key6();break;
case 0x24: key7();break;
case 0x28: key8();break;
case 0x41: key9();break;
case 0x42: key10();break;
case 0x44: key11();break;
case 0x48: key12();break;
case 0x81: key13();break;
case 0x82: key14();break;
case 0x84: key15();break;
case 0x88: key16();break;
// default:
}
}
void key1(void)
{
//……
}
//……//其它键值处理程序省略
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -