📄 keyscan.c
字号:
#include "SYS_Config.h"
#include "KeyScan.h"
/****************************************************************************
* KeyScan - 键盘扫描函数
* 判4个按键那个有按下
* @Return :有按键 返回键值 无按键 返回FALSE 因此键值定义不能为FALSE
*****************************************************************************/
//ICC-AVR application builder : 2008-5-20 上午 09:01:00
// Target : M64
// Crystal: 16.000Mhz
// TIMER0 initialize - prescale:1024
// WGM: Normal
// desired value: 10mSec
// actual value: 9.984mSec (0.2%)
void timer0_init(void)
{
Key0_IN();
Key1_IN();
Key2_IN();
Key3_IN();
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0x64; //set count
OCR0 = 0x9C;
TCCR0 = 0x07; //start timer
TIMSK|= 0x01; //timer interrupt sources
}
INT8U Keyvalue=0;
INT8U Key_Deal_Flag=0;
INT8U Keyvalue_first,Keyvalue_second;
INT8U Count0=0,Key_time=0;
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 = 0x64; //reload counter value
Count0++;
if(Count0==1)
{
Keyvalue_first=Key_STATUS();
if(Keyvalue_first==0x0F)
Count0=0;
}
if(Count0>=15)//隔140ms再来检测一次
{
Count0=0;
Keyvalue_second=Key_STATUS();
if(Keyvalue_first==Keyvalue_second)//如果相等,则为有效按键
{
Key_Deal_Flag=1;
switch(Keyvalue_first)
{
case 0x0E:Keyvalue=Key_Up; break;
case 0x0D:Keyvalue=Key_Right;break;
case 0x0B:Keyvalue=Key_Left; break;
case 0x07:Keyvalue=Key_Down; break;
default: Keyvalue=FALSE ; break;//同时有两个以上按键,视为无效
}
}
}
if( (Keyvalue==Keyvalue_first)&&(Keyvalue==Keyvalue_second) )
{//如果长时间按,则Key_time累加,程序判断Key_time大于某个值就知道长时间按了
if(Key_time<255)
Key_time++;
}
else
{
Key_time=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -