我最近在做一个项目,用到了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);
}
}
}
此帖出自
小平头技术问答
一周热门 更多>