做一个st7789并口16位的stm32f103程序
时间: 2023-08-11 22:06:33 浏览: 73
好的,以下是一个使用stm32f103驱动st7789并口16位LCD的简单程序:
```c
#include "stm32f10x.h"
// 定义LCD控制信号线GPIO口
#define LCD_RST_GPIO GPIOA
#define LCD_RST_PIN GPIO_Pin_0
#define LCD_CS_GPIO GPIOA
#define LCD_CS_PIN GPIO_Pin_1
#define LCD_RS_GPIO GPIOA
#define LCD_RS_PIN GPIO_Pin_2
#define LCD_WR_GPIO GPIOA
#define LCD_WR_PIN GPIO_Pin_3
#define LCD_RD_GPIO GPIOA
#define LCD_RD_PIN GPIO_Pin_4
// 定义LCD数据线GPIO口
#define LCD_DATA_GPIO GPIOB
#define LCD_DATA_PIN_LOW GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7
#define LCD_DATA_PIN_HIGH GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15
// 定义命令和数据传输函数
void LCD_WriteCmd(uint16_t cmd);
void LCD_WriteData(uint16_t data);
int main(void) {
// 初始化GPIO口
GPIO_InitTypeDef gpio;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Pin = LCD_RST_PIN | LCD_CS_PIN | LCD_RS_PIN | LCD_WR_PIN | LCD_RD_PIN;
GPIO_Init(LCD_RST_GPIO, &gpio);
gpio.GPIO_Pin = LCD_DATA_PIN_LOW | LCD_DATA_PIN_HIGH;
GPIO_Init(LCD_DATA_GPIO, &gpio);
// 复位LCD
GPIO_ResetBits(LCD_RST_GPIO, LCD_RST_PIN);
Delay(10);
GPIO_SetBits(LCD_RST_GPIO, LCD_RST_PIN);
Delay(10);
// 初始化LCD
LCD_WriteCmd(0x01); // 软复位
Delay(10);
LCD_WriteCmd(0x11); // 退出睡眠模式
Delay(10);
LCD_WriteCmd(0x36); // 设置扫描方向
LCD_WriteData(0x00);
LCD_WriteCmd(0x3A); // 设置像素格式
LCD_WriteData(0x05);
LCD_WriteCmd(0xB2); // 电源控制
LCD_WriteData(0x0C);
LCD_WriteData(0x0C);
LCD_WriteData(0x00);
LCD_WriteData(0x33);
LCD_WriteData(0x33);
LCD_WriteCmd(0xB7); // 极性控制
LCD_WriteData(0x35);
LCD_WriteCmd(0xBB); // VCOM设置
LCD_WriteData(0x19);
LCD_WriteCmd(0xC0); // 亮度控制
LCD_WriteData(0x2C);
LCD_WriteCmd(0xC2); // 增益调整
LCD_WriteData(0x01);
LCD_WriteCmd(0xC3); // 增益调整
LCD_WriteData(0x12);
LCD_WriteCmd(0xC4); // 增益调整
LCD_WriteData(0x20);
LCD_WriteCmd(0xC6); // VCOM设置
LCD_WriteData(0x0F);
LCD_WriteCmd(0xD0); // 电源控制
LCD_WriteData(0xA4);
LCD_WriteData(0xA1);
LCD_WriteCmd(0xE0); // Gamma校正
LCD_WriteData(0xD0);
LCD_WriteData(0x00);
LCD_WriteData(0x05);
LCD_WriteData(0x0E);
LCD_WriteData(0x15);
LCD_WriteData(0x0D);
LCD_WriteData(0x37);
LCD_WriteData(0x43);
LCD_WriteData(0x47);
LCD_WriteData(0x09);
LCD_WriteData(0x15);
LCD_WriteData(0x12);
LCD_WriteData(0x16);
LCD_WriteData(0x19);
LCD_WriteCmd(0xE1); // Gamma校正
LCD_WriteData(0xD0);
LCD_WriteData(0x00);
LCD_WriteData(0x05);
LCD_WriteData(0x0D);
LCD_WriteData(0x0C);
LCD_WriteData(0x06);
LCD_WriteData(0x2D);
LCD_WriteData(0x44);
LCD_WriteData(0x40);
LCD_WriteData(0x0E);
LCD_WriteData(0x1C);
LCD_WriteData(0x18);
LCD_WriteData(0x16);
LCD_WriteData(0x19);
LCD_WriteCmd(0x2A); // 设置列地址
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0xEF);
LCD_WriteCmd(0x2B); // 设置行地址
LCD_WriteData(0x00);
LCD_WriteData(0x00);
LCD_WriteData(0x01);
LCD_WriteData(0x3F);
LCD_WriteCmd(0x29); // 打开显示
Delay(10);
while(1) {
// 在此处写入显示内容,调用LCD_WriteData函数即可
}
}
void LCD_WriteCmd(uint16_t cmd) {
GPIO_ResetBits(LCD_RS_GPIO, LCD_RS_PIN); // RS引脚置0,表示写入命令
GPIO_ResetBits(LCD_CS_GPIO, LCD_CS_PIN); // CS引脚置0,使能LCD
GPIO_ResetBits(LCD_WR_GPIO, LCD_WR_PIN); // WR引脚置0,开始写入
GPIO_Write(LCD_DATA_GPIO, cmd); // 写入命令
GPIO_SetBits(LCD_WR_GPIO, LCD_WR_PIN); // WR引脚置1,停止写入
GPIO_SetBits(LCD_CS_GPIO, LCD_CS_PIN); // CS引脚置1,禁用LCD
}
void LCD_WriteData(uint16_t data) {
GPIO_SetBits(LCD_RS_GPIO, LCD_RS_PIN); // RS引脚置1,表示写入数据
GPIO_ResetBits(LCD_CS_GPIO, LCD_CS_PIN); // CS引脚置0,使能LCD
GPIO_ResetBits(LCD_WR_GPIO, LCD_WR_PIN); // WR引脚置0,开始写入
GPIO_Write(LCD_DATA_GPIO, data); // 写入数据
GPIO_SetBits(LCD_WR_GPIO, LCD_WR_PIN); // WR引脚置1,停止写入
GPIO_SetBits(LCD_CS_GPIO, LCD_CS_PIN); // CS引脚置1,禁用LCD
}
```
需要注意的是,在上述程序中,需要自己实现Delay函数,用于延时一定的时间,以等待LCD响应。另外,LCD的初始化步骤可能因具体型号而异,需要根据实际情况进行调整。