OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11414|回复: 11

TFT LCD初始化程序

[复制链接]

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-13
在线时间
0 小时
发表于 2012-6-25 23:20:08 | 显示全部楼层 |阅读模式
在赠送的资料中有这样两行
        delay_ms(50);
        LCD_WriteReg(0x07,0x0101);    //Display Contral.
        delay_ms(50);
       LCD_WriteReg(0x07,0x0173);    //(0x0173)
而在ILI9320手册里,是这样定义的

0x0101与0x0173是不可能出来的啊!!
另外弄了一天程序,只想让LCD初始化,可以换背景颜色,终究没成功,可否看一下程序
#include <stm32f10x_lib.h>
#include <sys.h>
#include <delay.h>
#define LCD_BL PCout(10)
#define LCD_CS PCout(9)
#define LCD_RS PCout(8)
#define LCD_WR PCout(7)
#define LCD_RD PCout(6)
#define uint unsigned int
#define uchar unsigned char
//9320 LCD寄存器 
#define R0             0x00
#define R1             0x01
#define R2             0x02
#define R3             0x03
#define R4             0x04
#define R5             0x05
#define R6             0x06
#define R7             0x07
#define R8             0x08
#define R9             0x09
#define R0A            0x0A
#define R0C            0x0C
#define R0D            0x0D
#define R0E            0x0E
#define R0F            0x0F
#define R10            0x10
#define R11            0x11
#define R12            0x12
#define R13            0x13
#define R14            0x14
#define R15            0x15
#define R16            0x16
#define R17            0x17
#define R18            0x18
#define R19            0x19
#define R1A            0x1A
#define R1B            0x1B
#define R1C            0x1C
#define R1D            0x1D
#define R1E            0x1E
#define R1F            0x1F
#define R20            0x20
#define R21            0x21
#define R22            0x22
#define R24            0x24
#define R25            0x25
#define R28            0x28
#define R29            0x29
#define R2B            0x2B
#define R2D            0x2D
#define R30            0x30
#define R31            0x31
#define R32            0x32
#define R33            0x33
#define R34            0x34
#define R35            0x35
#define R36            0x36
#define R37            0x37
#define R38            0x38
#define R39            0x39
#define R3B            0x3B
#define R3C            0x3C
#define R3D            0x3D
#define R3E            0x3E
#define R3F            0x3F
#define R40            0x40
#define R41            0x41
#define R42            0x42
#define R43            0x43
#define R44            0x44
#define R45            0x45
#define R46            0x46
#define R47            0x47
#define R48            0x48
#define R49            0x49
#define R4A            0x4A
#define R4B            0x4B
#define R4C            0x4C
#define R4D            0x4D
#define R4E            0x4E
#define R4F            0x4F
#define R50            0x50
#define R51            0x51
#define R52            0x52
#define R53            0x53
#define R60            0x60
#define R61            0x61
#define R6A            0x6A
#define R76            0x76
#define R80            0x80
#define R81            0x81
#define R82           0x82
#define R83           0x83
#define R84           0x84
#define R85           0x85
#define R86           0x86
#define R87           0x87
#define R88           0x88
#define R89           0x89
#define R8B           0x8B
#define R8C           0x8C
#define R8D           0x8D
#define R8F           0x8F
#define R90           0x90
#define R91           0x91
#define R92           0x92
#define R93           0x93
#define R94           0x94
#define R95           0x95
#define R96           0x96
#define R97           0x97
#define R98           0x98
#define R99           0x99
#define R9A           0x9A
#define R9D           0x9D
#define RC0           0xC0
#define RC1           0xC1
#define RE5           0xE5   
//画笔颜色
#define WHITE              0xFFFF
#define BLACK              0x0000     
#define BLUE              0x001F 
#define BRED             0XF81F
#define GRED              0XFFE0
#define GBLUE             0X07FF
#define RED                0xF800
#define MAGENTA            0xF81F
#define GREEN              0x07E0
#define CYAN               0x7FFF
#define YELLOW             0xFFE0
#define BROWN              0XBC40 //棕色
#define BRRED              0XFC07 //棕红色
#define GRAY               0X8430 //灰色
//GUI颜色

