⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.h

📁 本资料为基于单片机的AD按键的程序。能用单IO口实现多按键处理
💻 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 + -