找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+LCD12864字体图片显示程序 Proteus仿真图

[复制链接]
跳转到指定楼层
楼主
按钮1显示字体,按钮2显示图片
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <at89x51.h>
  2. #define        RST P2_0
  3. #define        E P2_1
  4. #define        RW P2_2
  5. #define        DI P2_3
  6. #define        CS1 P2_5
  7. #define        CS2        P2_4
  8. #define        LCDPORT P0

  9. #define BUSYSTATUS P0_7                                  //忙状态位。

  10. #define LCDSTARTROW 0xC0                          //设置起始行指令。
  11. #define LCDPAGE 0xB8                                  //设置页指令。
  12. #define LCDLINE 0x40                                  //设置列指令。

  13. bit bCheckBusy()//读忙标志位
  14. {
  15.         LCDPORT=0xFF;
  16.         RW=1;
  17.         DI=0;
  18.         E=1;
  19.         E=0;
  20.         return BUSYSTATUS;
  21. }

  22. void vWriteData(unsigned char ucData)//写数据
  23. {
  24.         while(bCheckBusy());
  25.         LCDPORT=0xFF;

  26.         RW=0;
  27.         DI=1;
  28.         LCDPORT=ucData;
  29.         E=1;
  30.         E=0;
  31. }

  32. void vWriteCMD(unsigned char ucCMD)//写指令
  33. {
  34.         while(bCheckBusy());
  35.         LCDPORT=0xFF;

  36.         RW=0;
  37.         DI=0;
  38.         LCDPORT=ucCMD;
  39.         E=1;
  40.         E=0;
  41. }

  42. void vLCDInitialize()//LCD初始化函数
  43. {
  44.         CS1=1;
  45.         CS2=1;
  46.         vWriteCMD(0x38);                //8位形式,两行字符。
  47.         vWriteCMD(0x0F);                //开显示。
  48.         vWriteCMD(0x01);                //清屏。
  49.         vWriteCMD(0x06);                //画面不动,光标右移。
  50.         vWriteCMD(LCDSTARTROW);        //设置起始行。
  51. }

  52. //显示自定义行
  53. //在8×128的格子里显示自定义长度的一行
  54. void vShowCustomRow(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char *ucaRow)
  55. {
  56.         unsigned char ucCount;                                   //取值范围:ucPage:0~7;ucLine:0~127;
  57.         if(ucLine<64)                                                   //ucWidth:0~127;ucLine+ucWidth<1128。
  58.                 {
  59.                 CS1=1;
  60.                 CS2=0;
  61.                 vWriteCMD(LCDPAGE+ucPage);
  62.                 vWriteCMD(LCDLINE+ucLine);
  63.                 if((ucLine+ucWidth)<64)
  64.                         {
  65.                         for(ucCount=0;ucCount<ucWidth;ucCount++)
  66.                                 vWriteData(*(ucaRow+ucCount));
  67.                         }
  68.                 else
  69.                         {
  70.                         for(ucCount=0;ucCount<64-ucLine;ucCount++)
  71.                                 vWriteData(*(ucaRow+ucCount));

  72.                         CS1=0;
  73.                         CS2=1;
  74.                         vWriteCMD(LCDPAGE+ucPage);
  75.                         vWriteCMD(LCDLINE);
  76.                         for(ucCount=64-ucLine;ucCount<ucWidth;ucCount++)
  77.                                 vWriteData(*(ucaRow+ucCount));
  78.                         }
  79.                 }
  80.         else
  81.                 {
  82.                 CS1=0;
  83.                 CS2=1;
  84.                 vWriteCMD(LCDPAGE+ucPage);
  85.                 vWriteCMD(LCDLINE+ucLine-64);
  86.                 for(ucCount=0;ucCount<ucWidth;ucCount++)
  87.                         vWriteData(*(ucaRow+ucCount));
  88.                 }
  89. }

  90. //此函数将16×16汉字显示在8×128的格子里。 汉字显示函数
  91. void vShowOneChin(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaChinMap)
  92. {
  93.         vShowCustomRow(ucPage,ucLine,16,ucaChinMap);
  94.         vShowCustomRow(ucPage+1,ucLine,16,ucaChinMap+16);

  95. }

  96. //此函数将8×16字符显示在8×128的格子里。 字符显示函数
  97. void vShowOneChar(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaCharMap)
  98. {
  99.         vShowCustomRow(ucPage,ucLine,8,ucaCharMap);
  100.         vShowCustomRow(ucPage+1,ucLine,8,ucaCharMap+8);

  101. }

  102. //显示图片
  103. void vShowGraph(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char ucHigh,unsigned char * ucaGraph)
  104. {
  105.         unsigned char ucCount;
  106.         for(ucCount=0;ucCount<ucHigh;ucCount++)
  107.                 vShowCustomRow(ucPage+ucCount,ucLine,ucWidth,ucaGraph+ucCount*ucWidth);
  108. }
复制代码

Keil代码与Proteus仿真下载:
lcd.7z (76.83 KB, 下载次数: 47)


评分

参与人数 1黑币 +40 收起 理由
admin + 40 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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