您的位置:首页 > 其它

通过研究主控IC为R61509V的彩色液晶屏 单片机控制3.2寸TFT(测试已通过) (二)

2014-09-21 18:22 295 查看
二、软件部分

1.概述

在看过王伟华老师的8小时玩转TFT后,我对TFT编程有了系统的了解,虽然老师说我们不用自己写驱动函数,因为有生产主控IC厂家提供,老师还说也不用我们写GUI(graphic user interface)函数,因为有生产TFT厂家提供。但我还是认为,有时我们什么都没有,而要使用这款彩屏怎么办呢?我相信没有摔倒过就学不会怎么站起来,所以我还是尝试自己完成所有工作,一来练习C语言,二来体会摔倒一次

老师的总体思想是:



同过将程序分层,可以模块化编程,既可以提高效率,又可以使程序显得有次序。

2.C语言编程

有了这个总体思路以后就是具体的编程工作了

1>驱动程序:

写16位数据:

void LCD_WRITEDATA16(unsigned int dashuju)//写16位数据

{

LCD_CS=0; //片选打开

LCD_RS=1; //数据

LCD_WR=0;

DATA=dashuju>>8;

LCD_WR=1;

***************************************************************************************(1)

LCD_WR=0;

DATA=dashuju;

LCD_WR=1;

LCD_CS=1;

}

写16位命令:

void LCD_WRITEINDEX16(unsigned int damingling)//写16位命令编号

{

LCD_CS=0; //片选打开

LCD_RS=0; //命令

LCD_WR=0;

DATA=damingling>>8;

LCD_WR=1;

***************************************************************************************(2)

LCD_WR=0;

DATA=damingling;

LCD_WR=1;

LCD_CS=1;

}

写完整控制命令:

void LCD_WRITEINS(unsigned int index,unsigned int codes)//写完整控制命令

{

LCD_WRITEINDEX16(index);

delayms(3);

LCD_WRITEDATA16(codes);

}

void delayms(unsigned char time)

{

unsigned char count;

while(time--)

{

for(count=0;count<50;count++);

}

IC初始化:

void LCD_INITIALIZE()////按照主控芯片R61509V的power supply on sequence 进行配置

{

LCD_WR=1;

LCD_RD=1;

LCD_CS=0;

LCD_RST=1;

delayms(10);

LCD_RST=0;

delayms(10);

LCD_RST=1;

LCD_WRITEINS(0x00,0x00);delayms(5); //四次写0x00

LCD_WRITEINS(0x00,0x00);delayms(5);

LCD_WRITEINS(0x00,0x00);delayms(5);

LCD_WRITEINS(0x00,0x00);delayms(5);

LCD_WRITEINS(0X400,0X6200); //base image 设置 400线

LCD_WRITEINS(0X010,0X0019); //面板频率

LCD_WRITEINS(0X100,0X330);//设置电源控制,平衡显示与电消耗

LCD_WRITEINS(0x102,0xd1b0);delayms(5);//PSON,PON 都设为1,电源供应打开

LCD_WRITEINS(0x280,0xbf00);delayms(5);//VCM

delayms(100);

LCD_WRITEINS(0X0003,0X5030);delayms(5);//RGB设为5-6-5模式

delayms(3);

LCD_WRITEINS(0X0001,0X0100);//When SS = “1” and BGR = “1”, RGB dots are assigned one to one from S720 to S1.

LCD_WRITEINS(0X007,0X0100);//测试显示控制base image的关与开

delayms(3);

delayms(3);

LCD_WRITEINS(0X200,0X00); //设置RAM ADDRESS

delayms(3);

LCD_WRITEINS(0X201,0X00);

delayms(3);

delayms(3);

LCD_WRITEINS(0X401,0X01); //设置base image 滚动模式,开启滚动

delayms(3);

LCD_WRITEINS(0x0C,0x0000);delayms(5); //外部显示接口控制,默认值

LCD_WRITEINS(0x090,0x8000);delayms(5); //窗特征控制,FMARK interface

LCD_WRITEINS(0X404,0X00);delayms(3); //从0线开始滚

LCD_WRITEINS(0X502,0X5f);delayms(3);

LCD_WRITEINS(0x200,0x0000);delayms(5);//RAM address 设置

LCD_WRITEINS(0x201,0x0000);delayms(5);

delayms(500);

LCD_WRITEINDEX16(0X202);delayms(200);

}

2>GUI函数

清屏程序:

void LCD_CLEAN() //清除屏幕函数

{

unsigned char i,a;

unsigned int j;

LCD_WINDOWADDRESS(0x00,0xef,0x00,0x18f);

delayms(100);

for(j=1;j<=400;j++)

{

for(i=1;i<=240;i++)

{

LCD_WRITEDATA16(0XF800);

for(a=0;a<=5;a++);

}

}

设置窗口地址:

void LCD_WINDOWADDRESS(unsigned int x1,unsigned int x2,unsigned int y1,unsigned int y2)//设置窗地址

{

LCD_WRITEINS(0x200,x1);

delayms(3);

LCD_WRITEINS(0x201,y1);

delayms(3);

LCD_WRITEINS(0x210,x1);

delayms(3);

LCD_WRITEINS(0x211,x2);

delayms(3);

LCD_WRITEINS(0x212,y1);

delayms(3);

LCD_WRITEINS(0x213,y2);delayms(3);

LCD_WRITEINDEX16(0x0202);delayms(60);//准备写

}

写入汉字程序:

void LCD_CHINESE(unsigned char zimo[720],unsigned int backcolor) //写入字符

{

unsigned char j,flag=0;

unsigned char *point;

unsigned int i,x1=0x00,x2=0x17,y1=0x00,y2=0x17;

unsigned int colors[10]=

{

0xf800,0x07e0,0x001f,0xffe0,0x0000,0x07ff,0xf81f,0xb81f,0x7f7,0xfec0

};

point=&zimo[0];

for(i=1;i<=720;i++,point++)

{

for(j=0;j<=7;j++)

{

if((*point<<j)&0x80)

{

LCD_WRITEDATA16(colors[flag]);

delayms(1);

}

else

{

LCD_WRITEDATA16(backcolor);

delayms(1);

}

}

if(i%72==0)

{

x1=x1+24;x2=x2+24;y1=y1+24;y2=y2+24;

flag=flag+1;

LCD_WINDOWADDRESS(x1,x2,y1,y2);

}

}

}

3>用户应用程序

void main()

{

LCD_INITIALIZE();//初始化

delayms(3);//延时

LCD_CLEAN();//清屏

delayms(3);

LCD_WINDOWADDRESS(0x00,0x17,0x00,0x17);//设置窗口地址

LCD_CHINESE(hao,0XFFFF);//写入汉字

while(1);//等待

}

3.编程调试中遇到的问题

1>写指令中,写完高字节后要立即写低字节,在文中(1)、(2)处不要使用delay函数延时,否则出错

2>注意按照Power supply on sequence 次序来初始化IC,其中必须设置部分要进行设置,否则不能正常操作

3>注意C语言中位操作指令特点,如>>指令,是不循环的往右移位,空出左位补零

4>RAM不够时,若想使用扩展了的RAM ,可以设置keil中target1来选择XDATA。

也可以将较大的数组定义在ROM中,这样就能节省RAM,如定义数组时:

const unsigned char code chinese[720]={省略};注意变量前加code

4.调试照片:



因为 ROM不够,只能显示不多的汉字了,下次将会学习从SD卡读入数据在TFT显示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