📄 key.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 + -