找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1602字符液晶工作于8位模式直接驱动显示Proteus仿真+单片机程序

[复制链接]
跳转到指定楼层
楼主
1602字符液晶工作于8位模式直接驱动显示,有仿真文件,附件找

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. //-----------------------------------------------------------------
  2. //  名称: 1602字符液晶工作于8位模式直接驱动显示
  3. //-----------------------------------------------------------------
  4. //  说明: 本例液晶实现了四项演示功能,分别为水平滚动,带光标显示随机
  5. //        算术式,全码表字符显示,CGRAM自定义字符显示.
  6. //         
  7. //-----------------------------------------------------------------
  8. #include <reg51.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #define INT8U  unsigned char
  13. #define INT16U unsigned int
  14. sbit SW1 = P3^0;                //水平水平滚动显示
  15. sbit SW2 = P3^1;                //带光标显示随机算术式
  16. sbit SW3 = P3^2;                //全码表字符显示
  17. sbit SW4 = P3^3;                //CGRAM自定义字符显示
  18. INT8U code msg[] =                //待滚动显示的字符串(字符串最前面加了16个空格)
  19. "                you are going to spend even more time working on the schematic ?";
  20. //-----------------------------------------------------------------
  21. extern delay_ms(INT16U x);
  22. extern void Initialize_LCD();
  23. extern void Write_LCD_Data(INT8U dat);
  24. extern void Write_LCD_Command(INT8U cmd);
  25. extern void Busy_Wait();
  26. extern void LCD_ShowString(INT8U,INT8U,INT8U *);
  27. //-----------------------------------------------------------------
  28. //自定义CGRAM字符及图标点阵数据(共两组,每组字符不超过8个)
  29. INT8U code CGRAM_Dat1[][8] = //7个图标符号(高度由1~7横递增的矩形)
  30. {        {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00},        //1横
  31.         {0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00},        //2横
  32.         {0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x00},        //3横
  33.         {0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x00},        //4横
  34.         {0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x00},        //5横
  35.         {0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x00},        //6横
  36.         {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x00}         //7横
  37. };
  38. INT8U code CGRAM_Dat2[][8] = //5个汉字字符
  39. {        {0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x00},        //年
  40.         {0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00},        //月
  41.         {0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00},        //日
  42.         {0x1F,0x0A,0x1F,0x0A,0x0A,0x0A,0x12,0x00},        //开
  43.         {0x0A,0x1F,0x04,0x1F,0x04,0x0A,0x11,0x00}         //关
  44. };
  45. //-----------------------------------------------------------------
  46. // 将自定义字符点阵写入CGRAM
  47. //-----------------------------------------------------------------
  48. void Write_CGRAM(INT8U g[][8], INT8U n)
  49. {
  50.         INT8U i,j;                          
  51.     Write_LCD_Command(0x40);                   //设置CGRAM地址为0x40
  52.     for (i = 0; i < n; i++)                           //n个自定义字符
  53.     for (j = 0; j < 8; j++)                           //每个字符8字节点阵数据
  54.     Write_LCD_Data(g[i][j]);                   //写入CGRAM
  55. }

  56. //-----------------------------------------------------------------
  57. // SW1: 水平滚动显示字符串
  58. //-----------------------------------------------------------------
  59. void H_Scroll_Display()
  60. {
  61.         INT16U i;
  62.     Write_LCD_Command (0x0C);                              //开显示,关光标
  63.     LCD_ShowString(0,0,"LCD1602 DEMO - 1") ;          //第0行显示标题
  64.     LOOP1:
  65.     for (i = 0; i <= strlen(msg); i++)              //滚动输出所有字符
  66.     {   LCD_ShowString(1,0,msg + i);                //msg+i实现取字符指针递增
  67.         delay_ms(50);if (SW1) return;                                //未置于SW1位置时立即返回
  68.     }   
  69.         delay_ms(1000); goto LOOP1;                                        //显示完所有字符后暂停1s然后继续
  70. }

  71. //-----------------------------------------------------------------
  72. // SW2: 带光标显示随机算术式
  73. //-----------------------------------------------------------------
  74. void Cursor_Display()
  75. {        
  76.     INT8U i; int a,b; char disp_buff[17];
  77.     Write_LCD_Command (0x0C);                                                         //开显示,关光标
  78.     LCD_ShowString(0,0,"LCD1602 DEMO - 2");              //第0行显示标题
  79.     LCD_ShowString(1,0,"              ");                //清空第1行(输出16个空格)
  80.     Write_LCD_Command(0x0F);                                                         //开显示,开光标,光标闪烁
  81.     srand(TH0);                                                                                     //用THO作为随机种子
  82.     while (1)
  83.     {   if (SW2) return;                                                                  //未置于SW2位置时立即返回
  84.         a = rand() % 100;                                                                 //产生不超过100的随机数a,b;
  85.         b = rand() % 100;                                                                 
  86.                 sprintf(disp_buff,                                                                 // 生成算术式及运算结果字符串
  87.             "%2d + %2d = %2d",a,b,a+b);
  88.         Write_LCD_Command(0xC0);                                                 //显示位置定位于第1行开始位置
  89.         for (i = 0; i < 16; i++)                                                 //循环逐个输出算术式字符
  90.         {   if (disp_buff[i])  Write_LCD_Data(disp_buff[i]);
  91.             else                           Write_LCD_Data(' ');
  92.             delay_ms(100);
  93.         }
  94.                 delay_ms(200);                                                                         //显示完一个算术式后暂停200ms
  95.         LCD_ShowString(1,0,"                         ");             //清空该行(输出16个空格)
  96.         }
  97. }

  98. //-----------------------------------------------------------------
  99. // SW3: 全码表字符显示
  100. //-----------------------------------------------------------------
  101. void Show_All_Inter_Chars()
  102. {
  103.         INT8U i,j = 0;                                                         
  104.         Write_LCD_Command(0x0C);                                   //开显示,关光标         
  105.         LCD_ShowString(0,0,"LCD1602 DEMO - 3");    //第 0行显示标题
  106.         LCD_ShowString(1,0,"                ");       //第1 行清空(输出16个空格)
  107.         LOOP3:                                                                  
  108.         Write_LCD_Command(0xC0);                                        //显示位置定位于第1行开始位置
  109.     //从全码表显示,范围为0x20~0xFF,超过0xFF后溢出为0x00,循环结束
  110.         for (i = 0x20; i != 0x00; i++)         
  111.         {   if (i >= 0x80 && i <= 0x9F) continue; //跳过空白区字符
  112.             if ((++j) % 16 == 0)                                                //判断是否显示满一行
  113.             {   delay_ms(500);                                                //满一行时延时500ms        
  114.                 LCD_ShowString(1,0,"                "); //清空该行        
  115.                 Write_LCD_Command(0xC0);                        //显示位置定位于第1行开始位置        
  116.                 j=0;                                                                        //显示字符计数变量清零
  117.         }
  118.                 Write_LCD_Data(i);                                        //在当前位置显示编码为i的字符
  119.                 delay_ms(20);                                                        //显示一个字符后短延时40ms        
  120.                 if (SW3) return;                                                 //未置于SW3位置时立即返回
  121.         }
  122.         delay_ms(500);                                                //一趟演示后延时500ms
  123.         goto LOOP3;                                                                //继续全码表字符显示
  124. }

  125. //-----------------------------------------------------------------
  126. // SW4: CGRAM自定义字符显示
  127. //-----------------------------------------------------------------
  128. void Display_CGRAM_Chars()
  129. {
  130.         INT8U i,j = 0;                                          
  131.         Write_LCD_Command(0x0C);                            //开显示,关光标  
  132.         LCD_ShowString(0,0,"LCD1602 DEMO - 4");            //第0行显示标题
  133.         LOOP4:                                                                                //第1组自定义CGRAM字符演示
  134.         LCD_ShowString(1,0,"                ");         //第1行清空(输出16个空格)
  135.         Write_CGRAM(CGRAM_Dat1,7);                                    //第1组自定义字符点阵写入CGRAM
  136.         Write_LCD_Command(0xC0 | 1);                                //显示位置定位于第1行1列位置
  137.         for (i = 6; i != 0xFF; i--)                                        //7线~1线式方块逐个显示         
  138.         {   Write_LCD_Data(i);                                                    //在当前位置显示编码为i的字符
  139.                 delay_ms(50); if (SW4) return;              //未置于SW4位置时立即返回
  140.         }        
  141.         for(i = 0; i <= 6; i++)                                                //1线~7线式方块逐个显示         
  142.         {   Write_LCD_Data(i);                                                //在当前位置显示编码为i的字符  
  143.             delay_ms(50); if (SW4) return;             //未置于 SW4位置时立即返回
  144.         }   
  145.         delay_ms (500);                                                        //第1组自定义字符演示后延时1s
  146.         //第2组自定义CGRAM字符演示
  147.         LCD_ShowString(1,0, "                ");   //第1行清空(输出16个空格)
  148.         Write_CGRAM(CGRAM_Dat2,5);                   //第2组自定义字符点阵写入CGRAM  
  149.         Write_LCD_Command(0xC0 | 4);                   //显示位置定位于第1行4列位置         
  150.         for (i = 0; i <= 4; i++)                                   //5个自定义汉字字符显示        
  151.         {    Write_LCD_Data(i);                                           //在当前位置显示编码为i的字符  
  152.                  Write_LCD_Data(' ');                                   //每显示一个自定义字符后加一一 空格
  153.                  delay_ms(100);if (SW4) return;                   //未置于SW4位置时立即返回
  154.         }         
  155.         delay_ms(1000);                                           //第2组自定义字符演示后延时1s
  156.         goto LOOP4;                                                           //继续
  157. }

  158. //-----------------------------------------------------------------
  159. // 主程序
  160. //-----------------------------------------------------------------
  161. void main()
  162. {
  163.         P3 = 0xFF;                                                //P3端口置为0xFF
  164.         Initialize_LCD();                                //初始化LCD
  165.         TR0  = 1;                                                //启动定时器,提供随机种子
  166.         while(1)                                                //主循环控制实现各类演示
  167.         {        if (SW1 == 0) H_Scroll_Display();
  168.                 if (SW2 == 0) Cursor_Display();
  169.                 if (SW3 == 0) Show_All_Inter_Chars();
  170.                 if (SW4 == 0) Display_CGRAM_Chars();
  171.         }
  172. }
复制代码

所有资料51hei提供下载:
1602字符液晶工作于8位模式直接驱动显示.zip (60.12 KB, 下载次数: 8)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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