📄 key.h
字号:
#ifndef __KEY_H
#define __KEY_H
#include <delay.h>
#define AD_IN PINA.0
#define AD_DDR DDRA.0
#define AD_PORT PORTA.0
#define PLAY_PAUSE 0x01 //播放暂停
#define SONG_UP 0x02 //上一首
#define SONG_NEXT 0x04 //下一首
#define VOL_UP 0x08 //音量+
#define VOL_DOWN 0x10 //音量-
#define MENU 0x20 //菜单
#define FORWARD 0x82
#define BACKUP 0x84
volatile uchar KeyCurrent_check,KeyOld_check,; //当前检测到的键值、
//上一次检测到的键值、键值不变时间,长按计时。
volatile uchar KeyEffect,KeyCurrent,ShortKey,LongKey;
uchar KeyNoChangedTime,KeyNoChangeLongTime,KeyOffTime;
volatile uchar KeyCanChange;
void key_port()
{
AD_DDR=0;
AD_PORT=0; //PA0为AD输入口,设为不带上拉的输入方式.
}
unsigned char read_key()
{
uint tmp;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
tmp=(unsigned long)ADCW*3300/1024;
if(tmp>3021)
return PLAY_PAUSE;
else if(tmp>2464 && tmp<2750)
return SONG_UP;
else if(tmp>1909 && tmp<2200)
return SONG_NEXT;
else if(tmp>1362 && tmp<1650)
return VOL_UP;
else if(tmp>817 && tmp<1100)
return VOL_DOWN;
else if(tmp>400 && tmp<570)
return MENU;
else
return 0;
}
Timer0ForKeyScan_init() //5ms中断一次
{
TCCR0=0x0d;
TCNT0=0x00;
OCR0=0xff;
TIMSK=0x02;
#asm("sei")
KeyCurrent_check=0;
KeyOld_check=0;
KeyNoChangedTime=0;
KeyEffect=0;
KeyCurrent=0;
KeyCanChange=1;
KeyNoChangeLongTime=0;
ShortKey=0;
LongKey=0;
KeyOffTime=0;
}
interrupt [TIM0_COMP] void timer0_keyprocess(void)
{
if(!KeyCanChange) return;
KeyCurrent_check=read_key();
if(KeyCurrent_check!=KeyOld_check) //说明按键情况发生了改变
{
KeyOld_check=KeyCurrent_check; //保存当前按键情况
if(KeyCurrent_check==0 && KeyOffTime>=2)
{
if(ShortKey==1 && LongKey==0)
{
KeyEffect=KeyCurrent;
KeyOffTime=0;
ShortKey=0;
KeyOffTime=0;
}
LongKey=0;
}
else
{
KeyEffect=0;
// KeyOffTime=0;
}
KeyNoChangedTime=0; //键盘按下时间为0
KeyNoChangeLongTime=0;
}
else
{
KeyNoChangedTime++;
if(KeyNoChangedTime>=5) //如果按下时间足够
{
KeyNoChangedTime=0;
KeyNoChangeLongTime++;
KeyCurrent=KeyOld_check; //保存按键
ShortKey=1;
if(KeyCurrent==0)
{
KeyOffTime++;
if(KeyOffTime>=2)
KeyOffTime=2;
}
if((KeyCurrent==SONG_UP || KeyCurrent==SONG_NEXT) && KeyNoChangeLongTime>=5)
{
KeyNoChangeLongTime==0;
KeyEffect=0x80|KeyCurrent;
ShortKey=0;
LongKey=1;
KeyOffTime=0;
}
else
KeyEffect=0;
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -