用HAL库编写一个让LCD1602显示数字的头文件和源文件
时间: 2024-03-25 10:38:27 浏览: 15
以下是使用STM32的HAL库编写一个让LCD1602显示数字的头文件和源文件的示例:
头文件 `lcd1602.h`
```c
#ifndef __LCD1602_H
#define __LCD1602_H
#include "stm32f1xx_hal.h"
#define LCD_CMD_CLEAR_DISPLAY 0x01
#define LCD_CMD_RETURN_HOME 0x02
#define LCD_CMD_ENTRY_MODE_SET 0x04
#define LCD_CMD_DISPLAY_CONTROL 0x08
#define LCD_CMD_CURSOR_SHIFT 0x10
#define LCD_CMD_FUNCTION_SET 0x20
#define LCD_CMD_SET_CGRAM_ADDRESS 0x40
#define LCD_CMD_SET_DDRAM_ADDRESS 0x80
#define LCD_CMD_DISPLAY_ON 0x04
#define LCD_CMD_DISPLAY_OFF 0x00
#define LCD_CMD_CURSOR_ON 0x02
#define LCD_CMD_CURSOR_OFF 0x00
#define LCD_CMD_BLINK_ON 0x01
#define LCD_CMD_BLINK_OFF 0x00
void LCD_Init(I2C_HandleTypeDef *hi2c);
void LCD_SendCommand(uint8_t cmd);
void LCD_SendData(uint8_t data);
void LCD_SendString(char *str);
void LCD_SetCursor(uint8_t row, uint8_t col);
void LCD_DisplayNumber(uint16_t num);
#endif /* __LCD1602_H */
```
源文件 `lcd1602.c`
```c
#include "lcd1602.h"
#define LCD_I2C_ADDRESS 0x4E
static I2C_HandleTypeDef *hi2c;
void LCD_Init(I2C_HandleTypeDef *hi2c_handle)
{
hi2c = hi2c_handle;
// Wait for LCD to become ready
HAL_Delay(50);
// Initialize LCD in 4-bit mode
LCD_SendCommand(0x33);
LCD_SendCommand(0x32);
LCD_SendCommand(LCD_CMD_FUNCTION_SET | 0x08);
LCD_SendCommand(LCD_CMD_DISPLAY_CONTROL | LCD_CMD_DISPLAY_OFF);
LCD_SendCommand(LCD_CMD_CLEAR_DISPLAY);
LCD_SendCommand(LCD_CMD_ENTRY_MODE_SET | 0x04);
LCD_SendCommand(LCD_CMD_DISPLAY_CONTROL | LCD_CMD_DISPLAY_ON | LCD_CMD_CURSOR_OFF | LCD_CMD_BLINK_OFF);
}
void LCD_SendCommand(uint8_t cmd)
{
uint8_t data[4];
data[0] = (cmd & 0xF0) | 0x04; // RS = 0, EN = 1
data[1] = (cmd & 0xF0) | 0x00; // RS = 0, EN = 0
data[2] = ((cmd << 4) & 0xF0) | 0x04; // RS = 0, EN = 1
data[3] = ((cmd << 4) & 0xF0) | 0x00; // RS = 0, EN = 0
HAL_I2C_Master_Transmit(hi2c, LCD_I2C_ADDRESS, data, 4, 100);
HAL_Delay(1);
}
void LCD_SendData(uint8_t data)
{
uint8_t lcd_data[4];
lcd_data[0] = (data & 0xF0) | 0x05; // RS = 1, EN = 1
lcd_data[1] = (data & 0xF0) | 0x01; // RS = 1, EN = 0
lcd_data[2] = ((data << 4) & 0xF0) | 0x05; // RS = 1, EN = 1
lcd_data[3] = ((data << 4) & 0xF0) | 0x01; // RS = 1, EN = 0
HAL_I2C_Master_Transmit(hi2c, LCD_I2C_ADDRESS, lcd_data, 4, 100);
HAL_Delay(1);
}
void LCD_SendString(char *str)
{
while (*str)
LCD_SendData((uint8_t)*str++);
}
void LCD_SetCursor(uint8_t row, uint8_t col)
{
uint8_t address;
if (row == 0)
address = col;
else
address = col + 0x40;
LCD_SendCommand(LCD_CMD_SET_DDRAM_ADDRESS | address);
}
void LCD_DisplayNumber(uint16_t num)
{
char buffer[5];
sprintf(buffer, "%d", num);
LCD_SendString(buffer);
}
```
这个示例代码使用了I2C通信协议,需要连接STM32的I2C总线和LCD1602的I2C接口。在使用这个库时,需要提供一个`I2C_HandleTypeDef`类型的指针作为传输参数。