📄 keyscan.h
字号:
#include "cpu.h"
#define SCANTIME 217 //3ms 236 //5ms 217 //10ms 4M
#define P2 (*(0x05))
//#define MATRIX //若定义为MATRIX则为4X4键盘的扫描,否则为单个端口的扫描。
#define KeyScan() P2&0x03 //单个端口扫描语句
#define KEYCOUNT1 1 //按键按下时间计数
#define KEYINIT 0xff //这里是高四位作为按键,可根据具体情况定义。
//KeyDown 按下的键(不会自动清除,若用完后应把相应位清除)
//KeyUp 弹起的键(不会自动清除,若用完后应把相应位清除)
//KeyLast 上次键的状态
//KerPress 反应实时键的情况。
int8 KeyDown,KeyUp,KeyLast,KeyPress;
int8 KeyCount; //按键时间计数
int8 KeyCurrent,KeyOld;
/********************************************************************
函数功能:定时器0初始化,用来做键盘扫描,定时时间大约为10ms。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void InitTimer0(void)
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
clear_interrupt(INT_RTCC);
enable_interrupts(INT_RTCC);
SET_TIMER0(SCANTIME);
}
void Key_Init()
{
KeyOld=KEYINIT;
KeyLast=KEYINIT;
KeyCount=0;
KeyDown=0;
KeyUp=0;
}
void GetKey()
{
KeyCurrent=KeyScan(); //获取当前键值
if(KeyCurrent!=KeyOld) //与上一次键值不等,说明发生了改变。
{
KeyOld=KeyCurrent; //保存新键值。
KeyCount=0;
return;
}
else
{
KeyCount++;
if(KeyCount>=KEYCOUNT1) //确认为有效按键(包括空键).
{
KeyCount=KEYCOUNT1; //停止计数
KeyPress=KeyOld; //保存当前按键
KeyDown|=((~KeyPress)&KeyLast); //按下的键(不会自动清除,若用完后应把相应位清除)
KeyUp|=(KeyPress&(~KeyLast)); //弹起的键(不会自动清除,若用完后应把相应位清除)
KeyLast=KeyPress;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -