这个SSD1289折腾了我很久,淘宝卖家给的源程序就有问题,屏怎么着都不能正常运行起来,怀疑屏问题,赶紧上坛子里下了个UGI的可执行文件下载进去,证明屏是好的,只要屏是好的,那就好办,慢慢来怎能把它弄好。于是接着在坛子里找SSD1289的驱动代码,总算能打点划线了,可是就是不能显示字符,看着各种代码,那个凌乱啊,,还是别偷懒了,好好看数据手册吧,,于是,,,SSD1289的数据手册有点坑爹,,于是,,看完之后,自己重新写代码,,,终于弄好了,,上图
这个是以横屏和竖屏两种方式显示的矩形、圆和直线
接下来图片显示,上张小清新的照片
再上一张,显示字符,横竖屏显示、有无底色显示
上一张群魔乱舞的给大家
可执行文件就不上了,下回我把SSD1289的数据手册总结的知识点和LCD的驱动整理一下发上来。
太晚了,,真的该睡觉了。。
前些日子LCD试验的一些小心的给大家分享一下。这里主要介绍一下寄存器和开窗、横屏竖屏的设置问题。
R00h 晶振使能,0x0001打开晶振,0x0000关闭晶振。
R01h(6B3F 293F 2B3F 6B3F 7A3F)我用的是2B3F
REV:控制液晶显示的反转,等于0时反转;
CAD:建立基于保留电容配置的液晶面板,0为常见模式,1为门模式
BGR:0为RGB数据模式;1为BGR数据模式
SM:栅极扫描模式,0为左右交换扫描;1为左扫描再右扫描
TB:选择栅极驱动器输出的移位方向。TB=1时G0到G319;TB=0时G319到G0;也就是说TB可以控制显示的上下反转(自我观点)。
RL:选择源极驱动器输出的移位方向。RL=1时S0到S319;RL=0时S319到S0;也就是说RL可以控制显示的左右反转(自我观点)。
寄存器的其它位默认3F处理。
R02h LCD驱动计数控制。默认0000处理。
R03h 官方默认的事6664,我随大流家用的是A8A4
DCT[3:0]:设置8色模式下升压电路的工作频率。
BT[2:0]:控制升压电路升压因子。
DCT[3:0]:设置256K色模式下升压电路的工作频率。
AP[2:0]:控制电流的。
R05h-R06h 比较寄存器。这个就用默认的0000h处理。
R07h 显示控制,配合部分屏显示应用。
VLE[2:1]:当VLE1=1或者VLE2=1时(只开了一个屏),屏的垂直滚动由R41寄存器的VL17-0控制;当VLE1=1和VLE2=1时(开了两个屏),第一屏和第二屏的垂直滚动分别由VL1[8:0]和VL2[8:0]控制。
CM:8色模式设置。CM=1,8色模式打开;CM=0,8色模式关闭
R0Bh 帧扫描周期控制,官方默认为5308h
F=Fosc/(DIV[1:0]*(RTN[3:0]+16)*(MUX[8:0]+VBP[7:0]+VFT[7:0]+3))
其中MUX[8:0]=319;官方默认为R0Bh=5308h,得出F=65。
R0Ch:电源控制2,官方给的建议值是0004h,也有用0000h的,试了一下都行。
R0Dh:电源控制3,官方给的建议值是0009h
R0Eh:电源控制4,官方给的建议值是3200h
R0Fh:栅极扫描开始地址。G0—G319
R10h:睡眠设置。SLP=1,进入睡眠模式;SLP=0,离开睡眠模式
R11h
VSMode:当VSMode=1,Dmode[1:0]=”00”,帧频率由VSYNC.决定。
DFM[1:0]:设置颜色显示模式FM[1:0]=”11”,65K色。FM[1:0]=“10”,262K色。
OEDef:OEDef=1,OE决定显示窗口;OEDef=0,由R4Eh和R4Fh决定显示窗口
WMode:设置数据写入方式。0,正常数据线;1,常规借口
DMode[1:0]:这个设置帧频率的,写“00”即可
TY[1:0]:RAM数据吸入的三种类型,B模式没的选。
ID[1:0]和AM是设置GDDRAN地址计数器的计数方式的。红色标记为常用模式。
R15h:常用接口控制,这个好像没用到
R16h:
XL[7:0]:设置每行有效像素的数目。每行有效像素数等于到XL[7:0]+1。默认为EF
HBP[7:0]:设置HSYNC下降沿到第一个有效数据的延迟时间。默认为1C
R17h:
VFP[6:0]:设置下一帧从最后有效的行到VSYNC下降沿的延迟时间。
VBP[7:0]:设置VSYNC下降沿到第一个有限行的延迟时间。
R23h-R24h:RAM写入数据屏蔽。默认0000h处理。
R30h-R3Bh:伽马控制。与我用的没多大关联,这个没细看。
R41h-R42h:垂直滚动控制,与R07配合使用。如果只开一屏的话就默认0000h处理吧。
R44h:水平RAM的起始-结束地址位置 (00~EF)
R45h:垂直RAM的起始地址 00
R46h:垂直RAM的结束地址 13F‘
R44h-R46h开窗用的,后面细讲。
R48h:第一个局部显示的起始位置 SS1[8:0]
R49h:第一个局部显示的结束位置SE1[8:0] SS1<SE1<13EF
R4Ah-R4Bh:第二局部显示起始、结束位置
R4fh:设置GDDRAM Y的计数地址。
R4eh:设置GDDRAM X的计数地址。
R4eh-R4fh实际上就是设置光标。
R25h:帧频率控制。我用的是0x8000h,红色标记的
LCD_WriteReg(0x0000,0x0001);//打开晶振
LCD_WriteReg(0x0003,0xA8A4);//0xA8A4
LCD_WriteReg(0x000C,0x0000);
LCD_WriteReg(0x000D,0x080C);
LCD_WriteReg(0x000E,0x2B00);
LCD_WriteReg(0x001E,0x00B0);
LCD_WriteReg(0x0001,0x2B3F);//驱动输出控制320*240 0x6B3F 293F 2B3F 6B3F 7A3F
LCD_WriteReg(0x0002,0x0600);
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0011,0x6070);
LCD_WriteReg(0x0005,0x0000);
LCD_WriteReg(0x0006,0x0000);
LCD_WriteReg(0x0016,0xEF1C); //设置每行有效像素的数目。每行有效像素数等于到XL[7:0]+1
LCD_WriteReg(0x0017,0x0003);
LCD_WriteReg(0x0007,0x0233); //0x0233
LCD_WriteReg(0x000B,0x5308); //帧周期控制 65
LCD_WriteReg(0x000F,0x0000); //栅极扫描开始地址
LCD_WriteReg(0x0041,0x0000); //垂直滚动控制
LCD_WriteReg(0x0042,0x0000); //垂直滚动控制
LCD_WriteReg(0x0048,0x0000); //第一个局部显示的起始位置 SS1[8:0]
LCD_WriteReg(0x0049,0x013F); //第一个局部显示的结束位置SE1[8:0] SS1<SE1<13EF
LCD_WriteReg(0x004A,0x0000); //第二个局部显示的起始位置
LCD_WriteReg(0x004B,0x0000); //第二个局部显示的结束位置
LCD_WriteReg(0x0044,0xEF00); //水平RAM的起始-结束地址位置 (00~EF)
LCD_WriteReg(0x0045,0x0000); //垂直RAM的起始地址 00
LCD_WriteReg(0x0046,0x013F); //垂直RAM的结束地址 13F
LCD_WriteReg(0x0030,0x0707);
LCD_WriteReg(0x0031,0x0204);
LCD_WriteReg(0x0032,0x0204);
LCD_WriteReg(0x0033,0x0502);
LCD_WriteReg(0x0034,0x0507);
LCD_WriteReg(0x0035,0x0204);
LCD_WriteReg(0x0036,0x0204);
LCD_WriteReg(0x0037,0x0502);
LCD_WriteReg(0x003A,0x0302);
LCD_WriteReg(0x003B,0x0302);
LCD_WriteReg(0x0023,0x0000); //RAM写入数据
LCD_WriteReg(0x0024,0x0000); //RAM写入数据
LCD_WriteReg(0x0025,0x8000); //帧频率 510K
LCD_WriteReg(0x004f,0); //设置GDDRAM Y的计数地址
LCD_WriteReg(0x004e,0); //设置GDDRAM X的计数地址
接下来说横屏竖屏显示设置
横屏竖屏的设置一个要用到这几个寄存器:R11h、R4eh、R4fh、R44h、R45h、R46h。(R44h-R46h只有在你开窗了的才需要设置,画点的话可以不用设置。)
R11h中的ID[1:0]和AM设置GDDRAN地址计数器的计数方式。从上面的图中,红色标记的两种模式就是我们所谓的竖屏和横屏。
1、AM=0、ID=11,竖屏
接下来的设置
R4fh:GDDRAM Y的计数地址。
R4eh:GDDRAM X的计数地址。
从上图看以看出竖屏的话没有坐标系的变化,
LCD_WriteReg(0X004E, Xpos);
LCD_WriteReg(0X004F, Ypos);
直接写入你要设定的地址即可,(Xpos,Ypos)为坐标。
如果你开窗了的话也可以直接写入你要开窗的起始地址就OK了
LCD_WriteReg(0x0044,xs+(xe<<8));
LCD_WriteReg(0x0045,ys);
LCD_WriteReg(0x0046,ye);
(xs,ys)为起始地址,(xe,ye)结束地址
2、AM=1、ID=01,横屏
接下来的设置
R4fh:GDDRAM Y的计数地址。
R4eh:GDDRAM X的计数地址。
从上图可以就看出横屏的坐标系有了变化,所以坐标系要变换一下。
LCD_WriteReg(0X004E, Ypos);
LCD_WriteReg(0X004F, 319-Xpos);
(Xpos,Ypos)为坐标。
如果你开窗了的话
LCD_WriteReg(0x0044,ys+(ye<<8)); ;
LCD_WriteReg(0x0045,319-xe);
LCD_WriteReg(0x0046,319-xs);
(xs,ys)为起始地址,(xe,ye)结束地址。
明天要放假了,后面的我慢慢补上
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |