通过研究主控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显示。
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显示。
相关文章推荐
- 通过研究主控IC为R61509V的彩色液晶屏 单片机控制3.2寸TFT(测试已通过)(一)
- 单片机控制LCD1602显示字符(测试通过)
- 单片机控制DS18B20自制简易电子温度计(测试通过)(二)
- 通过ESP8266手机或电脑浏览器网页能控制远程任意组任意路继电器开关并收发单片机指令 测试OK
- 通过ESP8266手机或电脑浏览器网页能控制远程任意组任意路继电器开关并收发单片机指令 测试OK
- 单片机控制DS18B20自制简易电子温度计(测试通过)(一)
- 单片机控制雷达测距模块HC-SR04测量距离(通过测试)
- 控制发送SMS信息的C51程序[GSM模块(M22)通过串口与单片机相连]
- 单片机读取SD卡中BMP图片文件并送往TFT彩屏上显示(测试成功)(二)
- js 控制textbox enter 回车 禁止提交功能(ie9,firefox,ie8,chrome测试通过)
- Android NDK——App端通过串口通信完成实时控制单片机上LED灯的颜色及灯光动画特效
- 单片机基于2.4G无线收发模块NRF24L01的无线通信(基本测试通过)
- 单片机基于2.4G无线收发模块NRF24L01的无线通信(基本测试通过)续
- CRC16 单片机版(C语言版) VC版 android版(java) 测试通过
- 通过MSP430F1232最小系统测试单片机AD10程序
- 【QA测试技术研究】性能测试场景设计--混合业务场景下的脚本比例控制
- 通过instruments针对IOS压力测试研究总结
- 基于C8051F040单片机的CAN总线测试模式研究
- 单片机读取SD卡中BMP图片文件并送往TFT彩屏上显示(测试成功)(一)