这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】ACM32F070开发板点亮LCD屏和触控按键,串口,AD

共5条 1/1 1 跳转至

【换取手持数字示波器】ACM32F070开发板点亮LCD屏和触控按键,串口,ADC

工程师
2024-04-19 20:18:30   被打赏 40 分(兑奖)     打赏

ACM32F070开发板是一款功能强大的MCU开发板,支持多种外设接口,包括LCD屏、触控按键、串口和ADC等。下面我将为你提供关于如何使用ACM32F070开发板点亮LCD屏、实现触控按键功能、串口通信以及ADC(模数转换器)的基本步骤和注意事项。

串口原理连接:

串口连接是通过YTPE C接口与PC连接,板载上与ACH512再经过SED这个排针端子,再接到MCU PA2(TX2) PA3(RX2).

image.pngMCU引脚连接处:

image.png

ACM32F070开发板与SHT30温湿度传感器之间的连接,通过MCU的PD6和PD7接口实现,是一个常见的硬件配置。SHT30传感器以其高精度的温度和湿度测量能力而著称,其中温度精度可达正负0.3摄氏度,湿度精度为正负2%。这样的精度对于许多应用来说都是足够的,尤其是在需要精确环境监控的场合。

SHT30传感器采用IIC(Inter-Integrated Circuit,集成电路总线)通信协议进行数据传输,这是一种串行通信协议,特别适用于集成电路之间的通信。IIC通信协议的优势在于其高效性和可靠性,它支持多主机并行通信和多从机实时响应,这使得在多个设备之间进行数据传输时更加灵活和高效。同时,IIC通信的速度可以达到1MHZ,这在许多应用中都是足够的,可以满足快速数据采集和处理的需求。

关于SHT30模块的两个地址,这通常用于在IIC通信中识别不同的设备。每个设备都有一个唯一的地址,这样主机就可以通过地址来指定与哪个设备进行通信。在ACM32F070开发板与SHT30传感器通信时,主机需要知道传感器的地址,以便正确地发送和接收数据。


image.png下面继续更新LCD屏的显示操作:

// 定义一个函数,用于在LCD上显示一个32位无符号整数,但仅显示其四位数的部分  
void LCD_DisplayNum_YR1618A(uint32_t Num)  
{  
    // 定义一个数组,用于存储四位数的每一位的数值  
    uint32_t ram_buff[4];  
      
    // 初始化数组,将所有元素设置为0  
    ram_buff[0]=0;  
    ram_buff[1]=0;  
    ram_buff[2]=0;  
    ram_buff[3]=0;  
  
    // 下面这行代码是注释掉的,因为ram_buff数组只有4个元素,索引从0到3,不能访问第5个元素  
    // 如果取消注释,将会导致数组越界访问的错误  
    // ram_buff[4]=0;  
  
    // 如果输入的数值大于9999,则将其限制为9999,因为LCD只显示四位数  
    if(Num>9999) Num=9999;  
      
    // 调用一个函数(可能是自定义的)来获取Num的每一位数字,并将这些数字存储在ram_buff数组中  
    // 注意:这里的Get_RAM_NUM_DATA函数看起来有些不寻常,因为它接受两个相同的参数Num  
    // 正常情况下,一个参数应该是要转换的数值,另一个参数可能是存储结果的数组  
    Get_RAM_NUM_DATA(ram_buff,Num,Num);  
      
    // 使用HAL库函数将每一位数字写入LCD的相应位置  
    // lcdhandle_YR1618A可能是LCD的句柄或配置结构体  
    HAL_LCD_Write(&lcdhandle_YR1618A,0,ram_buff[0]); // 写入千位  
    HAL_LCD_Write(&lcdhandle_YR1618A,1,ram_buff[1]); // 写入百位  
    HAL_LCD_Write(&lcdhandle_YR1618A,2,ram_buff[2]); // 写入十位  
    HAL_LCD_Write(&lcdhandle_YR1618A,3,ram_buff[3]); // 写入个位  
  
    // 下面这行代码是注释掉的,因为ram_buff数组只有4个元素,索引从0到3,不能访问第5个元素  
    // 如果取消注释,将会导致数组越界访问的错误  
    // HAL_LCD_Write(&lcdhandle_YR1618A,4,ram_buff[4]);  
}  
  
// 在一个while循环中:  
// 增加Num1的值  
Num1++;  
  
// 等待500毫秒  
System_Delay_MS(500);  
  
// 调用LCD_DisplayNum_YR1618A函数,将Num1的当前值显示在LCD上  
LCD_DisplayNum_YR1618A(Num1);

这个代码的意思是增加变量来显示数字的增加。下面是显示效果:

image.pngimage.png

下面上IIC代码:

// I2C初始化函数  
void I2C_Init(void)  
{  
    // 设置I2C句柄的Instance成员为I2C2,即使用I2C2外设  
    I2C_Handle.Instance         = I2C2;  
      
    // 设置I2C的工作模式为主模式  
    I2C_Handle.Init.I2C_Mode    = I2C_MODE_MASTER;  
      
    // 启用发送自动结束功能  
    I2C_Handle.Init.Tx_Auto_En  = TX_AUTO_EN_ENABLE;  
      
    // 设置I2C的时钟速度为标准速度(通常为100kHz)  
    I2C_Handle.Init.Clock_Speed = CLOCK_SPEED_STANDARD;  
      
    // 禁用I2C时钟拉伸模式  
    I2C_Handle.Init.No_Stretch_Mode = NO_STRETCH_MODE_NOSTRETCH;  
      
    // 调用HAL库函数初始化I2C外设  
    HAL_I2C_Init(&I2C_Handle);  
}  
  
// SHT30的I2C引脚定义  
// SHT30使用I2C2外设  
#define SHT30_I2C     I2C2   
  
// ----------------- SHT30 IIC端口定义 ----------------  
// SHT30的时钟线引脚定义为GPIOD6  
#define SHT30_SCL_PIN                 GPIOD6  
// SHT30的时钟线引脚复用功能定义为I2C2的SCL线  
#define SHT30_SCL_PIN_AF              GPIOD6_AF_I2C2_SCL  
// SHT30的数据线引脚定义为GPIOD7  
#define SHT30_SDA_PIN                 GPIOD7  
// SHT30的数据线引脚复用功能定义为I2C2的SDA线  
#define SHT30_SDA_PIN_AF              GPIOD7_AF_I2C2_SDA  
  
// SHT30复位函数  
uint8_t SHT30_Reset(I2C_HandleTypeDef I2C_Handle)  
{  
    HAL_StatusTypeDef Status; // HAL状态类型变量,用于存储函数执行结果  
    uint8_t cmd_buffer[2];    // 发送命令的缓冲区,大小为2字节  
  
    // 将SOFT_RESET_CMD的高8位存储在cmd_buffer[0]中  
    cmd_buffer[0] = SOFT_RESET_CMD >> 8;  
    // 将SOFT_RESET_CMD的低8位存储在cmd_buffer[1]中  
    cmd_buffer[1] = SOFT_RESET_CMD & 0XFF;  
      
    // 调用HAL库函数向SHT30发送软复位命令  
    Status = HAL_I2C_Master_Transmit(&I2C_Handle, SHT30_SLAVE_ADDRESS, cmd_buffer, 2, 100);  
      
    // 延时500毫秒,等待SHT30完成复位  
    System_Delay_MS(500);  
      
    // 清除状态命令的高8位  
    cmd_buffer[0] = CLEAR_STATES_CMD >> 8;  
    // 清除状态命令的低8位  
    cmd_buffer[1] = CLEAR_STATES_CMD & 0XFF;  
      
    // 调用HAL库函数向SHT30发送清除状态命令  
    Status = HAL_I2C_Master_Transmit(&I2C_Handle, SHT30_SLAVE_ADDRESS, cmd_buffer, 2, 100);  
      
    // 延时200毫秒,等待SHT30完成状态清除  
    System_Delay_MS(200);  
      
    // 返回状态值,如果发送成功,则Status为HAL_OK  
    return Status;  
}

通过IIC采集温湿度的值,显示在LCD屏上。

image.png

串口:

Uart_Init函数注释

// 初始化UART的函数  
void Uart_Init(uint32_t fu32_Baudrate)  
{  
    // 设置UART2句柄的Instance成员为UART2外设  
    UART2_Handle.Instance = UART2;  
    // 设置波特率为传入的参数值  
    UART2_Handle.Init.BaudRate   = fu32_Baudrate;  
    // 设置数据位长度为8位  
    UART2_Handle.Init.WordLength = UART_WORDLENGTH_8B;  
    // 设置停止位为1位  
    UART2_Handle.Init.StopBits   = UART_STOPBITS_1;  
    // 不使用校验位  
    UART2_Handle.Init.Parity     = UART_PARITY_NONE;  
    // 设置UART模式为发送/接收调试模式  
    UART2_Handle.Init.Mode       = UART_MODE_TX_RX_DEBUG;  
    // 不使用硬件流控制  
    UART2_Handle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;  
  
    // 调用HAL库函数初始化UART2  
    HAL_UART_Init(&UART2_Handle);  
    /* 注释:UART_DEBUG_ENABLE用于控制printfS函数的行为,可能表示开启了某种调试功能 */  
}

打印MCU相关信息的代码
// 使用printfS函数打印MCU的运行状态和系统时钟信息  
printfS("MCU is running, HCLK=%dHz, PCLK=%dHz\n", System_Get_SystemClock(), System_Get_APBClock());

打印触摸按下的键的代码
// 初始化触摸屏按键  
uint8_t ret = TouchKey_Init();  
if(ret)  
{  
    // 如果初始化失败,则打印错误信息  
    printfS("TouchKey_Init is Fail!\r\n");  
}  
else  
{  
    // 如果初始化成功,则打印成功信息  
    printfS("TouchKey_Init is Success!\r\n");        
}  
// 打印当前触摸按键的状态  
printfS("TK_%d\r\n", fu8_Tkey_state);

image.png



高工
2024-04-19 23:20:19     打赏
2楼

谢谢分享


高工
2024-04-20 09:13:29     打赏
3楼

谢谢分享


专家
2024-04-20 09:36:18     打赏
4楼

谢谢分享


院士
2024-04-24 09:13:51     打赏
5楼

这个段式液晶屏看上去还真棒。


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]