📄 key.c
字号:
#include <LPC23xx.H>
#include "type.h"
#include "Key.h"
#include "irq.h"
enum KEY_SCAN_STATUS
{
NO_KEY,
KEY_SCAN_ENTER,
KEY_SCAN_REALEASE
};
enum KEY_SCAN_STATUS key_scan_status;
enum KEY_STATUS key_Status;
unsigned char key_scan_flag=0;
unsigned int key_counter=0; //按键按下时的时间计数器
unsigned char key_value=0; //保存按键值
void Timer3_Handler(void) __irq
{
unsigned char temp=0;
temp=T3IR; // 清除CAP1.0中断标志
T3IR|=MCR0_INT;
if(Read_Key()==0x0F)
{
key_scan_flag=0; //按键释放或者无键按下
}
else
{
key_value=Read_Key();
key_counter++;
key_scan_flag=1; //有键按下
}
temp++;
VICVectAddr = 0x00; // 向量中断处理结束
}
void Init_Timer3()
{
key_scan_flag=0;
key_value=0; //保存按键值
key_counter=0; //作为按键计数器
PCONP |= (1 << 23) ; // Enable clock to the peripheral
T3TCR=0; //定时器1禁能
T3PR=0x05; //把PCLK六分频,f=2M
T3MR0 = FPCLK_TIME/100; //每10ms中断一次
T3CTCR=0; //CAP1。0用于定时器1的定时器模式
install_irq( TIMER3_INT, (void *)Timer3_Handler, LOWEST_PRIORITY );
T3MCR = 3;
T3TCR = 1; //定时器1使能
}
//读取键盘值,没有键按下时 ,返回0xF0
unsigned char Read_Key()
{
unsigned char key_value=0xff;
key_value=((FIO1PIN3)&0x0F);
return key_value;
}
void Key_Scan()
{
switch(key_scan_status)
{
case NO_KEY:
if(key_scan_flag==1)
{
key_scan_status=KEY_SCAN_ENTER;
key_counter=0;
}
break;
case KEY_SCAN_ENTER:
if(key_scan_flag==0)
{
key_scan_status=KEY_SCAN_REALEASE;
}
break;
case KEY_SCAN_REALEASE:
if(key_counter>=6) //当按键》=60ms时,认为是一次真实的按键
{
switch(key_value)
{
case 0x0E:
key_Status=KEY_ENTER;
break;
case 0x0D:
key_Status=KEY_RIGHT;
break;
case 0x0B:
key_Status=KEY_UP;
break;
case 0x07:
key_Status=KEY_ESC;
break;
}
}
else
{
key_counter=0;
}
key_scan_status=NO_KEY;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -