《12864的程序绘图.字符.docx》由会员分享,可在线阅读,更多相关《12864的程序绘图.字符.docx(10页珍藏版)》请在第一文库网上搜索。
1、玩转12864液晶(1)-显示字符在我们常用的人机交互显示界面中,除了数码管,1ED,以及我们之前已经提到的1CD1602之外,还有一种液晶屏用的比较多。相信接触过单片机的朋友都知道了,那就是12864液晶。顾名思义,12864表示其横向可以显示128个点,纵向可以显示64个点。我们常用的12864液晶模块中有带字库的,也有不带字库的,其控制芯片也有很多种,如KSO108T6963,ST7920等等。在这里我们以ST7920为主控芯片的12864液晶屏来学习如何去驱动它。(液晶屏采用金鹏的OCMJ4X8C)关于这个液晶屏的更多信息,请参考它的DATASHEET,附件中有下载。我们先来了解一下它
2、的并行连接情况。下面是电路连接图从上面的图可以看出,液晶模块和单片机的连接除了PO口的8位并行数据线之外,还有RS,RW,E等几根线。其中R/S是指令和数据寄存器的选择控制线(串行模式下为片选),R/W是读写控制线(串行模式下是数据线),E是使能线(串行模式下为时钟线)。通过这几根控制线和数据线,再结合它的时序图,我们就可以编写出相应的驱动程序啦。看看并行模式下的写时序图:根据这个时序图,我们就可以写出写数据或者写命令到1CD12864液晶的子程序。读时序图如下:根据这个时序图我们就可以从1CD12864液晶模块内部RAM中读出相应的数据,我们的忙检测函数就是根据这个时序图写出来的。以及后面章
3、节中讲的画点函数等都要用到读时序。有了这两个时序图,然后我们再看看OCMJ4X8C的相关指令集,就可以编写出驱动程序了。这里要注意的是指令集分为基本指令集和扩充指令集,其中扩充指令集主要是与绘图相关,在此后的章节中会有相应的介绍。下面让我们根据这些编写出它的驱动程序吧。我的硬件测试条件为:STC89C516(11.0592MHz)+OCMJ4X8C实际显示效果图片如下:程序部分如下,请结合液晶模块的DATASHEET看程序,这样能够更加快速的弄懂程序的流程。大致有如下几个函数:写数据,写指令,忙检测,初始化,指定地址显示字符串等等。1. #inc1udereg52.h2. #inc1udein
4、trins.h3. sbitio_1CD12864_RS=P10;4. sbitio_1CD12864_RW=P11;5. sbitio_1CD12864_EN=P12;6. #defineio_1CD12864_DATAPORTPO7. #defineSET_DATAio_1CDI2864_RS=1;8. #defineSETJNCio_1CD12864_RS=0;9. #defineSET.READio_1CD12864.RW=1;10. #defineSET_WRITEio_1CD12864_RW=0;11. #defineSET_ENio_1CD12864.EN=1;12. #defi
5、neC1R_ENio_1CD12864_EN=0;13. voidVJ1Cd12864CheCkBusy_f(void)忙检测函数14. (15. unsignedintnTimeOut=0;16. SETJNC17. SET.READ18. C1R_EN19. SET_EN20. whi1e(io_1CD12864_DATAPORT&0x80)&(+nTimeOut!=0);21. C1R_EN22. SETJNC23. SET_READ24. 25. voidv_1cd12864SendCmd_f(unsignedcharbyCmd)发送命令26. 27. v_1cd12864CheCkB
6、usy_f();28. SETJNC29. SET_WRITE30. C1R_EN31. io_1CD12864_DATAPORT=byCmd;32. _nop_();33. _nop_();35.SET_EN36._nop_();37._nop_();38.C1R_EN39.SET_READ40.SETJNC41.)42.voidv_1cd12864SendData_f(unsignedcharbyData)发送数据43.(44.v_1cd12864CheckBusy_f();45.SET_DATA46.SET_WRITE47.C1R_EN48.io_1CD12864_DATAPORT=by
7、Data;49.-op-0;50.-P-();51.SET_EN52._nop_();53.-op-0;54.C1R_EN55.SET_READ56.SETJNC57.58.)59.voidv_De1ayMs_f(unsignedintnDe1ay)延时60.(61.unsignedinti;62.for(;nDe1ay0;nDe1ay)63.(64.for(i=125;i0;i-);65.)66.67.168.voidv_1cd12864Init_f(void)初始化69.(70.v_1cd12864SendCmd.f(0x30);基本指令集71.v_De1ayMs_f(50);72.v_1
8、cd12864SendCmd.f(0x01);/清屏73.v_De1ayMs_f(50);74.v_1cd12864SendCmd.f(0x06);光标右移75.v_De1ayMs_f(50);76.v_1cd12864SendCmd_f(OxOc);开显示77.78.voidv_1cd12864SetAddress_f(unsignedcharx,y)地址转换79.(80.unsignedcharbyAddress;81.switch(y)82. 83. caseO:byAddress=Ox8O+x;84. break;85. case1:byAddress=0x90+x;86. break
9、;87. case2:byAddress=0x88+x;88. break;89. case3:byAddress=0x98+x;90. break;91. defau1t:92. break;93. 94. v_1cd12864SendCmd_f(byAddress);95. )96. voidv_1cd12864PutString_f(unsignedcharx,unsignedchary,unsignedchar*pData)97. 98. v_1cd12864SetAddress_f(x,y);99. whi1e(*pData!=0)100. 101. v_1cd12864SendDa
10、ta_f(*pData+);102. 103. 104. voidmain(void)105. )106. v_1cd12864Init_f();107. v_1cd12864PutString_f(0,0,”电子工程师之家”);108. v_1cd12864PUtString_f(2,1J,欢迎光临”);109. v_1cd12864PutString_f(0,2,*1CD12864ST7920*);110. v_1cd12864PutString_f(0,3,*oO”);111. whi1e(1);112. 玩转12864液晶显示图片,画点,画任意直线通过上一篇的实验,相信大家都掌握了显示
11、字符的基本用法。下面我们来看一下12864液晶更高级的用法。首先是它的绘图功能。让我们先来显示一整副的图片吧,也就是128x64大小。在使用绘图功能时,先要打开扩充指令集,然后再打开绘图功能。接着就是送数据显示了。这里我们首先要弄明白ST7920的显示坐标关系。其显示坐标如下。从图中可以看出,X方向共有8个字(16个字节)Y方向共有031行分为上下两个屏。弄懂了之后我们就可以依照此坐标来显示一整屏的图片了。随便用一个图片的提取转换软件,讲一副126X64大小的图片转换成字节数据,总共字节大小为128*64/8=1024个字节。下面我们来看看这个显示整屏图像的函数voidv_1cd12864Dr
12、awPicture_f(unsignedcharcode*pPicture)(unsignedchari,j,k;for(i=0;i2;i+)分上下两屏写for(j=0;j32;j+)(v_1cd12864SendCmdJ(0x80+j);写Y坐标if(i=0)写X坐标v_1cd12864SendCmdJ(0x80);)e1sev_1cd12864SendCmdJ(0x88);)for(k=0;k16;k+)写一整行数据v_1cd12864SendData_f(*pPicture+);)v_1cd12864SendCmd_f(0x30);看看效果图片如下:显示一个人的图像下面来看看如何在任意一
13、个位置显示或者是擦除一个点对于12864这种二值显示屏来说,其显示状态无外乎显示和不显示一个点这两种状态。而在任意位置画点,是我们随心所欲的画线,画圆,画矩形的等GU1函数的基础。为了让这个位置有一个参考点,我们有必要定义一个坐标系在这里,我定义的坐标系如下0,0127,00,63127,63OQ代表屏幕的左上角,127,63代表屏幕的右下角。对于屏幕上面任意一个点,如果我们想要点亮它,必须先读出此点的状态,然后再修改该点,最后送出去,即读-修改一写。按照这个步骤,然后再运用C语言中的位操作运算符可以很方便的完成画点的函数。由于画点函数涉及到读ST7920内部RAM的操作,因此,我们必须先要完
14、成这个读数据的函数具体实现过程如下:unsignedcharu8_1cd12864ReadByte_f(void)(unsignedcharbyReturnVa1ue;v_1cd12864CheckBusy_f();io_1CD12864_DATAPORT=Oxff;SET_DATASET_READC1R_ENSETENbyReturnVa1ue=io_1CD12864_DATAPORT;C1R_ENreturnbyReturnVa1ue;然后是画点的函数,其实现过程如下:voidv_1cd12864DrawPoint_f(unsignedcharX,unsignedcharY,unsignedcharCo1or)(unsignedcharRow,Tier,Tier_bit;unsignedcharReadOIdH,ReadOId1;v_1cd12864SendCmd_f(0x34);v_1cd12864SendCmdJ(0x36);Tier=X4;Tier_bit=X&OxOf;if(Y32)Row=Y;)e1seRow=Y-32;Tier+=8;)v_1cd12864SendCmd_f(Row+0x80);