#define DARKBLUE           0X01CF    //深蓝色
#define LIGHTBLUE           0X7D7C    //浅蓝色 
#define GRAYBLUE            0X5458 //灰蓝色
//以上三色为PANEL的颜色
 
#define LIGHTGREEN          0X841F //浅绿色
#define LGRAY              0XC618 //浅灰色(PANNEL),窗体背景色

#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)
                                                                   

void write_reg(uchar x)//写入八位寄存器
{
    LCD_CS=0; //PCout(9)
    LCD_RS=0;  //PCout(8)
    LCD_WR=1;    //PCout(7)
    GPIOB->ODR=x;
    LCD_WR=0;
    LCD_WR=1;
    LCD_RS=1;


}
void write_dat(uint x)    //先写寄存器,再写16位数据
{
    LCD_CS=0;
    LCD_RS=1;
    LCD_WR=1;
    GPIOB->ODR=x;
    LCD_WR=0;
    LCD_WR=1;
    LCD_CS=1;
}
void write_reg_dat(uchar reg,uint dat)
{
     write_reg(reg);
     write_dat(dat);
}
read_reg(uchar x)
{
    uchar dat;
    write_reg(x);
    GPIOB->CRL=0X88888888;//设置PB0~PB7为输入模式
    GPIOB->CRH=0X33333333;//设置PB8~PB15为输入模式
    GPIOB->ODR=0XFFFF;//设置为上拉
    LCD_CS=0;
    LCD_RS=1;
    LCD_WR=1;
    LCD_RD=1;
    LCD_RD=0;
    delay_us(100);
    dat=GPIOB->IDR;
    LCD_RD=1;
    LCD_CS=1;
    GPIOB->CRL=0X33333333;//设置PB0~PB7为通用推挽输出模式
    GPIOB->CRH=0X33333333;//设置PB8~PB15为通用推挽输出模式
    GPIOB->ODR=0XFFFF;//设置为输出高
    return dat;
}
void LCD_SetCrusor(uint x,uint y)
{
    write_reg_dat(R20,x);
    write_reg_dat(R21,y);
}
void LCD_clear(uint color)
{    unsigned long i;
    LCD_SetCrusor(0x0000,0x0000);
    write_reg(R22);
    for(i=0;i<76800;i++)
    write_dat(color);
}
main()
{
    Stm32_Clock_Init(9);
    delay_init(72);
    RCC->APB2ENR|=1<<3;//使能PORT B时钟
    RCC->APB2ENR|=1<<4;//使能PORT C时钟
    RCC->APB2ENR|=1<<0;    //开启辅助时钟
    JTAG_Set(SWD_ENABLE);  //开启SWD
    GPIOB->CRL=0X33333333;//设置PB0~PB7为通用推挽输出模式
    GPIOB->CRH=0X33333333;//设置PB8~PB15为通用推挽输出模式
    GPIOB->ODR=0X0000;//设置为输出低
    GPIOC->CRL=0X33333333;//设置PC0~PC7为通用推挽输出模式
    GPIOC->CRH=0X33333333;//设置PC8~PC15为通用推挽输出模式
    GPIOC->ODR=0X0000;//设置为输出低
    LCD_BL=1;//点亮背光
//-----------以下为LCD初始化函数-------------------------------//
   
    delay_ms(50); // delay 50 ms
    write_reg_dat(R0,0x0001); //晶振振荡
    delay_ms(50);//等候20ms
    write_reg_dat(R1,0x0100); //S1-S720
    write_reg_dat(R2,0x0700);//LCD Driving Wave Control (R02h)
    write_reg_dat(R3,0x1030);//65536 colors
    write_reg_dat(R4,0x0000);//Resizing Control Register
       write_reg_dat(R8,0x0303);//Number of lines for Front/back Porch 3 lines
    write_reg_dat(R9,0x0000);//
       write_reg_dat(R0A,0x0000);//
    write_reg_dat(R0C,0x0001);// 16 BIT interface
    write_reg_dat(R0D,0x0000);//a high-active pulse FMARK is output at the start of back porch period for one display line
    write_reg_dat(R0F,0x0000);//EPL = “1” The data DB17-0 is written when ENABLE = “1”.
    delay_ms(50);
    write_reg_dat(R7,0x323B);//Display Control 1 (R07h)
    delay_ms(50);
       write_reg_dat(R10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4));//SAP=1,and set the  SAP=1, after starting up the LCD power supply circuit.
    write_reg_dat(R11,0x0007);//power control 2,Step-up circuit1:Fosc .Step-up circuit2:Fosc / 16
    write_reg_dat(R12,(1<<8)|(1<<4)|(0<<0));//power control 3,VciLVL x 1.90,VGL output is disable
    write_reg_dat(R13,0x1000);//Power Control 4 (R13h),Vcom amplitude=5.54V less than 6V.   
    write_reg_dat(R29,0x0010);//Power Control 7 (R29h)Set the internal VcomH voltage. Vcom amplitude=5.54V less than 6V.    3.3*1.9*0.85=5.32V
    write_reg_dat(R2B,(1<<14)|(1<<4));//Frame Rate=80Hz
       write_reg_dat(R50,0x0000);//define Horizontal and Vertical RAM Address Position
    write_reg_dat(R51,0xEF);
    write_reg_dat(R52,0x0000);
    write_reg_dat(R53,0x013F);
    write_reg_dat(R60,0x2700);//define 320 lines
    write_reg_dat(R61,0x0000);//V0~V60
    write_reg_dat(R6A,0x0000);//V0~V60
    write_reg_dat(R80,0x0000);//Partial Image 1 Display Position (R80h)
    write_reg_dat(R81,0x0000); //Partial Image 1 RAM Start/End Address
    write_reg_dat(R82,0x0000);
    write_reg_dat(R83,0x0000);
    write_reg_dat(R84,0x0000);
    write_reg_dat(R85,0x0000);
    write_reg_dat(R90,0x0000);
       write_reg_dat(R92,0x0000);
    write_reg_dat(R93,0x0001);
    write_reg_dat(R95,0x0110);
    write_reg_dat(R97,0x0001);
    write_reg_dat(R98,0x0001);
       write_reg_dat(R7,0x323B);//Display Control 1 (R07h)

