资源描述:
《12864高级应用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、玩转12864液晶(2)--显示图片,画点,画任意直线通过上一篇的实验,相信大家都掌握了显示字符的基本用法。下面我们来看一下12864液晶更高级的用法。首先是它的绘图功能。让我们先来显示一整副的图片吧,也就是128x64大小。在使用绘图功能时,先要打开扩充指令集,然后再打开绘图功能。接着就是送数据显示了。这里我们首先要弄明白ST7920的显示坐标关系。其显示坐标如下。从图中可以看出,X方向共有8个字(16个字节)Y方向共有0~31行分为上下两个屏。弄懂了之后我们就可以依照此坐标来显示一整屏的图片
2、了。随便用一个图片的提取转换软件,讲一副126X64大小的图片转换成字节数据,总共字节大小为128*64/8=1024个字节。下面我们来看看这个显示整屏图像的函数voidv_Lcd12864DrawPicture_f(unsignedcharcode*pPicture){unsignedchari,j,k;for(i=0;i<2;i++)//分上下两屏写{for(j=0;j<32;j++){v_Lcd12864SendCmd_f(0x80+j);//写Y坐标if(i==0)//写X坐标{v_Lc
3、d12864SendCmd_f(0x80);}else{v_Lcd12864SendCmd_f(0x88);}for(k=0;k<16;k++)//写一整行数据{v_Lcd12864SendData_f(*pPicture++);}}}v_Lcd12864SendCmd_f(0x30);}看看效果图片如下:显示一个人的图像下面来看看如何在任意一个位置显示或者是擦除一个点对于12864这种二值显示屏来说,其显示状态无外乎显示和不显示一个点这两种状态。而在任意位置画点,是我们随心所欲的画线,画圆,画
4、矩形的等GUI函数的基础。为了让这个位置有一个参考点,我们有必要定义一个坐标系在这里,我定义的坐标系如下0,0------------------------------------127,0
5、
6、
7、
8、
9、
10、
11、
12、0,63----------------------------------127,630,0代表屏幕的左上角,127,63代表屏幕的右下角。对于屏幕上面任意一个点,如果我们想要点亮它,必须先读出此点的状态,然后再修改该点,最后送出去,即读----修改----写。按照这个步骤,然后再运用C语
13、言中的位操作运算符可以很方便的完成画点的函数。由于画点函数涉及到读ST7920内部RAM的操作,因此,我们必须先要完成这个读数据的函数具体实现过程如下:unsignedcharu8_Lcd12864ReadByte_f(void){unsignedcharbyReturnValue;v_Lcd12864CheckBusy_f();io_LCD12864_DATAPORT=0xff;SET_DATASET_READCLR_ENSET_ENbyReturnValue=io_LCD12864_DATA
14、PORT;CLR_ENreturnbyReturnValue;}然后是画点的函数,其实现过程如下:voidv_Lcd12864DrawPoint_f(unsignedcharX,unsignedcharY,unsignedcharColor){unsignedcharRow,Tier,Tier_bit;unsignedcharReadOldH,ReadOldL;v_Lcd12864SendCmd_f(0x34);v_Lcd12864SendCmd_f(0x36);Tier=X>>4;Tier_b
15、it=X&0x0f;if(Y<32){Row=Y;}else{Row=Y-32;Tier+=8;}v_Lcd12864SendCmd_f(Row+0x80);v_Lcd12864SendCmd_f(Tier+0x80);u8_Lcd12864ReadByte_f();ReadOldH=u8_Lcd12864ReadByte_f();ReadOldL=u8_Lcd12864ReadByte_f();v_Lcd12864SendCmd_f(Row+0x80);v_Lcd12864SendCmd_f(
16、Tier+0x80);if(Tier_bit<8){switch(Color){case0:ReadOldH&=(~(0x01<<(7-Tier_bit)));break;case1:ReadOldH
17、=(0x01<<(7-Tier_bit));break;case2:ReadOldH^=(0x01<<(7-Tier_bit));break;default:break;}v_Lcd12864SendData_f(ReadOldH);v_Lcd12864SendData_f(ReadOldL);}