微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 良辰stm32控制TFT白屏 三周不得解 求大神相助 必有积分重谢!

良辰stm32控制TFT白屏 三周不得解 求大神相助 必有积分重谢!

时间:10-02 整理:3721RD 点击:
本人儿时痴迷电子,十余岁得一MP4,迷之,觉其小小屏幕,却能观花鸟虫鱼百兽,寻其原理,恐余年少,不得解。便励志日后必要知其理。而今,年长,购得一stm32核心板加一TFT(ST7789V),敲代码四周,惜TFT依旧白屏无响应,读数据,无所获。郁闷,恨年少励志,却不能完成。今在此一帖,若有能有幸,得大神相助,了却儿时心愿,便无悔,定将平生所积积分赠与大神!坐等! 代码奉上(无关代码 没有上):
LCD_Init.c
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "LCD_Init.h"
#include "SysTickInit.h"
//初始化GPIO
/**
DB0-DB15    GPIOF0-GPIOF15
CS            GPIOE2
RS        GPIOE3
WR        GPIOE4
RD        GPIOE5
IM0        GPIOE6
IM3        GPIOE7
REST        GPIOE8

**/
void LCD_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
//        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOF,&GPIO_InitStructure);
LCD_CS_SET;
LCD_IM3_CLR;
LCD_IM0_CLR;
LCD_RST_SET;
Delay_us(200);//延时2ms
LCD_RST_CLR;
Delay_us(2000);//延时20ms
LCD_RST_SET;
}
void LCD_GPIO_Init2(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOF,&GPIO_InitStructure);

}
void LCD_WR_Data(u16 dat)
{
LCD_RS_SET;
LCD_RD_SET;
LCD_WR_SET;
LCD_CS_CLR;
GPIOF->ODR=dat;
LCD_WR_CLR;
LCD_WR_SET;
Delay_us(10);
LCD_CS_SET;
}
void LCD_WR_Cmd(u8 cmd)
{
LCD_RS_CLR;
LCD_RD_SET;
LCD_WR_SET;
LCD_CS_CLR;
GPIOF->ODR=cmd;
//GPIO_SetBits(GPIOF,GPIO_Pin_2);
LCD_WR_CLR;
LCD_WR_SET;
Delay_us(10);
LCD_CS_SET;
}
u16 LCD_RD_Cmd(void)
{
u16 dat;
LCD_RS_SET;
LCD_RD_SET;
LCD_WR_SET;
LCD_CS_CLR;
LCD_RD_CLR;
LCD_RD_SET;
dat=GPIO_ReadInputData(GPIOF);
Delay_us(10);
LCD_CS_SET;
return dat;
}
void LCD_WR_Reg(u16 reg,u16 dat)
{
LCD_WR_Cmd(reg);
LCD_WR_Data(dat);
}
void LCD_Init(void)
{
LCD_GPIO_Init();
LCD_WR_Cmd(0xaa);
LCD_WR_Cmd(0xb2);
LCD_WR_Data(0x0c);
LCD_WR_Data(0x0c);
LCD_WR_Data(0x00);
LCD_WR_Data(0x33);
LCD_WR_Data(0x33);
LCD_WR_Cmd(0xb7);
LCD_WR_Data(0x35);
//---------------------------------ST7789S Power setting--------------------------------------//
LCD_WR_Cmd(0xbb);
LCD_WR_Data(0x2b);
LCD_WR_Cmd(0xc3);
LCD_WR_Data(0x17);
LCD_WR_Cmd(0xc4);
LCD_WR_Data(0x20);
LCD_WR_Cmd(0xc6);//NLA2 NLA1 NLA0 (0x00: dot/0x07: column) RTNA4  RTNA3 RTNA2 RTNA1 RTNA0    Frame
LCD_WR_Data(0x0f);
LCD_WR_Cmd(0x3A);
LCD_WR_Data(0x55);
LCD_WR_Cmd(0x36);
LCD_WR_Data(0x00);
LCD_WR_Cmd(0xd0);
LCD_WR_Data(0xa4);
LCD_WR_Data(0xa2);
//--------------------------------ST7789S gamma setting---------------------------------------//
LCD_WR_Cmd(0xe0);
LCD_WR_Data(0xf0);
LCD_WR_Data(0x00);
LCD_WR_Data(0x0a);
LCD_WR_Data(0x10);
LCD_WR_Data(0x12);
LCD_WR_Data(0x1b);
LCD_WR_Data(0x39);
LCD_WR_Data(0x44);
LCD_WR_Data(0x47);
LCD_WR_Data(0x28);
LCD_WR_Data(0x12);
LCD_WR_Data(0x10);
LCD_WR_Data(0x16);
LCD_WR_Data(0x1b);
LCD_WR_Cmd(0xe1);
LCD_WR_Data(0xf0);
LCD_WR_Data(0x00);
LCD_WR_Data(0x0a);
LCD_WR_Data(0x10);
LCD_WR_Data(0x11);
LCD_WR_Data(0x1a);
LCD_WR_Data(0x3b);
LCD_WR_Data(0x34);
LCD_WR_Data(0x4e);
LCD_WR_Data(0x3a);
LCD_WR_Data(0x17);
LCD_WR_Data(0x16);
LCD_WR_Data(0x21);
LCD_WR_Data(0x22);
LCD_WR_Cmd(0x11); // Sleep out
Delay_us(10000);
LCD_WR_Cmd(0x29); // Display on
LCD_WR_Cmd(0x2c);
}
void LCD_Brush(void)
{
int i,j;
LCD_GPIO_Init();
LCD_WR_Cmd(0x002C);
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
//        LCD_WRITE_DATA(color>>8);
//        LCD_WRITE_DATA(color);
         LCD_WR_Data(0x00);
}
}
while(1);
}

