📄 key_drv.c
字号:
#include <reg51.h>
#include <absacc.H>
#include "main.h"
#include "globe.h"
#include "lcd.h"
#include "menu.h"
sbit RL0=P1^4;
sbit RL1=P1^5;
sbit RL2=P1^6;
sbit RL3=P1^7;
sbit LCD_LED=P1^0; //液晶背光开关
void Set_Key_Col(void)
{
RL0= 1;
RL1= 1;
RL2= 1;
RL3= 1;
}
uchar Line_L_Col_H(void)
{
uchar c;
Key_Scan_CS = 0x00; //行输出低电平,列输出高电平
Set_Key_Col();
c = P1; //读P1口状态
c &= 0xf0;
return(c);
}
uchar Line_Scan(uchar count)
{
uchar c,c1;
Set_Key_Col();
switch(count)
{
case 0:
Key_Scan_CS = 0x0e;
c1 =0x0e;
break;
case 1:
Key_Scan_CS = 0x0d;
c1 =0x0d;
break;
case 2:
Key_Scan_CS = 0x0b;
c1 =0x0b;
break;
case 3:
Key_Scan_CS = 0x07;
c1 =0x07;
break;
default:
break;
}
c = P1;
c &= 0xf0;
if(c == 0xf0)
return(0);
else
c |= c1;
return(c);
}
void Key_Scan(void)
{
uchar c,c1;
uchar i;
if(Key_Pressed == 0) //当前状态为没有键盘按下
{
c = Line_L_Col_H();
if(c != 0xf0) //有键按下,循环扫描
{
for(i=0;i<4;i++)
{
c1 = Line_Scan(i);
if(c1 != 0)
break;
}
Cur_KeyCode = c1; //保存键码
if(Cur_KeyCode == Pre_KeyCode) //与上一次保存的键码比较
{
KeyCounter ++;
if(KeyCounter >=5) //连续检测到5次同一键码,认为有键按下
{
KeyCounter = 0; //键码检测计数器清零
Key_Pressed = 1; //树键盘按下标志
Key_Waitpro = 1; //树键盘等待处理标志
}
}
else
{
Pre_KeyCode = Cur_KeyCode; //保存键码
KeyCounter = 0; //键码检测计数器清零
}
}
else
{
KeyCounter = 0; //键码检测计数器清零
Pre_KeyCode = 0; //键码清零
}
}
else //当前状态为已经有键盘按下,正在处理
{
c = Line_L_Col_H();
if(c == 0xf0)
{ //无键按下,说明键已经释放,清键盘按下标志
KeyCounter = 0; //键码检测计数器清零
Pre_KeyCode = 0; //键码清零
Key_Pressed = 0; //清键盘按下标志
}
else
{
for(i=0;i<4;i++)
{
c1 = Line_Scan(i);
if(c1 != 0)
break;
}
Cur_KeyCode = c1; //保存键码
if(Cur_KeyCode != Pre_KeyCode) //与上一次保存的键码比较
{ //与上一次保存的键码不相等,说明原键已经释放
KeyCounter = 0; //键码检测计数器清零
Key_Pressed = 0; //清键盘按下标志
Pre_KeyCode = Cur_KeyCode; //放入新的键码
}
//与上一次保存的键码不相等,说明原键还未释放,不处理
}
}
}
void Key_Process(void)
{
LCD_LED=0;
ledlcd_on=1;
ledcnt=0;
Key_Waitpro = 0;
switch(Cur_KeyCode)
{
case KEY1:
Pro_Num(0);
break;
case KEY2:
Pro_Num(1);
break;
case KEY3:
Pro_Num(2);
break;
case KEY4:
Pro_Num(3);
break;
case KEY5:
Pro_Num(4);
break;
case KEY6:
Pro_Num(5);
break;
case KEY7:
Pro_Num(6);
break;
case KEY8:
Pro_Num(7);
break;
case KEY9:
Pro_Num(8);
break;
case KEY10:
Pro_Num(9);
break;
case KEY11:
Pro_Pos(UP);
break;
case KEY12:
Pro_Ent();
break;
case KEY13:
Pro_Esc();
break;
case KEY14:
Pro_LrPos(LEFT);
break;
case KEY15:
Pro_Pos(DOWN);
break;
case KEY16:
Pro_LrPos(RIGHT);
break;
default:
break;
}
}
void Key_Init(void)
{
Key_Pressed = 0; //无键盘按下标志
Key_Waitpro = 0; //无键盘等待处理标志
Cur_KeyCode = 0; //键盘编码清零
Pre_KeyCode = 0; //键盘编码清零
KeyCounter = 0; //键盘去抖动记数
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -