蓝桥杯嵌入式-按键
·
本篇文章是在蓝桥杯嵌入式-LCD完整的项目下补充完成的。如果需要代码,直接看第四部分的下载链接。
一、STM32CubMX配置

二、代码方面
2.1 task.c
2.1.1 修改位置



2.1.2 对应代码
uint8_t key_read()
{
uint8_t temp = 0;
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)
temp = 1;
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)
temp = 2;
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET)
temp = 3;
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
temp = 4;
return temp;
}
uint8_t key_val, key_down, key_up, key_old = 0;
void key_proc()
{
key_val = key_read();
key_down = key_val & (key_old ^ key_val); // 下降沿检测
key_up = ~key_val & (key_old ^ key_val); // 上升沿检测
key_old = key_val; // 存储上一次状态(用于长按检测)
}
task_t scheduler_t[] =
{
{lcd_proc, 100, 0},
{key_proc, 20, 0}
};
三、部分考点介绍
3.1 三种基本的触发方式
3.1.1 修改位置


3.1.2 对应代码
uint8_t num; //定义控制变量
void lcd_proc()
{
lcddisplay(Line1, "num:%d",num);//显示按键控制变量
}
void key_proc()
{
key_val = key_read();
key_down = key_val & (key_old ^ key_val); // 下降沿检测
key_up = ~key_val & (key_old ^ key_val); // 上升沿检测
key_old = key_val; // 存储上一次状态(用于长按检测)
if (key_down == 1) //按键 B1,按下触发
{
num++;//每按下一次,num加一
}
if (key_up == 2) //按键 B2,按下松手后触发
{
num--;//每按下一次,num减一
}
if (key_old == 3) //按键 B3,长按
{
num++;//按下期间,num不断自增
}
}
3.2 按下切换显示界面
以十五届模拟三为例:https://4t.wiki/exercise/821d37fa6ce0e02949450949fd92564a
3.2.1 修改位置



3.2.2 对应代码
uint8_t lcd_disp_mode = 0; //界面切换变量
void lcd_proc()
{
if(lcd_disp_mode == 0) //界面0
{
lcddisplay(Line1, " GOODS ");
}
else if(lcd_disp_mode == 1) //界面1
{
lcddisplay(Line1, " STANDARD ");
}
else //界面2
{
lcddisplay(Line1, " PASS ");
}
}
void key_proc()
{
key_val = key_read();
key_down = key_val & (key_old ^ key_val); // 下降沿检测
key_up = ~key_val & (key_old ^ key_val); // 上升沿检测
key_old = key_val; // 存储上一次状态(用于长按检测)
/* 界面切换 */
if(key_down == 1) //按键B1,按下触发
{
//方法1
lcd_disp_mode = lcd_disp_mode < 2 ? lcd_disp_mode + 1 : 0;// 三目运算符 构成:判定条件?真:假
//方法2
// lcd_disp_mode += 1;
// if(lcd_disp_mode == 3)
// {
// lcd_disp_mode = 0;
// }
}
}
四、其他
4.1 完整代码下载
资料下载:https://pan.quark.cn/s/08f8e6116512
更多推荐
所有评论(0)