测试下使用开发板IO口方式驱动16位总线TFTLCD。
一、电路图
开发板上LCD接口部分电路图
转接板
硬件接口设计中间转接板,将开发板的接口定义转换成显示屏模块的接口。
二、代码
st7789.c
#include "board_init.h"
#include "hal_gpio.h"
#include "hal_rcc.h"
#include "st7789s.h"
#include "delay.h"
#include "font.h"
uint16_t POINT_COLOR=0x0000;
uint16_t BACK_COLOR=0xFFFF;
_lcd_dev lcddev;
static void ST7789_Reset(void)
{
LCD_SetRst();
delay_ms(1);
LCD_ClrRst();
delay_ms(10);
LCD_SetRst();
delay_ms(120);
}
void ST7789_Gpio_Writedat(uint16_t dat)
{
uint16_t temp_rpd, rpd;
uint16_t temp_rpe, rpe;
temp_rpd=GPIO_ReadOutData(GPIOD);
rpd=((dat>>5)&0x700) | ((dat<<14)&0xc000) | ((dat>>2)&0x03);
temp_rpd= (temp_rpd&(~0xc703))|rpd;
GPIO_WriteBits(GPIOD,temp_rpd);
temp_rpe=temp_rpd=GPIO_ReadOutData(GPIOE);
rpe=(dat<<3)&0xff80;
temp_rpe=(temp_rpe&(~0xff80))|rpe;
GPIO_WriteBits(GPIOE,temp_rpe);
}
void ST7789_WriteCommand(uint16_t cmd)
{
LCD_ClrCs();
LCD_ClrRs();
LCD_SetRd();
LCD_ClrWr();
ST7789_Gpio_Writedat(cmd);
LCD_SetWr();
LCD_SetCs();
LCD_SetRs();
}
void ST7789_WriteData(uint16_t dat)
{
LCD_SetRs();
LCD_ClrCs();
LCD_SetRd();
LCD_ClrWr();
ST7789_Gpio_Writedat(dat);
LCD_SetWr();
LCD_SetCs();
}
void LCD_Display_Dir(uint8_t dir)
{
if(dir==0)
{
lcddev.dir=0;
lcddev.width=240;
lcddev.height=320;
}else
{
lcddev.dir=1;
lcddev.width=320;
lcddev.height=240;
}
}
void init_st7789s(void)
{
GPIO_Init_Type gpio_init;
RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOD, true);
RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOD);
RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOE, true);
RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOE);
RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOG, true);
RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOG);
gpio_init.Pins = GPIO_PIN_15|GPIO_PIN_14|GPIO_PIN_10|GPIO_PIN_9|GPIO_PIN_8|GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_1|GPIO_PIN_0;
gpio_init.PinMode = GPIO_PinMode_Out_PushPull;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &gpio_init);
gpio_init.Pins = GPIO_PIN_15|GPIO_PIN_14|GPIO_PIN_13|GPIO_PIN_12|GPIO_PIN_11|GPIO_PIN_10|GPIO_PIN_9|GPIO_PIN_8|GPIO_PIN_7|GPIO_PIN_3|GPIO_PIN_2;
gpio_init.PinMode = GPIO_PinMode_Out_PushPull;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &gpio_init);
gpio_init.Pins = GPIO_PIN_11|GPIO_PIN_12;
gpio_init.PinMode = GPIO_PinMode_Out_PushPull;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &gpio_init);
ST7789_Reset();
ST7789_WriteCommand(0x0011);
delay_ms(120);
ST7789_WriteCommand(0x0036);
ST7789_WriteData(0x0060);
ST7789_WriteCommand(0x003A);
ST7789_WriteData(0x0005);
ST7789_WriteCommand(0x00B2);
ST7789_WriteData(0x000C);
ST7789_WriteData(0x000C);
ST7789_WriteData(0x0000);
ST7789_WriteData(0x0033);
ST7789_WriteData(0x0033);
ST7789_WriteCommand(0x00B7);
ST7789_WriteData(0x0035);
ST7789_WriteCommand(0x00BB);
ST7789_WriteData(0x001c);
ST7789_WriteCommand(0x00C0);
ST7789_WriteData(0x002C);
ST7789_WriteCommand(0x00C2);
ST7789_WriteData(0x0001);
ST7789_WriteData(0x00FF);
ST7789_WriteCommand(0x00C3);
ST7789_WriteData(0x000B);
ST7789_WriteCommand(0x00C4);
ST7789_WriteData(0x0020);
ST7789_WriteCommand(0x00C6);
ST7789_WriteData(0x000F);
ST7789_WriteCommand(0x00D0);
ST7789_WriteData(0x00A4);
ST7789_WriteData(0x00A1);
ST7789_WriteCommand(0x00E0);
ST7789_WriteData(0x00D0);
ST7789_WriteData(0x0000);
ST7789_WriteData(0x0003);
ST7789_WriteData(0x0009);
ST7789_WriteData(0x0013);
ST7789_WriteData(0x001c);
ST7789_WriteData(0x003a);
ST7789_WriteData(0x0055);
ST7789_WriteData(0x0048);
ST7789_WriteData(0x0018);
ST7789_WriteData(0x0012);
ST7789_WriteData(0x000e);
ST7789_WriteData(0x0019);
ST7789_WriteData(0x001e);
ST7789_WriteCommand(0x00E1);
ST7789_WriteData(0x00D0);
ST7789_WriteData(0x0000);
ST7789_WriteData(0x0003);
ST7789_WriteData(0x0009);
ST7789_WriteData(0x0005);
ST7789_WriteData(0x0025);
ST7789_WriteData(0x003a);
ST7789_WriteData(0x0055);
ST7789_WriteData(0x0050);
ST7789_WriteData(0x003d);
ST7789_WriteData(0x001c);
ST7789_WriteData(0x001d);
ST7789_WriteData(0x001d);
ST7789_WriteData(0x001e);
ST7789_WriteCommand(0x0029);
ST7789_WriteCommand(0x002c);
printf("\n\r st7789 init ok! \r ");
LCD_Display_Dir(1);
LCD_BLA_ON();
}
void Lcd_SetBox(uint16_t xStart, uint16_t yStart, uint16_t xlong, uint16_t ylong)
{
uint16_t xEnd=0, yEnd=0;
xEnd=xStart+xlong-1;
yEnd=yStart+ylong-1;
ST7789_WriteCommand(0x2a);
ST7789_WriteData(xStart>>8);
ST7789_WriteData(xStart);
ST7789_WriteData(xEnd>>8);
ST7789_WriteData(xEnd);
ST7789_WriteCommand(0x2b);
ST7789_WriteData(yStart>>8);
ST7789_WriteData(yStart);
ST7789_WriteData(yEnd>>8);
ST7789_WriteData(yEnd);
ST7789_WriteCommand(0x2c);
}
void Lcd_SetBox1(uint16_t xStart, uint16_t xEnd, uint16_t yStart, uint16_t yEnd)
{
ST7789_WriteCommand(0x2a);
ST7789_WriteData(xStart>>8);
ST7789_WriteData(xStart);
ST7789_WriteData(xEnd>>8);
ST7789_WriteData(xEnd);
ST7789_WriteCommand(0x2b);
ST7789_WriteData(yStart>>8);
ST7789_WriteData(yStart);
ST7789_WriteData(yEnd>>8);
ST7789_WriteData(yEnd);
ST7789_WriteCommand(0x2c);
}
void LCD_WriteOneDot(uint16_t color)
{
ST7789_WriteData(color);
}
void LCD_Clear(uint16_t Color)
{
uint32_t i;
Lcd_SetBox(0,0,320,240);
for(i=0;i<78900;i++){
LCD_WriteOneDot(Color);
}
}
void ST7789_SetPoint(uint16_t x, uint16_t y, uint16_t color)
{
Lcd_SetBox1(x,x+1,y,y+1);
LCD_WriteOneDot(color);
}
void LCD_ShowChar(uint16_t x, uint16_t y, uint8_t num, uint8_t size, uint8_t mode)
{
uint8_t temp,t1,t;
uint8_t y0=y;
uint8_t csize=(size/8+((size%8)?1:0))*(size/2);
num=num-' ';
for(t=0;t<csize;t++)
{
if(size==12)temp=asc2_1206[num][t];
else if(size==16)temp=asc2_1608[num][t];
else if(size==24)temp=asc2_2412[num][t];
else return;
for(t1=0;t1<8;t1++)
{
if(temp&0x80)ST7789_SetPoint(x,y,POINT_COLOR);
else if(mode==0)ST7789_SetPoint(x,y,BACK_COLOR);
temp<<=1;
y++;
if(y>=lcddev.height)return;
if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width)return;
break;
}
}
}
}
void LCD_ShowString(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, uint8_t *p)
{
uint8_t x0=x;
width+=x;
height+=y;
while((*p<='~')&&(*p>=' '))
{
if(x>=width){x=x0;y+=size;}
if(y>=height)break;
LCD_ShowChar(x,y,*p,size,0);
x+=size/2;
p++;
}
}
st7789.h
#ifndef __ST7789S_H__
#define __ST7789S_H__
#include "board_init.h"
typedef struct
{
uint16_t width;
uint16_t height;
uint16_t id;
uint8_t dir;
uint16_t wramcmd;
uint16_t setxcmd;
uint16_t setycmd;
}_lcd_dev;
extern _lcd_dev lcddev;
extern uint16_t POINT_COLOR;
extern uint16_t BACK_COLOR;
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define BACKCOLOR 0xFFFF
#define WORDCOLOR 0x0000
#define LCD_SetCs() {GPIO_WriteBit(GPIOG, GPIO_PIN_12, 1u);}
#define LCD_ClrCs() {GPIO_WriteBit(GPIOG, GPIO_PIN_12, 0u);}
#define LCD_SetRst() {GPIO_WriteBit(GPIOG, GPIO_PIN_11, 1);}
#define LCD_ClrRst() {GPIO_WriteBit(GPIOG, GPIO_PIN_11, 0);}
#define LCD_SetRd() {GPIO_WriteBit(GPIOD, GPIO_PIN_4, 1);}
#define LCD_ClrRd() {GPIO_WriteBit(GPIOD, GPIO_PIN_4, 0);}
#define LCD_SetWr() {GPIO_WriteBit(GPIOD, GPIO_PIN_5, 1);}
#define LCD_ClrWr() {GPIO_WriteBit(GPIOD, GPIO_PIN_5, 0);}
#define LCD_BLA_ON() {GPIO_WriteBit(GPIOE, GPIO_PIN_3, 1);}
#define LCD_BLA_OFF() {GPIO_WriteBit(GPIOE, GPIO_PIN_3, 0);}
#define LCD_SetRs() {GPIO_WriteBit(GPIOE, GPIO_PIN_2, 1);}
#define LCD_ClrRs() {GPIO_WriteBit(GPIOE, GPIO_PIN_2, 0);}
void init_st7789s(void);
void LCD_Clear(uint16_t Color);
void LCD_ShowString(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, uint8_t *p);
#endif
main.c
#include "board_init.h"
#include "hal_flexcan.h"
#include "hal_gpio.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "flexcan.h"
#include "st7789s.h"
int main(void)
{
BOARD_Init();
delay_init();
init_led();
init_st7789s();
POINT_COLOR=RED;
LCD_Clear(WHITE);
printf("\r\nmm32f5270 test.\r\n");
LCD_ShowString(30,40,210,24,24,"MM32F5270");
LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
LCD_ShowString(30,90,200,16,16,"ST7789");
LCD_ShowString(30,110,200,16,16,"2022/09/01");
LCD_ShowString(30,150,210,24,24,"https://aijishu.com");
while(1)
{
GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 1u);
delay_ms(100);
GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 0u);
delay_ms(100);
}
}
三、程序运行
原作者:小会