📄 key.c.bak
字号:
#include "AT89X52.H"
sbit CLOCK=P3^5;
int K1ST=0;
int K2CD=0;
int longkey=0;
sbit OUT0=P1^0;
sbit OUT1=P1^1;
sbit OUT2=P1^2;
sbit OUT3=P1^3;
sbit IN0=P1^4;
sbit IN1=P1^5;
sbit IN2=P1^6;
sbit IN3=P1^7;
sbit IN4=P3^7;
unsigned char KeyCode;
/*-------------------------------------*/
// 函数名:KeyOn
// 功 能:检测是否有键按下
// 参 数:无
// 返回值:1:有键按下
// 0:无键按下
/*-------------------------------------*/
int KeyOn()
{
int i;
int key0;
char key1;
// P3=0x7F;
P1=0xF0;
key0=P1;
key0=key0&0x00F0;
IN4=1;
key1=IN4;
key1=key1&0x01;
if(key0==0xF0&&key1==0x01)
return 0;
else return 1;
}
/*-------------------------------------*/
// 函数名:init_timer0
// 功 能:初始化时钟中断0,同时开启
// 时钟中断
// 参 数:无
// 返回值:无
/*-------------------------------------*/
void init_timer0(void)
{
TMOD&=0xF0;
TMOD|=0x1;
TL0=0xF0;
TH0=0xD8;
ET0=1;
TR0=1;
PT0=1;
EA=1;
}
/*-------------------------------------*/
// 函数名:timer_isr
// 功 能:时钟中断0的中断服务程序
// 当计数到某一值时,执行该程序
// 主要功能是:每10ms检测一次键盘的状态
// 如果同时两个10ms都有按键按下。则说明
// 确实有按键按下,然后检测键码值,并输出
// 该键码的码值到P3口,然后产生一个窄脉冲
// 用于作为主机的外部中断源,读取P3口键码
// 参 数:无
// 返回值:无
/*-------------------------------------*/
timer_isr()interrupt 1
{
unsigned char keynum;
int i;
EA=0;
TL0=0xF0;
TH0=0xD8;
if(KeyOn()==1)
{
if(K1ST==1)
{
if(K2CD==0)
{
K2CD=1;
//第一列
P1=0xFE;
keynum=IN0;
if(keynum==0)
{
KeyCode=1;
P3=0xE1;
}
keynum=IN1;
if(keynum==0)
{
KeyCode=5;
P3=0xE5;
}
keynum=IN2;
if(keynum==0)
{
KeyCode=9;
P3=0xE9;
}
keynum=IN3;
if(keynum==0)
{
KeyCode=13;
P3=0xEd;
}
IN4=1;
keynum=IN4;
if(keynum==0)
{
KeyCode=17;
P3=0xF1;
}
//The second column
P1=0xFD;
keynum=IN0;
if(keynum==0)
{
KeyCode=2;
P3=0xE2;
}
keynum=IN1;
if(keynum==0)
{
KeyCode=6;
P3=0xE6;
}
keynum=IN2;
if(keynum==0)
{
KeyCode=10;
P3=0xEA;
}
keynum=IN3;
if(keynum==0)
{
KeyCode=14;
P3=0xEE;
}
IN4=1;
keynum=IN4;
if(keynum==0)
{
KeyCode=18;
P3=0xF2;
}
//The third column
P1=0xFB;
keynum=IN0;
if(keynum==0)
{
KeyCode=3;
P3=0xE3;
}
keynum=IN1;
if(keynum==0)
{
KeyCode=7;
P3=0xE7;
}
keynum=IN2;
if(keynum==0)
{
KeyCode=11;
P3=0xEB;
}
keynum=IN3;
if(keynum==0)
{
KeyCode=15;
P3=0xEF;
}
IN4=1;
keynum=IN4;
if(keynum==0)
{
KeyCode=19;
P3=0xF3;
}
//The fourth column
P1=0xF7;
keynum=IN0;
if(keynum==0)
{
KeyCode=4;
P3=0xE4;
}
keynum=IN1;
if(keynum==0)
{
KeyCode=8;
P3=0xE8;
}
keynum=IN2;
if(keynum==0)
{
KeyCode=12;
P3=0xEC;
}
keynum=IN3;
if(keynum==0)
{
KeyCode=16;
P3=0xF0;
}
IN4=1;
keynum=IN4;
if(keynum==0)
{
KeyCode=20;
P3=0xF4;
}
for(i=1;i<10;i++)
CLOCK=0;
CLOCK=1;
}
else longkey++;
if(longkey==150)
{
longkey=0;
if(KeyCode==10)
{
P3=0xFE;
for(i=1;i<10;i++)
CLOCK=0;
CLOCK=1;
}
}
}
else K1ST=1;
}
else
{
K1ST=0;
K2CD=0;
}
EA=1;
}
/*-------------------------------------*/
// 函数名:main
// 功 能:主函数,初始化10ms定时时钟,用于
// 键盘的检测
// 参 数:
// 返回值:1:有键按下
// 0:无键按下
/*-------------------------------------*/
void main()
{
int keyon;
init_timer0();
P3=0xFF;
// P3=0x7F;
P1=0xFF;
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -