良辰stm32控制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
很多地方都写的错了