本帖最后由 xzhihui 于 2013-4-8 18:39 编辑
这几个月来,学了不少东西,菜鸟要学习也要略作总结,免得忘得太快。
4.3寸的480*272 TFT显示。
TFT就是 薄膜场效应晶体管。液晶显示屏的一种。驱动芯片选用的是SSD1963,MCU是STM32103VET6。是在奋斗的V3板上实现的。
关于LCD显示,不得不说下LCD的初始化,也算是液晶屏的驱动吧。修改自奋斗板上的例程。
初始化分为几个步骤:
首先,先上电复位一下,奋斗板是用E1脚来控制的,代码如下:
GPIO_ResetBits(GPIOE, GPIO_Pin_1); //先置零
Delay(0xAFFF); //延时(我的延时函数是没有循环的,所以时间不久几微秒就可以了,)
GPIO_SetBits(GPIOE, GPIO_Pin_1 );//上电开启
Delay(0xAFFF); //再来一次
第二步,当然是PLL设置啦。代码如下:
LCD_WR_REG(0x00E2); //0XE2是设置PLL 的寄存器。
LCD_WR_Data(0x002c); //设置倍频数 M 0x2c for 8M
LCD_WR_Data(0x0002); //设置分频数 N
LCD_WR_Data(0x0004); //使能MN PLL = INCLK*(M+1) / (N+1) PLL 倍频到120M PLL=8*44/3=120M
设置完之后,还有使能PLL作为LCD的时钟,别忘记了
LCD_WR_REG(0x00E0); //0XE0是PLL使能寄存器
LCD_WR_Data(0x0001); //先开启PLL
Delay(0xAFFF); //略作延时
LCD_WR_REG(0x00E0); //还要一次
LCD_WR_Data(0x0003); // 使用 PLL作为时钟
Delay(0xAFFF); //嗯,这里需要休息一下
LCD_WR_REG(0x0001); // 软件复位
第三步,设置PCLK,也就是像素时钟,很重要哦。
LCD_WR_REG(0xE6); //嗯,没错 0XE6是设置像素时钟的寄存器
LCD_WR_Data(0x01); //我的屏幕是4.3寸,这个频率就可以了,如果屏幕比较大,有闪烁的话,可以再加大
LCD_WR_Data(0x93);
LCD_WR_Data(0xE0); //忘记说了,寄存器指令都是8位传输的,这里的像素时钟需要3个字节来设置,高位在前
第四步,设置LCD的显示模式,需要根据屏幕大小和LCD的电路控制方法相匹配,
这个要自己去看data sheet 了,备注不方便详细描叙
LCD_WR_REG(0x00B0); //设置LCD显示模式及分辨率
LCD_WR_Data(0x0018); // 使能FRC 0X0018 18bit LCD控制
LCD_WR_Data(0x0000); //TFT模式
LCD_WR_Data((HDP>>8)&0X00FF); //Set HDP 水平大小
LCD_WR_Data(HDP&0X00FF); //双字节,高位在前
LCD_WR_Data((VDP>>8)&0X00FF); //Set VDP 垂直尺寸
LCD_WR_Data(VDP&0X00FF);
LCD_WR_Data(0x0000); //RGB顺序串行TFT接口
LCD_WR_REG(0x00B4); //设置 水平显示时间参数
LCD_WR_Data((HT>>8)&0X00FF); //Set HT 水平总周期
LCD_WR_Data(HT&0X00FF);
LCD_WR_Data((HPS>>8)&0X00FF); //Set HPS 水平同步脉冲开始位
LCD_WR_Data(HPS&0X00FF);
LCD_WR_Data(HPW); //Set HPW 水平同步脉冲宽度
LCD_WR_Data((LPS>>8)&0X00FF); //Set LPS 显示开始位
LCD_WR_Data(LPS&0X00FF);
LCD_WR_Data(0x0000); //TFT mode下,如此设置
LCD_WR_REG(0x00B6); //设置 垂直显示时间参数
LCD_WR_Data((VT>>8)&0X00FF); //Set VT 垂直总周期
LCD_WR_Data(VT&0X00FF);
LCD_WR_Data((VPS>>8)&0X00FF); //Set VPS 垂直同步脉冲开始位
LCD_WR_Data(VPS&0X00FF);
LCD_WR_Data(VPW); //Set VPW垂直同步脉冲宽度
LCD_WR_Data((FPS>>8)&0X00FF); //Set FPS 显示开始位置
LCD_WR_Data(FPS&0X00FF);
LCD_WR_REG(0X0036); //设置从主机读取指令顺序,可以省略,上电默认为0
LCD_WR_Data(0X000);
LCD_WR_REG(0x00F0); //pixel data interface 设置像素数据接口为16位
LCD_WR_Data(0x003); //03为 565 的16位通讯。
第五步,可选。设置图形后处理。
LCD_WR_REG(0x0021); //进入图形颜色翻转模式
LCD_WR_REG(0x00BC);//设置图像后处理
LCD_WR_Data(0x0080);//对比度
LCD_WR_Data(0x0080);//亮度
LCD_WR_Data(0x0080);//饱和度值 //
LCD_WR_Data(0x0001);//处理机允许
最后一步,背光设置,也是屏幕亮起来的一步。
在设置之前呢,要记得先清理屏幕。不然显示出来的就是以前残留在LCD的像素数据。
TFT_CLEAR(0X00); //清屏函数,参数是颜色数值
背光设置
LCD_WR_REG(0x00BE); //set PWM控制
LCD_WR_Data(0x0006); //PWM频率 = PLL / (256* 0x06) /256
LCD_WR_Data(0x00ff); // PWM占空比设置
LCD_WR_Data(0x09); //DBC 控制PWM 使能
LCD_WR_Data(0xFF); //DBC手动亮度设置
LCD_WR_Data(0x00); //DBC 最小亮度设置
LCD_WR_Data(0x00); //Brightness prescaler :off
LCD_WR_REG(0xD4); //设置每个等级的电源阀值
//TH1 = display width * display height * 3 * 0.1 /16
//480*272 * 3 * 0.1 /16 =990H
LCD_WR_Data(0x00); //
LCD_WR_Data(0x09); //
LCD_WR_Data(0x90); //
//TH2 = display width * display height * 3 * 0.25 /16
//480*272 * 3 * 0.25 /16 =17E8H
LCD_WR_Data(0x00); //
LCD_WR_Data(0x17); //
LCD_WR_Data(0xE8); //
//TH3 = display width * display height * 3 * 0.6 /16
//480*272 * 3 * 0.6 /16 =3960H
LCD_WR_Data(0x00); //
LCD_WR_Data(0x39); //
LCD_WR_Data(0x60); //
LCD_WR_REG(0x00d0);//设置动态背光控制配置
LCD_WR_Data(0x000d); //使能
LCD到了这里就亮起来了,显示模块就可以正常工作了。
|