📄 keyboard.c
字号:
#include "ATMEL89X51.H"
#define LED_SET P2_6 //使能LED灯端口
#define KEY_data P1 //设定P1口为按键输出端口
#define LED_data P0 //设定P0口为数据输入端口
#define ON 0 //设0为开
#define OFF 1 //设1为关
unsigned char key_velual;
unsigned char key_flag=0;
void delay(unsigned char temp)//延时函数
{
unsigned char i;
for(i=0;i<temp;i++);
}
void Read_key_code(void)
{
KEY_data |= 0x0f; //把所有的按键端口置1,等待按键按下
if(key_flag==0)
{
if((KEY_data & 0x0f) != 0x0f) //防抖动
{
KEY_data |= 0x0f;
delay(10);
if((KEY_data&0x0f) != 0x0f) //判断是否有键按下
{
key_velual = KEY_data & 0x0f;//读键值
key_flag=1; //按键标志位置1
}
}
}
else if(key_flag!=0)
{
key_velual=0; //键值清零
if((KEY_data & 0x0f) == 0x0f)
key_flag=0; //清按键标志位
}
}
void Key_set(unsigned char sw) //按键判断程序
{
switch(sw)
{
case 0x07: LED_data = 0x08; break; //S5被按下,对应的D18亮
case 0x0b: LED_data = 0x04; break; //S4被按下,对应的D17亮
case 0x0d: LED_data = 0x02; break; //S3被按下,对应的D16亮
case 0x0e: LED_data = 0x01; break; //S2被按下,对应的D15亮
default: break;
}
}
void time_interrupt_init(void) //定时器初始化,50mS
{
TMOD = 0x01;
TH0 = -(50000/256);
TL0 = -(50000%256);
ET0 = 1;
TR0 = 1;
EA = 1;
}
void time0(void) interrupt 1 //设定定时器按键扫描,50mS
{
TH0 = -(50000/256);
TL0 = -(50000%256);
Read_key_code(); //读键值
Key_set(key_velual); //判断键值
}
main()
{
LED_SET = ON; //选通LED灯端口
LED_data = 0;
time_interrupt_init();
while(1)
{
Key_set(key_velual);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -