找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4594|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机12864大液晶屏proteus仿真

[复制链接]
跳转到指定楼层
楼主
51单片机12864大液晶屏proteus仿真
这里的液晶屏是LGM12641BS1R,共享资源,仅供学习参考。



单片机源程序:
  1. //*************************************************************************************************
  2. //*                                                                                                                                                                                                  *
  3. //*                         ******************************LCD12864驱动程序**************************                          *
  4. //*                                                                                                                                                                                                  *
  5. //*************************************************************************************************

  6. //*************************************************************************************************
  7. //*                                                                                                                                                                                                  *
  8. //*                         ******************************头文件及宏定义**************************                                  *
  9. //*                                                                                                                                                                                                  *
  10. //*************************************************************************************************
  11. #include <at89x51.h>

  12. #define        RST P2_0
  13. #define        E P2_1
  14. #define        RW P2_2
  15. #define        DI P2_3
  16. #define        CS1 P2_5
  17. #define        CS2        P2_4
  18. #define        LCDPORT P0


  19. #define BUSYSTATUS P0_7                                  //忙状态位。
  20. //#define DISONSTATUS P0_5                          //显示开关状态位。
  21. //#define RSTSTATUS P0_4                          //复位状态位。


  22. #define LCDSTARTROW 0xC0                          //设置起始行指令。
  23. #define LCDPAGE 0xB8                                  //设置页指令。
  24. #define LCDLINE 0x40                                  //设置列指令。




  25. //*************************************************************************************************
  26. //*                                                                                                                                                                                                  *
  27. //*                         ********************************读忙标志位*********************************                  *
  28. //*                                                                                                                                                                                                  *
  29. //*************************************************************************************************
  30. bit bCheckBusy()
  31. {
  32.         LCDPORT=0xFF;
  33.         RW=1;
  34.         DI=0;
  35.         E=1;
  36.         E=0;
  37.         return BUSYSTATUS;
  38. }

  39. //*************************************************************************************************
  40. //*                                                                                                                                                                                                  *
  41. //*                         ********************************写数据*********************************                          *
  42. //*                                                                                                                                                                                                  *
  43. //*************************************************************************************************
  44. void vWriteData(unsigned char ucData)
  45. {
  46.         while(bCheckBusy());
  47.         LCDPORT=0xFF;

  48.         RW=0;
  49.         DI=1;
  50.         LCDPORT=ucData;
  51.         E=1;
  52.         E=0;
  53. }

  54. //*************************************************************************************************
  55. //*                                                                                                                                                                                                  *
  56. //*                         ********************************写指令*********************************                          *
  57. //*                                                                                                                                                                                                  *
  58. //*************************************************************************************************
  59. void vWriteCMD(unsigned char ucCMD)
  60. {
  61.         while(bCheckBusy());
  62.         LCDPORT=0xFF;

  63.         RW=0;
  64.         DI=0;
  65.         LCDPORT=ucCMD;
  66.         E=1;
  67.         E=0;
  68. }

  69. //*************************************************************************************************
  70. //*                                                                                                                                                                                                  *
  71. //*                         ********************************LCD初始化函数*******************************                  *
  72. //*                                                                                                                                                                                                  *
  73. //*************************************************************************************************
  74. void vLCDInitialize()
  75. {
  76.         CS1=1;
  77.         CS2=1;
  78.         vWriteCMD(0x38);                //8位形式,两行字符。
  79.         vWriteCMD(0x0F);                //开显示。
  80.         vWriteCMD(0x01);                //清屏。
  81.         vWriteCMD(0x06);                //画面不动,光标右移。
  82.         vWriteCMD(LCDSTARTROW);        //设置起始行。
  83. }

  84. //*************************************************************************************************
  85. //*                                                                                                                                                                                                  *
  86. //*                         ******************************显示自定义行*********************************                  *
  87. //*                                                                                                                                                                                                  *
  88. //*************************************************************************************************
  89. //在8×128的格子里显示自定义长度的一行
  90. void vShowCustomRow(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char *ucaRow)
  91. {
  92.         unsigned char ucCount;                                   //取值范围:ucPage:0~7;ucLine:0~127;
  93.         if(ucLine<64)                                                   //ucWidth:0~127;ucLine+ucWidth<1128。
  94.                 {
  95.                 CS1=1;
  96.                 CS2=0;
  97.                 vWriteCMD(LCDPAGE+ucPage);
  98.                 vWriteCMD(LCDLINE+ucLine);
  99.                 if((ucLine+ucWidth)<64)
  100.                         {
  101.                         for(ucCount=0;ucCount<ucWidth;ucCount++)
  102.                                 vWriteData(*(ucaRow+ucCount));
  103.                         }
  104.                 else
  105.                         {
  106.                         for(ucCount=0;ucCount<64-ucLine;ucCount++)
  107.                                 vWriteData(*(ucaRow+ucCount));

  108.                         CS1=0;
  109.                         CS2=1;
  110.                         vWriteCMD(LCDPAGE+ucPage);
  111.                         vWriteCMD(LCDLINE);
  112.                         for(ucCount=64-ucLine;ucCount<ucWidth;ucCount++)
  113.                                 vWriteData(*(ucaRow+ucCount));
  114.                         }
  115.                 }
  116.         else
  117.                 {
  118.                 CS1=0;
  119.                 CS2=1;
  120.                 vWriteCMD(LCDPAGE+ucPage);
  121.                 vWriteCMD(LCDLINE+ucLine-64);
  122.                 for(ucCount=0;ucCount<ucWidth;ucCount++)
  123.                         vWriteData(*(ucaRow+ucCount));
  124.                 }
  125. }
  126. //*************************************************************************************************
  127. //*                                                                                                                                                                                                  *
  128. //*                         *****************************汉字显示函数***********************************                  *
  129. //*                                                                                                                                                                                                  *
  130. //*************************************************************************************************
  131. //此函数将16×16汉字显示在8×128的格子里。
  132. void vShowOneChin(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaChinMap)
  133. {
  134.         vShowCustomRow(ucPage,ucLine,16,ucaChinMap);
  135.         vShowCustomRow(ucPage+1,ucLine,16,ucaChinMap+16);

  136. }
  137. //*************************************************************************************************
  138. //*                                                                                                                                                                                                  *
  139. //*                         *****************************字符显示函数***********************************                  *
  140. //*                                                                                                                                                                                                  *
  141. //*************************************************************************************************
  142. //此函数将8×16字符显示在8×128的格子里。
  143. void vShowOneChar(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaCharMap)
  144. {
  145.         vShowCustomRow(ucPage,ucLine,8,ucaCharMap);
  146.         vShowCustomRow(ucPage+1,ucLine,8,ucaCharMap+8);

  147. }


  148. //*************************************************************************************************
  149. //*                                                                                                                                                                                                  *
  150. //*                         **********************************显示图片***********************************                  *
  151. //*                                                                                                                                                                                                  *
  152. //*************************************************************************************************
  153. void vShowGraph(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char ucHigh,unsigned char * ucaGraph)
  154. {
  155.         unsigned char ucCount;
  156.         for(ucCount=0;ucCount<ucHigh;ucCount++)
  157.                 vShowCustomRow(ucPage+ucCount,ucLine,ucWidth,ucaGraph+ucCount*ucWidth);
  158. }
复制代码

仿真工程文件和源码下载:
51单片机12864大液晶屏proteus仿真.zip (94.29 KB, 下载次数: 37)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:245110 发表于 2018-7-1 21:15 | 只看该作者
非常不错,谢谢楼主啦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表