本文主要是介绍【蓝桥杯嵌入式(二)Led、Key、Lcd】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
蓝桥杯嵌入式(二)Led、Key、Lcd
- 五、Led模块
- 1.原理图配置
- 2. 知识点
- 3.底层代码
- 六、Key模块
- 1.原理图配置
- 2.知识点
- 3.底层代码
- 底层代码(四⾏代码版本)
- 底层代码(状态机版本)
- 七、LCD模块
- 1.原理图配置
- 2.知识点
- 底层代码
五、Led模块
1.原理图配置
2. 知识点
链接: 上拉电阻的通俗解释
链接: 单⽚机怎么输出⾼电平!推挽输出和开漏输出最本质的区别?
3.底层代码
#include "led_app.h"uint8_t ucled[8] = {1,0,1,0,1,0,1,0};void led_disp(uint8_t *ucLed)
{uint8_t temp = 0x00;static uint8_t temp_old = 0xff;for(int i=0;i<8;i++){temp |=(ucLed[i]<<(7-i));}if (temp != temp_old){GPIOC->ODR &= 0x00ff;GPIOC->ODR |= ~(temp<<8);GPIOD->BSRR |= 0x01 << 2; GPIOD->BRR |= 0x01 << 2; temp_old = temp; }
}void led_proc(void)
{led_disp(ucled);
}
六、Key模块
1.原理图配置
这里接VDD,所以是下面配置是上拉电阻;
如果是GND,则为下拉电阻
2.知识点
3.底层代码
底层代码(四⾏代码版本)
#include "key_app.h"uint8_t key_val = 0; // 当前按键状态
uint8_t key_old = 0; // 前一按键状态
uint8_t key_down = 0; // 按下的按键
uint8_t key_up = 0; // 释放的按键/*** @brief 读取按键状态* * 该函数读取连接在 GPIO 引脚上的按键状态,并返回相应的按键编号。* * @return 返回按键编号。0 表示没有按键按下,1-4 表示对应的按键被按下。*/
uint8_t key_read(void)
{// 用于存储按键状态的临时变量uint8_t temp = 0;// 检查 GPIOB 引脚 0 的状态if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) temp = 1; // 如果引脚状态为 RESET,则按键 1 被按下// 检查 GPIOB 引脚 1 的状态if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET) temp = 2; // 如果引脚状态为 RESET,则按键 2 被按下// 检查 GPIOB 引脚 2 的状态if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET) temp = 3; // 如果引脚状态为 RESET,则按键 3 被按下// 检查 GPIOA 引脚 0 的状态if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) temp = 4; // 如果引脚状态为 RESET,则按键 4 被按下// 返回检测到的按键编号return temp;
}/*** @brief 按键处理函数* * 该函数用于扫描按键的状态,并更新按键按下和释放的标志*/
void key_proc(void)
{// 读取当前按键状态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 != 0)ucled[key_down] ^= 1;
}
底层代码(状态机版本)
七、LCD模块
1.原理图配置
2.知识点
底层代码
PS:注意要包含官方的lcd.c,lcd.h,fonts.h
#include "lcd_app.h"void LcdSprintf(uint8_t Line, char *format,...)
{char String[21]; // 缓冲区用于存储格式化后的字符串//长度是20,还有一个截止符va_list arg; // 参数列表用于存储可变参数va_start(arg, format); // 使用格式化字符串初始化参数列表vsprintf(String, format, arg); // 格式化字符串并存储在缓冲区中va_end(arg); // 清理参数列表LCD_DisplayStringLine(Line,(u8 *)String); // 在LCD的指定行显示格式化后的字符串
}uint8_t count = 0;void lcd_proc(void)
{LcdSprintf(Line0,"Test LCD App");LcdSprintf(Line1,"Count: %d",count);count++;
}
LCD_Init();
LCD_Clear(Black);
LCD_SetTextColor(White);
LCD_SetBackColor(Black);
这篇关于【蓝桥杯嵌入式(二)Led、Key、Lcd】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!