?? key.h~
字號:
#define KEY_X0() {DDRE|=0X30;DDRD|=0X0C;PORTE&=0XCF;PORTD&=0XF3;} //按鍵掃描的五種輸出狀態
#define KEY_X1() {DDRE|=0X33;DDRD|=0X0C;PORTE=(PORTE&0XF3)|0X10;PORTD.2=0;PORTD.3=0;}
#define KEY_X2() {DDRE|=0X33;DDRD|=0X0C;PORTE=(PORTE&0XF3)|0X20;PORTD.2=0;PORTD.3=0;}
#define KEY_X3() {DDRE|=0X33;DDRD|=0X0C;PORTE&=0XF3;PORTD.2=1;PORTD.3=0;}
#define KEY_X4() {DDRE|=0X33;DDRD|=0X0C;PORTE&=0XF3;PORTD.2=0;PORTD.3=1;}
#define KEY_Y_IN() DDRD&=0X0F;//按鍵采集端口為輸入狀態
#define KEY_Y() PIND>>4
unsigned char key_data1; //按鍵值寄存器
unsigned char key_data2; //按鍵值寄存器
unsigned char key_data3; //按鍵值寄存器
unsigned char key_timer; //按鍵檢測用定時器
/*****************************************************************************************
按鍵掃描程序
采用矩陣掃描方法,同一行內只能有一個按鍵按下,不同行內可以有多個按鍵按下
*****************************************************************************************/
void key(void){
static unsigned char key_data1_bak=0; //按鍵值寄存器
static unsigned char key_data2_bak=0; //按鍵值寄存器
static unsigned char key_data3_bak=0; //按鍵值寄存器
unsigned char temp=0;
KEY_Y_IN()
key_data1=0;
KEY_X1()
delay_us(10);
temp=KEY_Y();
if(temp!=0){
delay_ms(10);
if(temp==KEY_Y()){
if((temp&1)!=0)key_data1=1;
else if((temp&2)!=0)key_data1=2;
else if((temp&4)!=0)key_data1=3;
else if((temp&8)!=0)key_data1=4;
}
}
else {
KEY_X2()
delay_us(10);
temp=KEY_Y();
if(temp!=0){
delay_ms(10);
if(temp==KEY_Y()){
if((temp&1)!=0)key_data1=5;
else if((temp&2)!=0)key_data1=6;
else if((temp&4)!=0)key_data1=7;
else if((temp&8)!=0)key_data1=8;
}
}
}
if(key_data1==key_data1_bak)key_data1=0; //防止一次按鍵產生多次動作
else key_data1_bak=key_data1;
KEY_X3()
delay_us(10);
temp=KEY_Y();
if(temp!=key_data2_bak){
delay_ms(10);
if(temp==KEY_Y()){
key_data2_bak=temp;
switch(temp){
case 1:
key_data2=1;
break;
case 2:
key_data2=2;
break;
case 4:
key_data2=3;
break;
case 8:
key_data2=4;
break;
}
}
}
KEY_X4()
delay_us(10);
temp=KEY_Y();
if(temp!=key_data3_bak){
delay_ms(10);
if(temp==KEY_Y()){
key_data3_bak=temp;
switch(temp){
case 1:
key_data3=1;
break;
case 2:
key_data3=2;
break;
case 4:
key_data3=3;
break;
case 8:
key_data3=4;
break;
}
}
}
KEY_X0()
}
void key_stop(void){
static unsigned char state=0;
unsigned char temp;
key_data1=0;
if(state==0){
KEY_X2()
delay_us(10);
temp=KEY_Y();
if(temp!=0){
if((temp&4)!=0){
state=1;
key_timer=0;
}
}
KEY_X0()
}
else {
if(key_timer>10){
KEY_X2()
delay_us(10);
temp=KEY_Y();
if(temp!=0){
if((temp&4)!=0){
key_data1=7;
}
}
state=0;
KEY_X0()
}
}
}
void key_start(void){
static unsigned char state=0;
unsigned char temp;
key_data1=0;
if(state==0){
KEY_X2()
delay_us(10);
temp=KEY_Y();
if((temp&2)==0){
state=1;
key_timer=0;
}
KEY_X0()
}
else {
if(key_timer>10){
KEY_X2()
delay_us(10);
temp=KEY_Y();
if((temp&2)==0)key_data1=9;
state=0;
KEY_X0()
}
}
}
/********************************************************************************
按鍵端口初始化程序
********************************************************************************/
void key_init(void){
KEY_X0()
KEY_Y_IN()
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -