本篇文章是在蓝桥杯嵌入式-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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