用stm32写一个lcd12864.c和.h文件,并在cubmax中生成的文件中写出main函数
时间: 2024-04-16 08:24:14 浏览: 17
以下是一个基本的LCD12864的C代码示例(lcd12864.c和lcd12864.h),以及在CubeMX生成的文件中的main函数:
lcd12864.h:
```c
#ifndef LCD12864_H
#define LCD12864_H
#include "stm32f4xx_hal.h"
#define LCD_RS_Pin GPIO_PIN_0
#define LCD_RS_GPIO_Port GPIOA
#define LCD_RW_Pin GPIO_PIN_1
#define LCD_RW_GPIO_Port GPIOA
#define LCD_EN_Pin GPIO_PIN_2
#define LCD_EN_GPIO_Port GPIOA
#define LCD_D0_Pin GPIO_PIN_0
#define LCD_D0_GPIO_Port GPIOB
#define LCD_D1_Pin GPIO_PIN_1
#define LCD_D1_GPIO_Port GPIOB
#define LCD_D2_Pin GPIO_PIN_2
#define LCD_D2_GPIO_Port GPIOB
#define LCD_D3_Pin GPIO_PIN_3
#define LCD_D3_GPIO_Port GPIOB
#define LCD_D4_Pin GPIO_PIN_4
#define LCD_D4_GPIO_Port GPIOB
#define LCD_D5_Pin GPIO_PIN_5
#define LCD_D5_GPIO_Port GPIOB
#define LCD_D6_Pin GPIO_PIN_6
#define LCD_D6_GPIO_Port GPIOB
#define LCD_D7_Pin GPIO_PIN_7
#define LCD_D7_GPIO_Port GPIOB
void lcd_init(void);
void lcd_send_cmd(uint8_t cmd);
void lcd_send_data(uint8_t data);
void lcd_clear(void);
void lcd_set_cursor(uint8_t row, uint8_t col);
void lcd_write_string(const char* str);
#endif /* LCD12864_H */
```
lcd12864.c:
```c
#include "lcd12864.h"
void lcd_enable(void)
{
HAL_GPIO_WritePin(LCD_EN_GPIO_Port, LCD_EN_Pin, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(LCD_EN_GPIO_Port, LCD_EN_Pin, GPIO_PIN_RESET);
HAL_Delay(1);
}
void lcd_send_cmd(uint8_t cmd)
{
HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_RW_GPIO_Port, LCD_RW_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_D0_GPIO_Port, LCD_D0_Pin, (cmd >> 0) & 0x01);
HAL_GPIO_WritePin(LCD_D1_GPIO_Port, LCD_D1_Pin, (cmd >> 1) & 0x01);
HAL_GPIO_WritePin(LCD_D2_GPIO_Port, LCD_D2_Pin, (cmd >> 2) & 0x01);
HAL_GPIO_WritePin(LCD_D3_GPIO_Port, LCD_D3_Pin, (cmd >> 3) & 0x01);
HAL_GPIO_WritePin(LCD_D4_GPIO_Port, LCD_D4_Pin, (cmd >> 4) & 0x01);
HAL_GPIO_WritePin(LCD_D5_GPIO_Port, LCD_D5_Pin, (cmd >> 5) & 0x01);
HAL_GPIO_WritePin(LCD_D6_GPIO_Port, LCD_D6_Pin, (cmd >> 6) & 0x01);
HAL_GPIO_WritePin(LCD_D7_GPIO_Port, LCD_D7_Pin, (cmd >> 7) & 0x01);
lcd_enable();
}
void lcd_send_data(uint8_t data)
{
HAL_GPIO_WritePin(LCD_RS_GPIO_Port, LCD_RS_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LCD_RW_GPIO_Port, LCD_RW_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_D0_GPIO_Port, LCD_D0_Pin, (data >> 0) & 0x01);
HAL_GPIO_WritePin(LCD_D1_GPIO_Port, LCD_D1_Pin, (data >> 1) & 0x01);
HAL_GPIO_WritePin(LCD_D2_GPIO_Port, LCD_D2_Pin, (data >> 2) & 0x01);
HAL_GPIO_WritePin(LCD_D3_GPIO_Port, LCD_D3_Pin, (data >> 3) & 0x01);
HAL_GPIO_WritePin(LCD_D4_GPIO_Port, LCD_D4_Pin, (data >> 4) & 0x01);
HAL_GPIO_WritePin(LCD_D5_GPIO_Port, LCD_D5_Pin, (data >> 5) & 0x01);
HAL_GPIO_WritePin(LCD_D6_GPIO_Port, LCD_D6_Pin, (data >> 6) & 0x01);
HAL_GPIO_WritePin(LCD_D7_GPIO_Port, LCD_D7_Pin, (data >> 7) & 0x01);
lcd_enable();
}
void lcd_init(void)
{
// 初始化LCD
lcd_send_cmd(0x30); // 基本指令集
lcd_send_cmd(0x0C); // 显示开关控制指令
lcd_send_cmd(0x01); // 清屏
lcd_send_cmd(0x06); // 光标右移,不移动显示
}
void lcd_clear(void)
{
lcd_send_cmd(0x01); // 清屏
}
void lcd_set_cursor(uint8_t row, uint8_t col)
{
uint8_t addr = col;
if (row == 1)
addr |= 0x40; // 第二行地址偏移为0x40
addr |= 0x80; // 设置DDRAM地址
lcd_send_cmd(addr);
}
void lcd_write_string(const char* str)
{
while (*str)
{
lcd_send_data(*str++);
}
}
```
在CubeMX生成的文件中的main函数:
```c
#include "main.h"
#include "lcd12864.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
lcd_init();
lcd_clear();
lcd_set_cursor(0, 0);
lcd_write_string("Hello, LCD12864!");
while (1)
{
// 主循环
}
}
```
请注意,这只是一个简单的示例代码,实际使用时可能需要根据具体的需求进行修改和优化。同时,确保在CubeMX中正确配置了GPIO引脚和时钟等设置。