【蓝桥杯嵌入式(二)Led、Key、Lcd】

五、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);

在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值