📄 key.h
字号:
//*********************************************
//MCU:AT89S52 ,晶振频率:6 MHz
//键盘接口:4*4行列式键盘
//行线:P10,P11,P12,P13
//列线:P14,P15,P16,P17
//制作人:平顶山工学院计算机系,郭猛
//******************相应的按键扫描码:*******************
#define uchar unsigned char
uchar code Key1=0xEE,Key2=0xDE,Key3=0xBE,Key4=0x7E;
uchar code Key5=0xED,Key6=0xDD,Key7=0xBD,Key8=0x7D;
uchar code Key9=0xEB,Key10=0xDB,Key11=0xBB,Key12=0x7B;
uchar code Key13=0xE7,Key14=0xD7,Key15=0xB7,Key16=0x77;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
uchar KbScan(bit IsUP); //键盘扫描程序,如果按键未按下,不用等待
uchar KbScanUntilKeyDown(bit IsUP); // IsUP=0,只要按下即可 IsUP=1,等待弹起
void DelayuS(uchar DelayTimes); //延时,单位uS
void Delay_1ms(); //延时1mS
void Delay(unsigned int DelayTimes); //延时,DelayTimes是延时的ms数
//**************************************微秒级延时****************************************
void DelayuS(uchar DelayTimes)
{
while(--DelayTimes); //12Mhz下,延时DelayTimes*2+3微秒
}
//**************************************1毫秒延时****************************************
void Delay_1ms()
{
DelayuS(248);
//6 Mhz下延时1 ms
}
//*************************************较长时间,mS级延时(不精确)******************************
void Delay(unsigned int DelayTimes)
{
while(--DelayTimes) Delay_1ms(); //延时,DelayTimes是延时的ms数
}
//键盘扫描程序,如果按键未按下,不用等待
uchar KbScan(bit IsUP)
{
uchar sccode,recode;
P10=1;P11=1;P12=1;P13=1; //行线为1,要输入
P14=0;P15=0;P16=0;P17=0; //列线为0
Delay(1);sccode=0;
recode=P1&0x0F; //读取P1状态
if(recode!=0 && recode!=0x0F) //行线有变化,说明有按键按下
{
Delay(10); //10mS延时去抖
if(recode==(P1&0x0F)) //的确有按键按下
{
P10=recode&0x01; //行线输出recode的状态
P11=recode&0x02;
P12=recode&0x04;
P13=recode&0x08;
P14=1;P15=1;P16=1;P17=1; //列线为1,要输入
Delay(1);
sccode=P1&0xFF; //读取按键扫描码
return sccode;
}
if(IsUP)
while(recode==(P1&0x0F)) //直到按键弹起
{
P10=1;P11=1;P12=1;P13=1; //行线为1,要输入
P14=0;P15=0;P16=0;P17=0; //列线为0
Delay(1);
recode=P1&0x0F; //读取P1状态
Delay(10);
}
}
return sccode;
}
//键盘扫描程序,如果按键未按下,则一直等待,直到一个按键按下为止.
uchar KbScanUntilKeyDown(bit IsUP) // IsUP=0,只要按下即可 IsUP=1,等待弹起
{
uchar sccode,recode;
P10=1;P11=1;P12=1;P13=1; //行线为1,要输入
P14=0;P15=0;P16=0;P17=0; //列线为0
Delay(1);sccode=0;
recode=P1&0x0F; //读取P1状态
if(recode!=0) //行线有变化,说明有按键按下
{
Delay(10); //10mS延时去抖
if(recode==(P1&0x0F)) //的确有按键按下
{
P10=recode&0x01; //行线输出recode的状态
P11=recode&0x02;
P12=recode&0x04;
P13=recode&0x08;
P14=1;P15=1;P16=1;P17=1; //列线为1,要输入
Delay(1);
sccode=P1&0xFF; //读取按键扫描码
return sccode;
}
if(IsUP)
while(recode==(P1&0x0F)) //直到按键弹起
{
P10=1;P11=1;P12=1;P13=1; //行线为1,要输入
P14=0;P15=0;P16=0;P17=0; //列线为0
Delay(1);
recode=P1&0x0F; //读取P1状态
Delay(10);
}
}
return sccode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -