📄 key.c
字号:
#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 + -