51单片机LCD1602字符液晶滚动C程序源码和proteus仿真

[复制链接]
查看3 | 回复0 | 2021-4-21 22:59:58 | 显示全部楼层 |阅读模式
一、电路设计此电路由AT89C51最小系统、LCD1602显示模块和独立按键组成。
可实现文字的上下左右滚动
二、运行效果
仿真原理图如下(proteus仿真工程文件和完整单片机C语言源码可到本帖附件中下载)
1.png 2.png
三、部分单片机代码
  1. /*************** ******************/
  2. #include <reg52.h>
  3. #include <string.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. void Initialize_LCD();
  7. void ShowString(uchar,uchar,uchar *);
  8. sbit K1 = P3^0;
  9. sbit K2 = P3^1;
  10. sbit K3 = P3^2;

  11. uchar code Prompt[]="PRESS K1--K4 TO START DEMO PROG";
  12. uchar const Line_Count = 6;
  13. uchar code Msg[][80]=
  14. {
  15.      "Many CAD users dismiss",
  16.     "process of creating PCB",
  17.     "of view.with PCB layout",
  18.     "placement and track routing,",
  19.     "can often be the most time",
  20.     "And if you use circuit simulation",
  21.     "you are going to spend even more"
  22. };
  23. uchar Disp_Buffer[32];
  24. void Delayxms(uint ms)
  25. {
  26.      uchar i;
  27.     while(ms--)
  28.     {
  29.          for(i=0;i<120;i++);
  30.     }
  31. }

  32. void V_Scroll_Display()
  33. {
  34.      uchar i,j,k = 0;
  35.     uchar *p = Msg[0];
  36.     uchar *q = Msg[Line_Count] + strlen(Msg[Line_Count]);
  37.     while(p<q)
  38.     {
  39.          for(i=0;(i<16)&&(p<q);i++)
  40.         {
  41.              if(((i==0)||(i==15))&& *p == ' ')
  42.                 p++;
  43.             if(*p != '\0')
  44.             {
  45.                  Disp_Buffer[i] = *p++;
  46.             }
  47.             else
  48.             {
  49.                  if(++k>Line_Count)
  50.                     break;
  51.                 p = Msg[k];
  52.                 Disp_Buffer[i] = *p++;
  53.             }
  54.         }
  55.         for(j=i;j<16;j++)
  56.             Disp_Buffer[j]=' ';
  57.         while(F0)
  58.             Delayxms(5);
  59.         ShowString(0,0,"      ");
  60.         Delayxms(150);
  61.         while(F0)
  62.             Delayxms(5);
  63.         ShowString(0,1,Disp_Buffer);
  64.         Delayxms(150);
  65.         while(F0)
  66.             Delayxms(5);
  67.         ShowString(0,0,Disp_Buffer);
  68.         ShowString(0,1,"      ");
  69.         Delayxms(150);   
  70.     }
  71.     ShowString(0,0,"         ");
  72.     ShowString(0,1,"         ");
  73. }

  74. void H_Scroll_Display()
  75. {
  76.     uchar m,n,t = 0,L=0;
  77.     uchar *p = Msg[0];
  78.     uchar *q = Msg[Line_Count] + strlen(Msg[Line_Count]);
  79.     for(m=0;m<16;m++)
  80.             Disp_Buffer[m]=' ';   
  81.     while(p<q)
  82.     {
  83.          if((m=16||m==31)&& *p == ' ')
  84.             p++;
  85.         for(m=16;m<32&&p<q;m++)
  86.         {
  87.              if(*p != '\0')
  88.             {
  89.                 Disp_Buffer[m] = *p++;     
  90.             }
  91.             else
  92.             {
  93.                  if(++t>Line_Count)
  94.                     break;
  95.                 p = Msg[t];
  96.                 Disp_Buffer[m] = *p++;
  97.             }
  98.         }
  99.         for(n=m;n<32;n++)
  100.             Disp_Buffer[n]=' ';
  101.         for(m=0;m<=16;m++)
  102.         {
  103.              while(F0)
  104.                  Delayxms(5);
  105.                ShowString(0,L,Disp_Buffer+1);
  106.                while(F0)
  107.                  Delayxms(5);
  108.             Delayxms(20);
  109.         }
  110.         L = (L==0)? 1:0;
  111.         Delayxms(200);
  112.     }
  113.     if(L==1)
  114.         ShowString(0,1,"      ");   
  115. }

  116. void EX_INT0() interrupt 0
  117. {
  118.      F0 = !F0;
  119. }

  120. void main()
  121. {
  122.      uint Count = 0;
  123.     IE = 0x81;
  124.     IT0 = 1;
  125. ……………………
  126. …………限于本文篇幅 余下代码请下载附件…………
复制代码
1602字符液晶滚动C源程序和仿真文件.zip (88.69 KB, 售价: 10 工控币)
回复

使用道具 举报

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

本版积分规则