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

📄 key.c

📁 台湾凌阳单片机SPCE061A单芯片做的一个带按健LCD显示
💻 C
字号:
#include    "spce061v004.h"

/*
   IOA8-IOA11 为上拉输出。
   IOA12-IOA15为上拉输入。
      0 |  1 |   2|    3|
IO8  --------------------------
      4 |  5 |  6 |    7|
IO9  --------------------------
      8 |  9 | Esc|   OK|
IO10 --------------------------
      up|down| v+ |   v-|
IO11 --------------------------
        |    |    |     |
IO12 ---     |    |     |
             |    |     |
IO13 --------     |     |
                  |     |
IO14 ------------       |
                        |
1O15 -------------------
   
   
   
   
*/

#define  Key_Out_1    0x0100   //IO8
#define  Key_Out_2    0x0200   //IO9
#define  Key_Out_3    0x0400   //IO10
#define  Key_Out_4    0x0800   //IO11

#define  Key_In_1    0x1000    //IO12
#define  Key_In_2    0x2000    //IO13
#define  Key_In_3    0x4000    //IO14
#define  Key_In_4    0x8000    //IO15

#define  Key_Out_1_bit(x)    *P_IOA_Data=(x==1)?*P_IOA_Data|Key_Out_1:*P_IOA_Data&(~Key_Out_1)
#define  Key_Out_2_bit(x)    *P_IOA_Data=(x==1)?*P_IOA_Data|Key_Out_2:*P_IOA_Data&(~Key_Out_2)   
#define  Key_Out_3_bit(x)    *P_IOA_Data=(x==1)?*P_IOA_Data|Key_Out_3:*P_IOA_Data&(~Key_Out_3)
#define  Key_Out_4_bit(x)    *P_IOA_Data=(x==1)?*P_IOA_Data|Key_Out_4:*P_IOA_Data&(~Key_Out_4)

unsigned int   key_code=0,key,key_buffer_qian;
unsigned int   key_buffer_bai,key_buffer_shi,key_buffer_ge;   //安键
unsigned int   key_buffer_qian_flag=0,key_buffer_bai_flag=0;
unsigned int   key_buffer_shi_flag=0,key_buffer_ge_flag=0;
unsigned int   volume,play_flag=0; //  resume  or pause or  play;
extern  unsigned int status;
void Key_Scan_Init(void)
{
  unsigned int temp;
  temp=*P_IOA_Attrib;
  temp&=0x0fff;
  temp|=0x0f00;
  *P_IOA_Attrib=temp;
  temp=*P_IOA_Dir;
  temp&=0x0fff;
  temp|=0x0f00;
  *P_IOA_Dir=temp;
  temp=*P_IOA_Data;
  temp|=0xff00;
  *P_IOA_Data=temp;
}
unsigned int Press_Key()
{
  unsigned int temp; 
  
  temp=*P_IOA_Data;
  temp&=0xf0ff;           //all out pins ==0
  *P_IOA_Data=temp;
  
  temp=*P_IOA_Data; 
  if((temp&0xf000)==0xf000)  return 0;  // no press
 // delay(100);
  temp=*P_IOA_Data;
  if((temp&0xf000)==0xf000)  return 0;  // no press
  return 1;
    
}
unsigned int Get_Key()
{ 
  unsigned int buffer_high,buffer_low;
  unsigned int temp;
  temp=*P_IOA_Data;
  temp|=0x0f00;           //all out pins ==1
  *P_IOA_Data=temp;
  
  Key_Out_1_bit(0);       //Key_Out_1_bit=0;
  buffer_low=Key_Out_1;
  buffer_high=(*P_IOA_Data)&0xf000;
  if(buffer_high!=0xf000)  goto  semsum;
  
  Key_Out_2_bit(0);       //Key_Out_2_bit=0;
  buffer_low=Key_Out_2;
  buffer_high=(*P_IOA_Data)&0xf000;
  if(buffer_high!=0xf000)  goto  semsum;
  
  Key_Out_3_bit(0);       //Key_Out_3_bit=0;
  buffer_low=Key_Out_3;
  buffer_high=(*P_IOA_Data)&0xf000;
  if(buffer_high!=0xf000)  goto  semsum;
  
  Key_Out_1_bit(0);       //Key_Out_4_bit=0;
  buffer_low=Key_Out_4;
  buffer_high=(*P_IOA_Data)&0xf000;
  if(buffer_high!=0xf000)  goto  semsum;
semsum:  
   while(((*P_IOA_Data)&0xf000)!=0xf000);
   temp=buffer_high|buffer_low; 
   return(temp);    
}

