?? main.c
字號:
#include "SPCE061V004.H"
#define LOAD 0X2000//A13
#define CLK 0X4000 //A14
#define DATA 0X8000 //A15
unsigned int key_value=0; //key_value的Low~Hight=key1~key16
int initial_sys();
int get_key_value();
int delay(unsigned int);
int qudou(unsigned int ,unsigned int,unsigned int );
int main()
{
initial_sys();
while(1)
{
*P_Watchdog_Clear=1;
get_key_value();
switch(key_value)
{
case 0x7fff://鍵16按下
if(qudou(get_key_value(),0x7fff,3))
{ key16_pressed();break;}
else break;
case 0xbfff://鍵15按下
if(qudou(get_key_value(),0xbfff,30000))
{ key15_pressed();break;}
else break;
case 0xdfff://鍵14按下
if(qudou(get_key_value(),0xdfff,30000))
{ key14_pressed();break;}
else break;
case 0xefff://鍵13按下
if(qudou(get_key_value(),0xefff,30000))
{ key13_pressed();break;}
else break;
case 0xf7ff://鍵12按下
if(qudou(get_key_value(),0xf7ff,30000))
{ key12_pressed();break;}
else break;
case 0xfbff://鍵11按下
if(qudou(get_key_value(),0xfbff,30000))
{ key11_pressed();break;}
else break;
case 0xfdff://鍵10按下
if(qudou(get_key_value(),0xfdff,30000))
{ key10_pressed();break;}
else break;
case 0xfeff://鍵9按下
if(qudou(get_key_value(),0xfeff,30000))
{ key9_pressed();break;}
else break;
case 0xff7f://鍵8按下
if(qudou(get_key_value(),0xff7f,30000))
{ key8_pressed();break;}
else break;
case 0xffbf://鍵7按下
if(qudou(get_key_value(),0xffbf,30000))
{ key7_pressed();break;}
else break;
case 0xffdf://鍵6按下
if(qudou(get_key_value(),0xffdf,30000))
{ key6_pressed();break;}
else break;
case 0xffef://鍵5按下
if(qudou(get_key_value(),0x7ffef,30000))
{ key5_pressed();break;}
else break;
case 0xfff7: //鍵4按下
if(qudou(get_key_value(),0xfff7,30000))
{ key4_pressed();break;}
else break;
case 0xfffb: //鍵3按下
if(qudou(get_key_value(),0xfffb,30000))
{ key3_pressed();break;}
else break;
case 0xfffd: //鍵2按下
if(qudou(get_key_value(),0xfffd,30000))
{ key2_pressed();break;}
else break;
case 0xfffe: //鍵1按下
if(qudou(get_key_value(),0xfffe,3))
{ key1_pressed();break;}
else break;
default:break;//無鍵按下,或有多鍵按下
}
}
}
int get_key_value()
{
unsigned int i;
key_value=0;
*P_IOA_Data=*P_IOA_Data&(~LOAD);//LOAD置低
*P_IOA_Data=*P_IOA_Data|LOAD;//LOAD置高
for(i=0;i<16;i++){ //注意 datasheet上時序圖錯誤
key_value=key_value>>1; //load=H 第一位就在data線上,此時若給clk跳沿,則會使key2覆蓋key1,導致key1的丟失
if(*P_IOA_Data&0x8000)
key_value|=0x8000;
else
key_value=key_value&0x7fff;
*P_IOA_Data=*P_IOA_Data&(~CLK); //CLK置低
*P_IOA_Data=*P_IOA_Data|CLK; //CLK置高,產(chǎn)生上跳沿,把數(shù)據(jù)寫到data線上
}
return (key_value);
}
int initial_sys()
{ // A13 A14 A15
*P_IOA_Dir=0x6000;//設置A13,A14為帶數(shù)據(jù)緩存器的低電平輸出A15為帶下拉電阻的輸入引腳 dir 1 1 0
*P_IOA_Attrib=0x6000; // attrib 1 1 0
*P_IOA_Data=0x0000; // data 0 0 0
}
int delay(unsigned int delay_time)
{ int j;
for(j=0;j<delay_time;j++){}
}
int qudou(unsigned int key_value,unsigned int keycode,unsigned int delay_time)
{
delay(delay_time);
if(get_key_value()!=keycode)return(0);
else
while(1)//判斷鍵是否彈起
{*P_Watchdog_Clear=1;
if(get_key_value()!=keycode)
{ delay(delay_time);
if(get_key_value()!=keycode)
return (1);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -