怎样在点阵屏上绘图——基于LCD12864【三】.doc_第1页
怎样在点阵屏上绘图——基于LCD12864【三】.doc_第2页
怎样在点阵屏上绘图——基于LCD12864【三】.doc_第3页
怎样在点阵屏上绘图——基于LCD12864【三】.doc_第4页
怎样在点阵屏上绘图——基于LCD12864【三】.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

怎样在点阵屏上绘图基于LCD12864【三】 专业 2008-09-27 16:42 阅读122评论0 字号: 大大 中中 小小 3.4我行我素 前面我们说过一个函数: voidDispBITMap(constchar*String,charStringLength,charX,charY,charDispModel); 借助这个函数,我们很容易把一个定义好的图片(字模)显示出来。但是,这显然太中规中矩了一点。简单的应用,如果我们想做一个图片在屏幕上来回弹的经典屏保效果就很恼火(恼火是四川话麻烦的意思)。显然,在屏幕的任意位置显示图片就成了急需解决的问题。 一种基本思想就是,我们在系统的某一个地方再开辟一个显示缓冲区,通过一点点计算,把图片影响到的地方都改写好,然后直接把这块缓冲区影射到原先的显示缓冲中,或者干脆直接显示出来。怎么,还是不懂?好吧,这样给你打一个比方:12864的现存结构是以纵向的8个点为一个字节,如果我们想在以8为倍数的行开始(单位是像素)显示一个8*n的字模,那么只需要简单得调用本节开始时后提到的函数把字模送过去就可以了;But,如果我们想在别的位置(显然只有行是问题,对于12864来说,列是很容易设置的),显示这个字符呢? 你可以自己先思考下下。 对于一个只有1K大小连基本显示缓冲区都开不起的M8来说,你别指望他还能再凭空找出一块地方给你做什么预处理缓冲,问题是,有必要么?实际上,我们每次进行图片变换牵涉到的显存是有限的。比方说,我们要处理一个8*n的字符,那么每次需要参与处理的字节最多只有(8/8)+1个;我们需要处理一个16*n的字符,那么每次需要参与处理的字节最多只有(16/8)+1个。如果需要图片在任意位置显示,那么需要参与计算的字节只有(Y/8)+1个。那么我很容易把缓冲用的显示存储单元数量减少到一个可以接受的范围,比方说12864的8个。 计算的原理很简单,我们可以很容易写出他的通用函数(以下函数只是伪代码): #defineDISP_Model_Draw0x01/覆盖 #defineDISP_Model_AND0x00/印花 #defineDISP_Model_Not0x02/反相 voidshowPicture(constchar*String,charLength,charHeight,charX,charY,DispModel) charTempRAM2=0,0;/声明一个显示缓冲,因为是一个一个的处理,所以最多只需要2个字节,但是对于画线函数,就不是这样了 chara=0,b=0,n=0; charTemp=0; if(Y-(Y33) /普通情况 代码忽略 return; /需要处理的情况 for(a=0;aHeight;a+) for(b=0;b33);/这一行明显示伪代码哈 TempRAM1=getRAM(X,(Y+a)3)+1); switch(DispModel) caseDISP_Model_Draw: for(n=0;n8-Temp;n+) if(Stringn7) TempRAM0|=(1(n+Temp); else TempRAM0&=(1(n+Temp); for(n=0;nTemp;n+) if(Stringn7) TempRAM1|=(1n); else TempRAM1&=(1=4) for(n=0;n4;n+) LOCATE(n+1,1); PRINT(MenuPointDisplayPoint.DisplayString); if(DisplayPoint)=UserChoose) BOX(1,n*16+1,126,(n+1)*16-2,1,1); DisplayPoint+=1; if(DisplayPoint)=(MaxItems) DisplayPoint=0; else for(n=0;nMaxItems;n+) LOCATE(n+1,1); PRINT(MenuPointDisplayPoint.DisplayString); if(DisplayPoint)=UserChoose) BOX(1,n*16+1,126,(n+1)*16-2,1,1); DisplayPoint+=1; if(DisplayPoint)=(MaxItems) DisplayPoint=0; /BOX(0,0,127,63,2,2); /* *函数说明:获得键值函数* */ shortGetKeyNum(void) shortTempKeyNum=0; TempKeyNum=F_Key_Scan();/获取按键值 *P_IOA_Dir=0x01ff; *P_IOA_Attrib=0x01ff; *P_IOA_Data=0x01ff; returnTempKeyNum; /* *函数说明:主函数* */ intmain() shortKeyNum=0xff; SystemInitialation();/系统初始化 ShowMenu(); while(1) ClearWatchDog();/喂狗 KeyNum=GetKeyNum();/获取按键值 /*目录操作*/ /* *按键说明* *-* *K1UP(向上)* *K5Down(向下)* *K2Esc(后退)* *K6Enter(确定)* *K3返回根目录* */ if(KeyNum!=0xff) ShowMenu(); switch(KeyNum) caseUP: UserChoose-; if(UserChoose0) UserChoose=MaxItems-1; break; caseEsc: if(MenuPoint0.ParentMenus!=&Null) MenuPoint=MenuPoint0.ParentMenus; UserChoose=0; DisplayStart=0; break; caseDown: UserChoose+; if(UserChoose=MaxItems) UserChoose=0; break; caseEnter: if(MenuPointUserChoose.Subs!=NullSubs) (*MenuPointUserChoose.Subs)(); elseif(MenuPointUserChoose.ChildrenMenus!=&Null) MenuPoint=MenuPointUserChoose.ChildrenMenus; UserChoose=0; DisplayStart=0; break; caseReset: MenuPoint=MainMenu; UserChoose=0; DisplayStart=0; break; if(UserC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论