delay(unsigned int miao)
{  
  unsigned int a;
   for(a=0;a<miao;a++)
     {
        *P_Watchdog_Clear=0x01;
        F_Delay_Program_Time();//3MS
     }  
}   
key_do(unsigned int key_zhi)
{     
                  key_buffer_qian=key_buffer_bai; 
		                key_buffer_bai=key_buffer_shi;
		                key_buffer_shi=key_buffer_ge;
		                key_buffer_ge=key_zhi;
		             key_code=key_buffer_qian*1000+
		                      key_buffer_bai *100 +
		                      key_buffer_shi *10  +
		                      key_buffer_ge;		                
		             show_lcd(key_code);
		             play_flag=1;
		          
}
clr_key_buffer()
{
    key_buffer_qian=0;
     key_buffer_bai=0;
     key_buffer_shi=0;
     key_buffer_ge=0;
}
lcd_clr()
 {          
                       key_buffer_qian=key_buffer_bai; 
		                key_buffer_bai=key_buffer_shi;
		                key_buffer_shi=key_buffer_ge;
		                 key_buffer_ge=0;
		             key_code=key_buffer_qian*1000+
		                      key_buffer_bai *100 +
		                      key_buffer_shi *10  +
		                      key_buffer_ge;		                
		             show_lcd(key_code);
		            
}      
 
add_key()
 {   
    unsigned int temp;
      key=0xffff;
      Key_Scan_Init();
     if(Press_Key())
     {
        key=Get_Key();
        switch (key)
		  {  case 0xffff: break; 
		     case 0xe100:	               //0	 
		          key_do(0);    
		          break;
		     case 0xd100:		           //1 
		          key_do(1);
		          break;
		     case 0xb100:		           //2   0xb100
		          key_do(2);
		          break;
		     case 0x7100:		           //3
		          key_do(3);
		          break;
		     case 0xe200:		           //4
		          key_do(4);
		          break;
		     case 0xd200:		           //5
		          key_do(5);
		          break;
		     case 0xb200:		           //6
		          key_do(6);
		          break;
		     case 0x7200:		           //7
		          key_do(7);
		          break;      
		     case 0xe400:		           //8
		          key_do(8);
		          break;       
		     case 0xd400:		           //9
		          key_do(9);
		          break;       
		     case 0xb400:		           //ESC
		                key_buffer_ge=key_buffer_shi; 
		                key_buffer_shi=key_buffer_bai;
		                key_buffer_bai=key_buffer_qian;
		                key_buffer_qian=0;
		                key_code=key_buffer_qian*1000+
		                      key_buffer_bai *100 +
		                      key_buffer_shi *10  +
		                      key_buffer_ge;		                
		               show_lcd(key_code);
		               play_flag=1;
		               delay(600);
		          break;  
		     case 0xe800:		           //up
		          key_code--;
		          show_lcd(key_code);
		          play_flag=1;
		          delay(600);
		          break;      
		     case 0xd800:		           //down
		          key_code++;
		          show_lcd(key_code);
		          play_flag=1;
		          delay(600);
		          break;   
		     case 0x7800:		           //v-
		          if(volume > 0)
                    volume--;
                  SACM_A2000_Volume(volume);
                  delay(600);
		          break; 
		     case 0xb800:		           //v++
		          volume++;
		          if(volume>15)
		             volume=15;
		          SACM_A2000_Volume(volume);
		          delay(600);
		          break;   
		     case 0x7400: 
		            delay(600);
		            if(play_flag==0)
		                { if(status==1)      // playing or no playing
		                       { 
		                        SACM_A2000_Pause();
		                         status=0;
		                       }
		                   else
		                       { 
		                         SACM_A2000_Resume();
		                          status=1;
		                       }
		                 }
		                else 
		                  {
		                    play_flag=0;
		                    if(key_code==0)  
		                         play(0);
	                          else
	                            {
	                              SACM_A2000_Stop(); 
	                              if(key_code>=F_FlashRead(0xfe00))   //over index
	                                 { 
	                                   key_code=F_FlashRead(0xfe00)-1;
	                                    show_lcd(key_code);
	                                  }
	                              temp=F_FlashRead(0xfe00+key_code);
	                              play(temp+1);
	                            }
	                       }
	                 break;
	            default:break;
	        }
	  }
}	                                

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -