找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2232|回复: 0
收起左侧

51MCU+无字库LCD12864滚屏 proteus仿真与C程序设计

[复制链接]
ID:599916 发表于 2020-3-31 14:30 | 显示全部楼层 |阅读模式
51hei.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <lcd12864.h>
  4. #include <delay.h>

  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #define Dataport P1 //LCD数据线

  8. sbit RS=P2^2; // 数据\指令 选择
  9. sbit RW=P2^1; // 读\写 选择
  10. sbit EN=P2^0; // 读\写使能
  11. sbit cs1=P2^4; // 片选1
  12. sbit cs2=P2^3; // 片选2

  13. /********************************/
  14. /*  定义中文字库                */
  15. /********************************/

  16. unsigned char code Hzk[]={
  17. ///*--  文字:  中  --*/
  18. ///*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  19. //0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
  20. //0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,


  21. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


  22. };


  23. void CheckState()                //状态检查,LCD是否忙?
  24. {
  25.    uchar dat;
  26.    RS=0;
  27.    RW=1;
  28.    do{
  29.       Dataport=0x00;
  30.       EN=1;
  31.           dat=Dataport;
  32.       EN=0;
  33.       dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
  34.       }while(!(dat==0x00));
  35. }



  36. SendCommandToLCD(uchar command)           //写命令到LCD中
  37. {
  38.    CheckState();
  39.    RS=0;         //向LCD发送命令
  40.    RW=0;
  41.    Dataport=command;         //command :命令
  42.    EN=1;
  43.    EN=0;
  44. }


  45. void SetLine(uchar page)        //设置页 0xb8是页的首地址
  46. {
  47.   page=0xb8|page; //1011 1xxx                 0<=page<=7 设定页地址--X 0-7,8行为一页64/8=8,共8页
  48.   SendCommandToLCD(page);
  49. }


  50. void SetStartLine(uchar startline)            //设定显示开始行,0xc0是行的首地址
  51. {
  52.   startline=0xc0|startline; //1100 0000
  53.   SendCommandToLCD(startline); //设置从哪行开始:0--63,一般从0 行开始显示
  54. }


  55. void SetColumn(uchar column)        //设定列地址--Y 0-63 ,0x40是列的首地址
  56. {
  57.   column=column &0x3f; //column最大值为64,越出 0=<column<=63
  58.   column= 0x40|column; //01xx xxxx
  59.   SendCommandToLCD(column);
  60. }


  61. void SetOnOff(uchar onoff)           //开关显示,0x3f是开显示,0x3e是关显示
  62. {
  63.         onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1
  64.         SendCommandToLCD(onoff);
  65. }


  66. void WriteByte(uchar dat)        //写显示数据
  67. {
  68.    CheckState();
  69.    RS=1;
  70.    RW=0;
  71.    Dataport=dat;//dat:显示数据
  72.    EN=1;
  73.    EN=0;
  74.   }




  75. void SelectScreen(uchar screen)          //选择屏幕screen: 0-全屏,1-左屏,2-右屏
  76. {                                                  
  77.    switch(screen)
  78.    { case 0: cs1=0;//全屏
  79.              _nop_(); _nop_(); _nop_();
  80.              cs2=0;
  81.              _nop_(); _nop_(); _nop_();
  82.              break;
  83.      case 1: cs1=0;//左屏
  84.              _nop_(); _nop_(); _nop_();
  85.              cs2=1;
  86.              _nop_(); _nop_(); _nop_();
  87.              break;
  88.      case 2: cs1=1;//右屏
  89.              _nop_(); _nop_(); _nop_();
  90.              cs2=0;
  91.              _nop_(); _nop_(); _nop_();
  92.              break;
  93.    }
  94. }


  95. void ClearScreen(uchar screen)          //清屏screen: 0-全屏,1-左屏,2-右
  96. {         
  97.      unsigned char i,j;
  98.      SelectScreen(screen);
  99.      
  100.          for(i=0;i<8;i++)         //控制页数0-7,共8页
  101.          {
  102.                 SetLine(i);
  103.                         SetColumn(0);
  104.               for(j=0;j<64;j++)           //控制列数0-63,共64列
  105.                                   {
  106.                   WriteByte(0x00); //写点内容,列地址自动加1
  107.                 }
  108.      }
  109.                                          
  110. }


  111. void lcd_rol()                                        //向上滚屏
  112. {
  113.          uint i;
  114.         for(i = 0; i < 64; i++)
  115.         {
  116.                 cs1=0; // 片选1
  117.                 SendCommandToLCD(0xc0+i);
  118.                 cs1=1;
  119.                
  120.                 cs2=0;// 片选2
  121.                 SendCommandToLCD(0xc0+62-i);
  122.                 cs2=0; // 片选2
  123.                
  124.                 delay_ms(6);
  125.         }
  126. }
  127. void InitLCD(  )             //初始化LCD
  128. {

  129.         CheckState();

  130.         SelectScreen(0);
  131.         SetOnOff(0); //关显示

  132.         SelectScreen(0);
  133.         SetOnOff(1); //开显示

  134.         SelectScreen(0);
  135.         ClearScreen(0);//清屏

  136.         SetStartLine(0); //开始行:0

  137. }


  138. //显示全角汉字
  139. void Display(uchar ss,uchar page,uchar column,uchar number)  //Display(2,0,i*16,i);
  140. {
  141.         uint i;                          //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
  142.                
  143.         SelectScreen(ss);
  144.         column=column&0x3f;

  145.         SetLine(page);        //写上半页
  146.         SetColumn(column); //控制列
  147.         for(i=0;i<16;i++)  //控制16列的数据输出
  148.         {
  149.         WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出
  150.         
  151.         }

  152.         SetLine(page+1);                 //写下半页
  153.         SetColumn(column);           //控制列
  154.     for(i=0;i<16;i++)          //控制16列的数据输出
  155.         {
  156.         WriteByte(Hzk[i+32*number+16]);        //i+32*number+16汉字的后16个数据输出
  157.         }

  158. }


  159. //显示半角汉字和数字和字母
  160. void Displayen(uchar ss,uchar page,uchar column,uchar number)
  161. {
  162.         uint i;           //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
  163.                
  164.         SelectScreen(ss);
  165.         column=column&0x3f;

  166.         SetLine(page);        //写上半页
  167.         SetColumn(column);
  168.            for(i=0;i<8;i++)
  169.         {
  170.         WriteByte(Ezk[i+16*number]);
  171.         }
  172.         
  173.         SetLine(page+1);        //写下半页
  174.         SetColumn(column);
  175.            for(i=0;i<8;i++)
  176.         {
  177.         WriteByte(Ezk[i+16*number+8]);
  178.         }
  179. }


  180. void Dis_Play()
  181. {
  182.         uchar i;
  183.         SetStartLine(0);  
  184.    for(i=0;i<4;i++)
  185.    {
  186.                 Display(0,0,i*16,i);
  187.                 Display(1,0,i*16,i+4);
  188.                
  189.                 Display(2,0+2,i*16,i+8);
  190.                 Display(1,0+2,i*16,i+12);

  191.                 Display(2,0+2+2,i*16,i+16);
  192.                 Display(1,0+2+2,i*16,i+20);
  193.                   
  194. //                Display(2,0+2+2+2,i*16,i+24);
  195. //                Display(1,0+2+2+2,i*16,i+28);
  196.     }
  197.         for(i=0;i<8;i++)
  198.    {
  199.            Displayen(2,0+2+2+2,i*8,i);
  200.            Displayen(1,0+2+2+2,i*8,i+8);
  201.    }
  202.         
  203.         while(1)
  204.         {
  205.                 lcd_rol();
  206.                 for(i=0;i<2*5;i++)
  207.                 {
  208.                         delay_ms(500);
  209.                 }
  210.                
  211.         }
  212. }
复制代码

所有资料51hei提供下载:
LCD12864.rar (101.36 KB, 下载次数: 34)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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