main.c
#include "stm32f10x.h"
#include "SysTickInit.h"
#include "LCD_Init.h"
#include "LED_TEST.h"
#include "USART3_Config.h"
int main()
{
u16 dat;
SystemInit();
SysTickInit();

//led_test();
//LCD_Init();
// LCD_Brush();
USART3_Init();
LCD_GPIO_Init();
LCD_WR_Cmd(0x01);
while(1)
{
         Delay_us(500000);
LCD_GPIO_Init();
LCD_WR_Cmd(0x04);
dat=GPIO_ReadOutputData(GPIOF);
LCD_GPIO_Init2();
SendData(dat);

dat=LCD_RD_Cmd();
//        SendData(dat);
//        LCD_GPIO_Init2();
SendData(dat);
dat=LCD_RD_Cmd();
//        SendData(dat);
//        LCD_GPIO_Init2();
SendData(dat);
dat=LCD_RD_Cmd();
SendData(dat);
dat=LCD_RD_Cmd();
//        SendData(dat);
//        LCD_GPIO_Init2();
SendData(dat);
//        Delay_us(500000);
}
}

看你的程序有些乱,思路也有些不清,没用过这个液晶,不过先确定几个情况,一,说明了液晶驱动芯片的型号,但没说明液晶接口如何。二,void LCD_GPIO_Init(void)设置了单片机引脚为输出,但同时对液晶也进行了复位,个人认为,最好把液晶复位部分单独写个子程序。三,看主程序,是读取液晶的ID,但读取是否成功并没有说明。四,因为void LCD_GPIO_Init(void)同时对液晶复位,所以主程序每读一次ID前都对液晶复位了一次,不清楚对读ID是否有影响。五,有对LCD_IM3_CLR;LCD_IM0_CLR;进行设置,但不清楚液晶的接口说明,所以不清楚你现在的设置是8位接口,还是16位接口。

读取数据在液晶屏上显示,白屏不显示,复位和数据读取看看,仔细看驱动芯片,没用过这个驱动芯片

感谢大兄弟回复  现在用的8位  读取不成功 一直为0xffff

谢谢回复  我现在读取id一直为oxffff  使用8位口

最好能给出屏的型号和资料,得确定是否真的在8位接口方式,接触过几款9325和9341的屏,都是需要更改屏上电路的电阻来选择8位或16位的。

来,交流交流,不知道你写的啥,哈哈

你写程序的时候能不能加点注释,看的心好累啊,还的翻回来翻过看是什么

马上补充 屏幕资料和电路

我错了 大兄弟  马上奉上带注释的

http://download.csdn.net/download/vesjh/9317989
ST7789S手册和驱动代码;下载下来,丢进去就可以啦~

如果解决了问题,希望选个最佳答案,也是对答题者的尊重吧

大家好!我们是专业做显示屏的,有这方面需求可联系!肖生:13570852659(微信同号)QQ:434316338

很多地方都写的错了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top