找回密码
 注册

QQ登录

只需一步,快速开始

搜索

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

[复制链接]
coolfire 发表于 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 E币)

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

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-3-29 03:40

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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