if (KEY0 == 0) keyval = KEY0_PRES; if (KEY1 == 0) keyval = KEY1_PRES; if (KEY2 == 0) keyval = KEY2_PRES; if (WK_UP == 1) keyval = WKUP_PRES;
时间: 2023-08-28 13:03:54 浏览: 52
这段代码是一个简单的按键检测逻辑。它通过检测不同的按键状态来确定keyval的值。
首先,它检测KEY0按键是否被按下,如果是,则将keyval赋值为KEY0_PRES。
接着,它检测KEY1按键是否被按下,如果是,则将keyval赋值为KEY1_PRES。
然后,它检测KEY2按键是否被按下,如果是,则将keyval赋值为KEY2_PRES。
最后,它检测WK_UP按键是否被释放(状态为1),如果是,则将keyval赋值为WKUP_PRES。
这段代码的作用是检测按键状态,并根据不同的按键状态来确定keyval的值,以便后续的处理。在实际应用中,可能会根据keyval的值执行相应的操作,比如触发某个功能或执行特定的代码逻辑。
相关问题
帮我完善以下代码 void Check_Key(void) { unsigned char row, col; unsigned int KEY_DOUT,tmp1, tmp2; tmp1 = 0x0800; for(row=0; row<4; row++) //行扫描 { KEY_DOUT = 0X0f00; //输出全为1 KEY_DOUT-= tmp1; //依次输出一个为0 GPIOD->ODR=((GPIOD->ODR&0xf0ff)|KEY_DOUT); tmp1 >>=1; if((GPIO_ReadInputData(GPIOD)&0xf000)<0xf000) //if((KEY_DIN & 0xF0) < 0xF0) //P2输入是否有一位为0 { tmp2 = 0x1000; //用于检测出哪一位为0 for(col=0; col<4; col++) //列扫描 { if(0x00 == (GPIO_ReadInputData(GPIOD) & tmp2)) //找到等于0的列 { key_val = key_Map[row*4 + col];//获取键值 return; //退出循环 } tmp2 <<= 1; //右移1位 } } } } void Key_Event(void) { unsigned int tmp; GPIOD->ODR=((GPIOD->ODR&0xf0ff)|0x0000); tmp = GPIO_ReadInputData(GPIOD); if ((0x00 == key_Pressed) && ((tmp & 0xF000) < 0xF000)) //如果有键按下 { key_Pressed = 1; //按键按下标识位置位 delay_ms(10); //延时去抖 Check_Key(); //获取键 // key_flag = 1; //按键标识置位 } else if ((key_Pressed == 1)&&((tmp & 0xf000) == 0xF000)) //如果按键释放 { key_Pressed = 0; //清除标识位 key_flag = 1; //按键标识位置位 } else { delay_ms(1); } } u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10);//去抖动 key_up=0; if(KEY0==0)return KEY0_PRES; else if(KEY1==0)return KEY1_PRES; else if(WK_UP==1)return WKUP_PRES; }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; return 0;// 无按键按下 }
这段代码是用于扫描矩阵键盘的,具体是通过扫描行列来判断按键是否按下。
下面是完善后的代码:
```c
#define KEY0 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) //PA0
#define KEY1 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) //PC13
#define WK_UP GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) //PA2
void Check_Key(void) {
unsigned char row, col;
unsigned int KEY_DOUT,tmp1, tmp2;
tmp1 = 0x0800;
for(row=0; row<4; row++) //行扫描
{
KEY_DOUT = 0X0f00; //输出全为1
KEY_DOUT-= tmp1; //依次输出一个为0
GPIOD->ODR=((GPIOD->ODR&0xf0ff)|KEY_DOUT);
tmp1 >>=1;
if((GPIO_ReadInputData(GPIOD)&0xf000)<0xf000) //如果有键按下
{
tmp2 = 0x1000; //用于检测出哪一位为0
for(col=0; col<4; col++) //列扫描
{
if(0x00 == (GPIO_ReadInputData(GPIOD) & tmp2)) //找到等于0的列
{
key_val = key_Map[row*4 + col];//获取键值
return; //退出循环
}
tmp2 <<= 1; //右移1位
}
}
}
}
void Key_Event(void) {
static u8 key_Pressed = 0; //按键按下标识
unsigned int tmp;
GPIOD->ODR=((GPIOD->ODR&0xf0ff)|0x0000);
tmp = GPIO_ReadInputData(GPIOD);
if ((key_Pressed == 0) && ((tmp & 0xF000) < 0xF000)) //如果有键按下
{
key_Pressed = 1; //按键按下标识位置位
delay_ms(10); //延时去抖
Check_Key(); //获取键
}
else if ((key_Pressed == 1)&&((tmp & 0xf000) == 0xF000)) //如果按键释放
{
key_Pressed = 0; //清除标识位
key_flag = 1; //按键标识位置位
}
else {
delay_ms(1);
}
}
u8 KEY_Scan(u8 mode) {
static u8 key_up = 1; //按键按松开标志
if (mode) key_up = 1; //支持连按
if (key_up == 1) {
if (KEY0 == 0) {
delay_ms(10); //去抖动
key_up = 0;
return KEY0_PRES;
}
else if (KEY1 == 0) {
delay_ms(10); //去抖动
key_up = 0;
return KEY1_PRES;
}
else if ((WK_UP == 1) && (mode == 1)) {
delay_ms(10); //去抖动
key_up = 0;
return WKUP_PRES;
}
}
else if ((KEY0 == 1) && (KEY1 == 1) && (WK_UP == 0)) {
key_up = 1;
}
return 0;
}
```
主要改进如下:
1. 定义了按键的读取宏,方便代码的维护。
2. 在Key_Event函数中,增加了按键按下标识,方便检测是否有按键按下。
3. 在KEY_Scan函数中,增加了按键按松开标志,以及支持连按功能。
4. 在KEY_Scan函数中,去掉了mode参数对按键的限制,即使mode=0,仍然可以检测WK_UP按键。
5. 在KEY_Scan函数中,增加了对按键的去抖处理,避免误判。
优化void delay(uint t){ uchar i; do{ i = 200; while(--i); }while(--t);}uchar KeyBoard_matrix(){ uchar val_key=255; P1=0x0F; delay(1); if(P1!=0x0F) { //扫描第一行,如行列方向选择则高低位对调 P1=0xEF; delay(10); if( (P1&0x0F) == 0x0E){ val_key=0; } if( (P1&0x0F) == 0x0D){ val_key=1; } if( (P1&0x0F) == 0x0B){ val_key=2; } if( (P1&0x0F) == 0x07){ val_key=3; } //扫描第二行 P1=0xDF; delay(10); if( (P1&0x0F) == 0x0E){ val_key=4; } if( (P1&0x0F) == 0x0D){ val_key=5; } if( (P1&0x0F) == 0x0B){ val_key=6; } if( (P1&0x0F) == 0x07){ val_key=7; } //扫描第三行 P1=0xBF; delay(10); if( (P1&0x0F) == 0x0E){ val_key=8; } if( (P1&0x0F) == 0x0D){ val_key=9; } if( (P1&0x0F) == 0x0B){ val_key=10; } if( (P1&0x0F) == 0x07){ val_key=11; } //扫描第四行 P1=0x7F; delay(10); if( (P1&0x0F) == 0x0E){ val_key=12; } if( (P1&0x0F) == 0x0D){ val_key=13; } if( (P1&0x0F) == 0x0B){ val_key=14; } if( (P1&0x0F) == 0x07){ val_key=15; } } return val_key;}
&0x0F) != 0x0F ){switch(P1&0x0F){case 0x07:val_key=0;break;case 0x0B:val_key=1;break;case 0x0D:val_key=2;break;case 0x0E:val_key=3;break;default:break;}}P1=0xF7;delay(10);if( (P1&0x0F) != 0x0F ){switch(P1&0x0F){case 0x07:val_key=4;break;case 0x0B:val_key=5;break;case 0x0D:val_key=6;break;case 0x0E:val_key=7;break;default:break;}}P1=0xFB;delay(10);if( (P1&0x0F) != 0x0F ){switch(P1&0x0F){case 0x07:val_key=8;break;case 0x0B:val_key=9;break;case 0x0D:val_key=10;break;case 0x0E:val_key=11;break;default:break;}}P1=0xFD;delay(10);if( (P1&0x0F) != 0x0F ){switch(P1&0x0F){case 0x07:val_key=12;break;case 0x0B:val_key=13;break;case 0x0D:val_key=14;break;case 0x0E:val_key=15;break;default:break;}}P1=0xFF;}return val_key;}
这段代码是用来读取键盘矩阵的。优化的话可以将重复的代码部分提取出来,减少代码量,提高可读性和可维护性。例如,可以将扫描矩阵的代码封装成一个函数,传入参数即可扫描对应的行或列。另外,可以考虑使用数组来存储键盘矩阵的值,这样可以更方便地进行处理和调用。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)