12864图片动画程序.docx
- 文档编号:7763254
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:17
- 大小:407.71KB
12864图片动画程序.docx
《12864图片动画程序.docx》由会员分享,可在线阅读,更多相关《12864图片动画程序.docx(17页珍藏版)》请在冰豆网上搜索。
12864图片动画程序
12864液晶从图像到动画
在开始之前你必须了解12864液晶的原理,我开始看原理的时候也看不懂,不要紧,我理解,但是你必须看,等你写程序的时候你还是要回头看的。
12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。
每个显示点对应一位二进制数,1表示亮,0表示灭。
存储这些点阵信息的RAM称为显示数据存储器。
要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。
图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。
由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8bits显示数据RAM。
芯片的结构一定要清楚!
点阵LCD的显示原理
在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。
实际上是用字模来显示一个字符的。
图1“A”字模图
而中文的“你”在字模中如图2所示:
图2.“你”字模图
注意:
可能这里你就不明白了,我曾经到论坛上问过,为什么上半屏垂直坐标是00——1F,水平坐标水平坐标分别为0X80+(00~07)。
画个图也许你会懂得这样就清楚了,其实只有两行生产的时候把本来右边的部分折到下边就形成了128*64,两个64*64液晶屏的组合。
图片显示芯片结构分块与汉字显示不一样
图象显示过程是这样的:
首先设置垂直地址,再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址,然后在每个地址里写入16位数据)。
绘图RAM的地址计数器(AC)只会对水平地址(X轴)自动加一,当水平地址=0FH时会重新设为00H
但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。
GDRAM的坐标地址与资料排列顺序如图5:
分上下屏写入。
/*================================================================
函数功能:
向12864中写入一幅图片
函数参数:
lcd_x为水平显示位置,lcd_y为垂直显示位置,
函数将12864屏分成上下两屏写入,上半屏LCD_x=0x80,下半屏lcd_x=0x88
=================================================================*/
voidwrite_image(uchar*p)
{
uchari,j,k;
lcd_x=0x80;
lcd_y=0x80;
for(i=0;i<2;i++)//分为上下两屏
{
for(j=0;j<32;j++)
{
write_lcd_cmd(lcd_y+j);
write_lcd_cmd(lcd_x);
for(k=0;k<16;k++)//写入显示数据
{
write_lcd_date(*p++);
}
}
lcd_x=0x88;
}
}
这里就到了写入图像函数的精华,了解这一步了,就成功了一大半,
图5:
垂直坐标:
上半屏00~1F,总共为32 ;水平坐标:
上半屏水平标分别为0X80+(00~07);下半屏00~1F, 下半屏水平坐标分别为0X88+(00~07) 。
/*汉字显示相信大家都没什么问题的,主要是图片,动画。
实验简介:
在12864液晶屏上指定的位置显示出自己想要的数字、字符或者汉字
插好液晶后如果显示字符不清楚,请调节12864液晶对比度调节电位器,顺时针
拧动直到液晶上面一行能显示出黑色的方格为止。
*/
#include
#include
typedefunsignedintuint;
typedefunsignedcharuchar;
/*TS12864A-3端口定义*/
#defineLCD_dataP0//数据口
sbitLCD_RS=P2^0;//寄存器选择输入
sbitLCD_RW=P2^1;//液晶读/写控制
sbitLCD_EN=P2^2;//液晶使能控制
ucharcodedis1[]={"WWW.WTC"};
ucharcodedis2[]={"电子设计大赛"};
ucharcodedis3[]={"武汉职院"};
ucharcodedis4[]={"好的选择好的开始"};
ucharIRDIS[2];
ucharIRCOM[4];
voidbeep();
voiddataconv();
voidlcd_pos(ucharX,ucharY);//确定显示位置
/*******************************************************************/
/**/
/*延时函数*/
/**/
/*******************************************************************/
voiddelay1ms()
{
uchara,b;
for(a=120;a>0;a--)
for(b=225;b>0;b--);
}
voiddelaynms(ucharn)
{
uchari;
for(i=0;i { delay1ms(); } } /*******************************************************************/ /**/ /*检查LCD忙状态*/ /*lcd_busy为1时,忙,等待。 lcd-busy为0时,闲,可写指令与数据。 */ /**/ /*******************************************************************/ bitlcd_busy() { bitresult; LCD_RS=0; LCD_RW=1; LCD_EN=1; delay1ms(); result=(bit)(P0&0x80); LCD_EN=0; return(result); } /*******************************************************************/ /**/ /*写指令数据到LCD*/ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ /**/ /*******************************************************************/ voidlcd_wcmd(ucharcmd) { while(lcd_busy()); LCD_RS=0; LCD_RW=0; LCD_EN=0; _nop_(); _nop_(); P0=cmd; delay1ms(); LCD_EN=1; delay1ms(); LCD_EN=0; } /*******************************************************************/ /**/ /*写显示数据到LCD*/ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ /**/ /*******************************************************************/ voidlcd_wdat(uchardat) { while(lcd_busy()); LCD_RS=1; LCD_RW=0; LCD_EN=0; P0=dat; delay1ms(); LCD_EN=1; delay1ms(); LCD_EN=0; } /*******************************************************************/ /**/ /*LCD初始化设定*/ /**/ /*******************************************************************/ voidlcd_init() { //LCD_PSB=1;//并口方式 lcd_wcmd(0x34);//扩充指令操作 delaynms(5); lcd_wcmd(0x30);//基本指令操作 delaynms(5); lcd_wcmd(0x0C);//显示开,关光标 delaynms(5); lcd_wcmd(0x01);//清除LCD的显示内容 delaynms(5); } /*********************************************************/ /**/ /*主程序*/ /**/ /*********************************************************/ main() { uchari; delaynms(10);//延时 lcd_init();//初始化LCD lcd_pos(0,0);//设置显示位置为第一行的第1个字符 i=0; while(dis1[i]! ='\0') {//显示字符 lcd_wdat(dis1[i]); i++; } lcd_pos(1,0);//设置显示位置为第二行的第1个字符 i=0; while(dis2[i]! ='\0') { lcd_wdat(dis2[i]);//显示字符 i++; } lcd_pos(2,0);//设置显示位置为第三行的第1个字符 i=0; while(dis3[i]! ='\0') { lcd_wdat(dis3[i]);//显示字符 i++; } lcd_pos(3,0);//设置显示位置为第四行的第1个字符 i=0; while(dis4[i]! ='\0') { lcd_wdat(dis4[i]);//显示字符 i++; } while (1); } /*********************************************************/ /**/ /*设定显示位置*/ /**/ /*********************************************************/ voidlcd_pos(ucharX,ucharY) { ucharpos; if(X==0) {X=0x80;} elseif(X==1) {X=0x90;} elseif(X==2) {X=0x88;} elseif(X==3) {X=0x98;} pos=X+Y; lcd_wcmd(pos);//显示地址 } 128*64的像素能显示的内容就有限,也无法要求它能多清楚,如果将一个彩色的图片转换为单色位图,效果就更差了,一般不用它来显示彩色的图片,如果真要用128*64的液晶显示,建议如下: 1.尽量选择颜色比较单一的图片,当然一种颜色的效果最好不过了; 2.图片不能选择的太大,要不缩小了就看不清楚了; 3.图片的调整: 1>调整图片的宽高比大致为2: 1; 2>将图片缩小到128*64像素; 3>保存为单色位图; 图片的大小缩放不太好操作,我通常是这样做的: 你用画图程序打开你要显示的图片后,首先要操作的查看属性(点击菜单栏的图像->属性,单位选择为像素后,宽高值就出来了),比如: 宽: 603,高: 444,这显然宽高比不是2: 1,你就要调整了,444*2=888,现在为603,所以888/603=1.47,所以宽要放大为147%(点击菜单栏的图像->拉伸/扭曲,在拉伸里面的水平处改为147),现在就调整为2: 1了;接下来就要将图片缩小到128*64像素,先计算缩放的比例,128/888=0.144,所以相同的操作(点击菜单栏的图像->拉伸/扭曲,在拉伸里面的水平处改为14,垂直里面也要改为14);最后就是保存为单色位图(文件->另存为->文件类型选择为: 单色位图(.bmp) 画 最后贴出“转”动画的代码。 #include #include #include #include #include #include #include #include #include #defineuintunsignedint #defineucharunsignedchar sbitlcd_en=P2^2; sbitlcd_rs=P2^0; sbitlcd_rw=P2^1; ucharlcd_x,lcd_y; voiddelay(uintz) { while(z--); } voidlcd_busy() { lcd_rs=0; lcd_rw=1; lcd_en=1; while(P0&0x80); lcd_en=0; } voidwrite_com(ucharcom) { lcd_busy(); lcd_rs=0; lcd_rw=0; lcd_en=0; P0=com; delay(100); lcd_en=1; delay(100); lcd_en=0; } voidwrite_data(uchardat) { lcd_busy(); lcd_rs=1; lcd_rw=0; lcd_en=0; P0=dat; delay(100); lcd_en=1; delay(100); lcd_en=0; } voidlcd_clear() { uchari,j,k; lcd_x=0x80; lcd_y=0x80; for(i=0;i<2;i++) { for(j=0;j<32;j++) { write_com(lcd_y+j); write_com(lcd_x); for(k=0;k<16;k++) { write_data(0); } } lcd_x=0x88; } } voidlcd_bmp(uchar*p) { uchari,j,k; lcd_x=0x80; lcd_y=0x80; for(i=0;i<2;i++) { for(j=0;j<32;j++) { write_com(lcd_y+j); write_com(lcd_x); for(k=0;k<16;k++) { write_data(*p++); } } lcd_x=0x88; } } voidinit() { write_com(0x36); delay(100); write_com(0x01); delay(100); } voidmain() { init(); while (1) { lcd_bmp(bmp0); lcd_bmp(bmp1); lcd_bmp(bmp2); lcd_bmp(bmp3); lcd_bmp(bmp4); lcd_bmp(bmp5); lcd_bmp(bmp6); } } 要看动画的效果请到优酷
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 12864 图片 动画 程序