stm32驱动2.4寸tft问题

2019-03-23 19:32发布

我最近在做一个项目,用到了ILI9325驱动的2.4寸TFT,但是始终白屏。单步执行初始化程序结束时,没有出现花屏现象,是不是说明初始化程序有问题啊?我把初始化程序贴下来,麻烦各位帮我看看,是不是哪里出问题了。。。
#include "stm32f10x.h"
#include "LCD.h"
#include "delay.h"
#include "datatype.h" #define WIDTH 240
#define HEIGHT 320
//==============================================================
//液晶所用端口初始化
//
void GPIO_initial(void)
{
 RCC->APB2ENR |= 0x0000003D;//使能GPIOA,GPIOB,GPIOC,GPIOD,AFIO
 DATAHOUT;     //数据端口,设置PB高八位,PC低八位为50M通用推挽输出模式
 DATALOUT;
 GPIOC->CRH &= 0xFFF00000;     //控制端口,PC.08.09.10.11.12设置为50M通用推挽输出模式
 GPIOC->CRH |= 0x00033333;
 GPIOC->BSRR = 0x00001F00;  //cs,rs,wr,rd = 1;    
}
//==============================================================
//写到TFT
//
void Wr_GPIO(ushort c)

 ushort temp;
 uchar temph,templ;
 //写入高八位,并保持PC口高八位不变
 temp=GPIO_ReadOutputData(GPIOC);
 temph=temp>>8;
 DATAHOUT;
 GPIO_Write(GPIOC, (c>>8)|(temph<<8));
 Clr_nWr;
 delay_us(100);
 Set_nWr;
  //写入低八位,并保持PB口低八位不变
 temp=GPIO_ReadOutputData(GPIOB);
 templ=temp;
 DATALOUT;
 GPIO_Write(GPIOB, (c<<8)|templ); 
 Clr_nWr;
 delay_us(100);
 Set_nWr;
 
}
//=============================================================
//写命令
//功能:写一个命令到TFT控制器。
//入口参数: cmd为指定要执行的命令。
//出口参数: 无
__inline void Wr_cmd(ushort cmd)
{
 Clr_Cs;
 Clr_Rs;  
 Wr_GPIO(cmd);
 Set_Cs;
   
}
//===================================================================
//写数据
//功能:写一个数据到TFT控制器。
//入口参数: data为指定要写入的数据。
//出口参数: 无
__inline void Wr_data(ushort data)
{
 Clr_Cs;
 Set_Rs;
 Wr_GPIO(data);
 Set_Cs;
}
//===============================================================
//写命令数据
//功能: 写命令数据到TFT控制器。
//入口参数: cmd为要写入的命令字节;dat为要写入的16位数据。
//出口参数: 无
void Wr_cmd_data(ushort cmd,ushort data)
{
 Wr_cmd(cmd);
 delay_us(10);
 Wr_data(data);
}
//=============================================================
//TFT初始化
//功能:该函数用于初始化TFT彩屏模块。
//入口参数: 无
//出口参数: 无
void ILI9325_initial(void)
{
 volatile unsigned short data;
 GPIO_initial();
 Clr_Cs;
 Set_nRst; 
 delay_ms(10);
 Clr_nRst;
 delay_ms(1);
 Set_nRst;
 delay_ms(50);  Wr_cmd_data(0x00E3,0x3008); // Set u16ernal timing
 Wr_cmd_data(0x00E7,0x0012); // Set u16ernal timing
 Wr_cmd_data(0x00EF,0x1231); // Set u16ernal timing
// Wr_cmd_data(0x00E5,0x8000);
 Wr_cmd_data(0x0000,0x0100);
 delay_ms(10);
 Wr_cmd_data(0x0001,0x0000); //源扫描设置SS=0, 输出的移动方向是从S1到S720
 //(源扫描设置SS=1, 输出的移动方向是从S720到S1)
 //SM=0,逐行扫描(SM=1,隔行扫描)
 
 Wr_cmd_data(0x0002,0x0700); //B/C=1、EOR=1:行倒置(B/C=0:帧/场倒置)
 Wr_cmd_data(0x0003,0x1038); //AM=0,地址在水平方向自动加1
 //I/D[1:0] = 11:水平垂直方向均增加
 //BGR=1:采用BGR格式
 //TRI=0、DFM=*:8位机、两次数据传送
 Wr_cmd_data(0x0004,0x0000); //比例缩放设置:不缩放
 
 //显示控制
 Wr_cmd_data(0x0008,0x0207); //设置后边沿和前沿
 Wr_cmd_data(0x0009,0x0000);//设置非显示区时间间隔ISC[3:0]
 Wr_cmd_data(0x000A,0x0000); //帧标记功能
 
 Wr_cmd_data(0x000C,0x0000);//RGB显示接口控制1
 Wr_cmd_data(0x000D,0x0000);//帧标记位置
 Wr_cmd_data(0x000F,0x0000);//RGB显示接口控制2
 
 //电源配置
 Wr_cmd_data(0x0010,0x0000);  
 Wr_cmd_data(0x0011,0x0007); 
 Wr_cmd_data(0x0012,0x0000); 
 Wr_cmd_data(0x0013,0x0000);
 delay_ms(50);
 //vgh
 Wr_cmd_data(0x0010,0x17B0);  
 Wr_cmd_data(0x0011,0x0004);
 delay_ms(10);
 //vregiout
 Wr_cmd_data(0x0012,0x0118); //0x001b
 delay_ms(10);
 //vom amplitude
 Wr_cmd_data(0x0013,0x0900);  //vom H
 Wr_cmd_data(0x0029,0x0014);
 delay_ms(10); 
 Wr_cmd_data(0x002B,0x0020);
 Wr_cmd_data(0x0020,0x0000);
 Wr_cmd_data(0x0021,0x0000);
 //伽马校正
 Wr_cmd_data(0x0030,0x0000);
 Wr_cmd_data(0x0031,0x0102);
 Wr_cmd_data(0x0032,0x0707);//0006
 Wr_cmd_data(0x0035,0x0107);
 Wr_cmd_data(0x0036,0x0400);
 Wr_cmd_data(0x0037,0x0606);
 Wr_cmd_data(0x0038,0x0105);//0200
 Wr_cmd_data(0x0039,0x0707);
 Wr_cmd_data(0x003C,0x0700);//0504
 Wr_cmd_data(0x003D,0x0E07);
 
 //窗口设置
 Wr_cmd_data(0x0050,0x0000);//水平起始位置
 Wr_cmd_data(0x0051,0x00EF);//水平终止位置
 Wr_cmd_data(0x0052,0x0000);//垂直起始位置
 Wr_cmd_data(0x0053,0x013F);//垂直终止位置
 
 Wr_cmd_data(0x0060,0x2700);//门扫描设置,GS=1:从G320扫描到G1,320线
 Wr_cmd_data(0x0061,0x0001);
 Wr_cmd_data(0x006A,0x0000);
 //
 Wr_cmd_data(0x0080,0x0000);
 Wr_cmd_data(0x0081,0x0000);
 Wr_cmd_data(0x0082,0x0000);
 Wr_cmd_data(0x0083,0x0000);
 Wr_cmd_data(0x0084,0x0000);
 Wr_cmd_data(0x0085,0x0000);
 //
 Wr_cmd_data(0x0090,0x0010);
 Wr_cmd_data(0x0092,0x0000);
 Wr_cmd_data(0x0093,0x0003);
 Wr_cmd_data(0x0095,0x0110);
 Wr_cmd_data(0x0097,0x0000);
 Wr_cmd_data(0x0098,0x0000);
 Wr_cmd_data(0x0007,0x0173);
// Wr_cmd_data(0x0007,0x0000);
// Wr_cmd_data(0x0011,0x0000);
// Wr_cmd_data(0x0012,0x0000);
// Wr_cmd_data(0x0013,0x0000);
// delay_ms(50);
// Wr_cmd_data(0x0010,0x0002);
// delay_ms(10);
 Wr_cmd(0x0022); 
 delay_ms(100); 
} //===============================================================
//设置窗口
//入口参数: startx,starty,为显示窗口左上角坐标;endx,endy为显示窗口右下角坐标。
//出口参数: 无
//说明:该函数设置TFT模块的显示窗口。
void LCD_Setwindow(ushort startx,ushort starty ,ushort endx,ushort endy)
{
 Wr_cmd_data(WINDOW_XADDR_START,startx);//水平起始位置
 Wr_cmd_data(WINDOW_XADDR_END,endx);//水平终止位置
 Wr_cmd_data(WINDOW_YADDR_START,starty);//垂直起始位置
 Wr_cmd_data(WINDOW_YADDR_END,endy);//垂直终止位置
 Wr_cmd_data(GRAM_XADDR,startx);//设置X坐标位置
 Wr_cmd_data(GRAM_YADDR,starty);//设置Y坐标位置
 Wr_cmd(0x0022);//LCD_WriteCMD(GRAMWR);
}
//===============================================================
//设定当前显示坐标
//入口参数: x,y为当前显示坐标。
//出口参数: 无
//说明:本函数实际上是LCD_setwindow函数的一个特例,显示窗口为最小,仅是一个像素点。
void LCD_Setposition(unsigned char x,unsigned int y)
{
 LCD_Setwindow(x,y,x,y); 
}
//===============================================================
//单 {MOD}自测程序
//入口参数: 无。
//出口参数: 无
//说明:在TFT屏上显示单 {MOD}屏幕。
void LCD_Test(void)
{
 uint i,j;
// Clr_Cs;
 LCD_Setwindow(0,0,239,319);     for(i=0;i<320;i++)
  {
   for (j=0;j<240;j++)
     {
         Wr_data(Black);
     }    }   
}  
  此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
dandelion4277
1楼-- · 2019-03-24 01:50
/ 自己顶。。。
zoyn
2楼-- · 2019-03-24 03:29
 精彩回答 2  元偷偷看……
电子机器人
3楼-- · 2019-03-24 06:58
都是写寄存器的,用的使用有些困难,有没有直接用库函数的?

一周热门 更多>