while(1)
    {   
    LCD_clear(RED);
    }
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-11-9 23:14:52 | 显示全部楼层
回复【10楼】jianglg3:
---------------------------------
没初始化串口。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-6-26 00:58:41 | 显示全部楼层
能不能读出ID?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-13
在线时间
0 小时
 楼主| 发表于 2012-6-26 21:23:51 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
Stm32_Clock_Init(9);
delay_init(72);
RCC->APB2ENR|=1<<3;//使能PORT B时钟
RCC->APB2ENR|=1<<4;//使能PORT C时钟
RCC->APB2ENR|=1<<0;    //开启辅助时钟
JTAG_Set(SWD_ENABLE);  //开启SWD
GPIOB->CRL=0X33333333;//设置PB0~PB7为通用推挽输出模式
GPIOB->CRH=0X33333333;//设置PB8~PB15为通用推挽输出模式
GPIOB->ODR=0X0000;//设置为输出低
GPIOC->CRL=0X33333333;//设置PC0~PC7为通用推挽输出模式
GPIOC->CRH=0X33333333;//设置PC8~PC15为通用推挽输出模式
GPIOC->ODR=0X0000;//设置为输出低
LCD_BL=1;//点亮背光
delay_ms(50); // delay 50 ms
write_reg_dat(0x0000,0x0001); //晶振振荡
delay_ms(50);//等候20ms
// read_reg(R0);  //read code
// delay_us(10);
//---------串口程序-------------------------------------------------------------------------//
RCC->APB2ENR&=0xBFFB;//
RCC->APB2ENR|=0x4004;//   使能porta 和串口时钟
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//设置PA9为UART发送,PA10为接收 */
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8推挽输出
GPIOA->ODR|=1<<8;//PA8输出高,led设置
RCC->APB2RSTR|=1<<14;   //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//----------------发送数据设置----------------------------//
USART1->CR1=0x2000;//使能uart,UE=1
USART1->BRR=0x271;//设定15200波特率
USART1->CR1|=0x0008;//设置为1,使能发送
//-----------------接收数据设置----------------------------//
USART1->CR1|=0x0004;//RE接收使能
#ifdef EN_USART1_RX//如果使能接收,使能接收中断
USART1->CR1|=0x0020;//当RXNE为1时(收到数据,可以读出),允许产生USART中断
MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
  
while(1)
{ read_reg(R0);  //read code
delay_us(10);
printf(" LCD ID:%x\n",dat_dat); //打印LCD ID 
}

读ID时候发现每次独到的值竟然不一样,或者是18或者是FFFF
于是我把您例程里的代码挨个试了一下,发现只有下列是好用的,这是一个什么芯片???因为整套东西包括TFT-LCD都是从你那儿买的,可能你比较了解型号
else if(DeviceCode==0x4535)
    {                 
        LCD_WriteReg(0X15,0X0030);  
        LCD_WriteReg(0X9A,0X0010);  
         LCD_WriteReg(0X11,0X0020);  
         LCD_WriteReg(0X10,0X3428);  
        LCD_WriteReg(0X12,0X0002);//16   
         LCD_WriteReg(0X13,0X1038);  
        delay_ms(40);  
        LCD_WriteReg(0X12,0X0012);//16   
        delay_ms(40);  
          LCD_WriteReg(0X10,0X3420);  
         LCD_WriteReg(0X13,0X3038);  
        delay_ms(70);  
        LCD_WriteReg(0X30,0X0000);  
        LCD_WriteReg(0X31,0X0402);  
        LCD_WriteReg(0X32,0X0307);  
        LCD_WriteReg(0X33,0X0304);  
        LCD_WriteReg(0X34,0X0004);  
        LCD_WriteReg(0X35,0X0401);  
        LCD_WriteReg(0X36,0X0707);  
        LCD_WriteReg(0X37,0X0305);  
        LCD_WriteReg(0X38,0X0610);  
        LCD_WriteReg(0X39,0X0610);
         
        LCD_WriteReg(0X01,0X0100);  
        LCD_WriteReg(0X02,0X0300);  
        LCD_WriteReg(0X03,0X1030);//改变方向的  
        LCD_WriteReg(0X08,0X0808);  
        LCD_WriteReg(0X0A,0X0008);  
         LCD_WriteReg(0X60,0X2700);  
        LCD_WriteReg(0X61,0X0001);  
        LCD_WriteReg(0X90,0X013E);  
        LCD_WriteReg(0X92,0X0100);  
        LCD_WriteReg(0X93,0X0100);  
         LCD_WriteReg(0XA0,0X3000);  
         LCD_WriteReg(0XA3,0X0010);  
        LCD_WriteReg(0X07,0X0001);  
        LCD_WriteReg(0X07,0X0021);  
        LCD_WriteReg(0X07,0X0023);  
        LCD_WriteReg(0X07,0X0033);  
        LCD_WriteReg(0X07,0X0133);  
    }           
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2012-6-26 23:27:09 | 显示全部楼层
GPIOB->CRL=0X88888888;//设置PB0~PB7为输入模式
     GPIOB->CRH=0X33333333;//设置PB8~PB15为输入模式

这儿设置错了没啊?
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2012-6-26 23:32:12 | 显示全部楼层
你把它改为输入 在看ID读出来是什么吧、、~~~~(>_<)~~~~ 
回复 支持 反对

使用道具 举报

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-13
在线时间
0 小时
 楼主| 发表于 2012-6-27 00:01:44 | 显示全部楼层
回复【5楼】lsj9383:
---------------------------------
多谢提示,改完后还是一样
不知道您有没有读过device ID?
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2012-6-27 11:55:04 | 显示全部楼层
回复【6楼】zhengchao20105:
---------------------------------
嗯~读过,读出来是9328..~~
回复 支持 反对

使用道具 举报

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-13
在线时间
0 小时
 楼主| 发表于 2012-6-27 20:38:01 | 显示全部楼层
回复【7楼】lsj9383:
---------------------------------
能不能将读ID的程序发过来参考一下,会用到串口中断吗?
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2012-6-27 23:21:09 | 显示全部楼层
回复【8楼】zhengchao20105:
---------------------------------
哦 你看嘛
#include<stm32f10x_lib.h>
#include"delay.h"
#include"usart.h"
#include"sys.h"
#define cs Cout(9)
#define rs Cout(8)
#define wr Cout(7)
#define rd Cout(6)

void init_LCD(void);
void wr_com(u8 data);
void wr_da(u16 data);    //注意数据时16位
void wr_reg(u8 com, u16 da);
u16 rd_reg(u8 com);
int main(void)
{
u16 id;

Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
init_LCD();
while(1)
{
delay_ms(50);
wr_reg(0x0000, 0x0001);
delay_ms(50);
id = rd_reg(0);
printf("LCD ID:%x\n", id);
delay_ms(1000);
}
}

void init_LCD(void)
{
RCC->APB2ENR |= 1 << 3 | 1 << 4;

RCC->APB2ENR |= 1 << 0; //开启辅助时钟
JTAG_Set(SWD_ENABLE);  //开启SWD                       

GPIOC->CRH &= 0xfffff000;
GPIOC->CRH |= 0x00000333;
GPIOC->CRL &= 0x00ffffff;
GPIOC->CRL |= 0x33000000;
GPIOC->ODR |= 0x07c0;

GPIOB->CRH = 0x33333333;
GPIOB->CRL = 0x33333333;
GPIOB->ODR = 0xffff;
}

void wr_com(u8 data)
{
rs = 0;
cs = 0;
GPIOB->ODR = data;;
wr = 0;
wr = 1;
cs = 1;
}

void wr_da(u16 data)
{
rs = 1;
cs = 0;
GPIOB->ODR;
wr = 0;
wr = 1;
cs = 1;
}

void wr_reg(u8 com, u16 da)
{
wr_com(com);
wr_da(da);
}

u16 rd_reg(u8 com)
{
u16 t;

wr_com(com);

GPIOB->CRH = 0x88888888;
GPIOB->CRL = 0x88888888;
GPIOB->ODR = 0xffff;

rs = 1;
cs = 0;

rd = 0;
rd = 1;

t = GPIOB->IDR;

cs = 1;

GPIOB->CRH = 0x33333333;
GPIOB->CRL = 0x33333333;
GPIOB->ODR = 0xffff;

return t;
}
回复 支持 反对

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2014-12-18
在线时间
6 小时
发表于 2015-11-7 12:49:09 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
  printf(" LCD ID:%x\r\n",lcddev.id); //打印LCD ID 
请教程序卡在这里了,为什么?
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2018-2-24
在线时间
44 小时
发表于 2018-2-26 22:10:59 | 显示全部楼层
正点原子 发表于 2015-11-9 23:14
回复【10楼】jianglg3:
---------------------------------
没初始化串口。

我也是在一个没有LCD函数的工程里添加了LCD函数,包含路径那些都没有问题。但是一运行LCD就是不亮。debug发现一直卡在LCD初始化里面。恰好看到这篇帖子,按您说的,把 uart_init(115200);        添加回去就好了。请问原子哥为什么LCD需要初始化串口并设置波特率呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 00:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表