找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+1602液晶滚动显示程序看不明白

[复制链接]
跳转到指定楼层
楼主
ID:880294 发表于 2021-5-3 21:27 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//下面这条程序看不明白
for(j=n;j<25+n;j++)//我们没有进行整屏右移,但是我们进行了数组右移O(∩_∩)O~

{

   LcdWriteData(displayDate2[j]);

}
//字符串长度只有25,这里索引25+n超过最大索引,程序不会报错吗?

接下来写相关子程序:

//写入命令子函数

void LcdWriteCom(unsigned char com)

{

  LCD_RS=0;

  LCD_RW=0;

  LCD_GPIO=com;

  delay1ms(1);

  LCD_E=1;

  delay1ms(1);

  LCD_E=0;

}

//写入数据子函数

void LcdWriteData(unsigned char dat)

{

  LCD_RS=1;

  LCD_RW=0;

  LCD_GPIO=dat;

  delay1ms(1);

  LCD_E=1;

  delay1ms(1);

  LCD_E=0;

}

//读忙子函数

bit LCD_bz(void)

{

  bit bz;

  LCD_RS=0;

  LCD_RW=1;

  LCD_E=1;

  delay1ms(10);

  P0=0xff;           //C51单片机读引脚要先置高电平,原因不赘述,很多资料没有这一步骤,大家格外注意下

  bz=(bit)(LCD_GPIO&0x80);

  LCD_E=0;

  return bz;

}



//延时子程序

void delay1ms(unsigned int t)

{

  unsigned int i,j;              //节约内存起见,建议用uchar,由于后面要做动态显示,为了满足显示效果,这里用了uint

  for(i=0;i

  {

    for(j=0;j<300;j++);

  }

}

//初始化显示屏程序

void LcdInit()

{

  LcdWriteCom(0x38);//显示模式2行16列

  LcdWriteCom(0x0c);//开显示 无光标 不闪烁

  LcdWriteCom(0x06);//写一个指针加1

  LcdWriteCom(0x01);//清屏

  LcdWriteCom(0x80);//设置(0,0)为起点

}



主程序:

//我们要把第一行做成一个16字符固定显示,第二行做成滚动显示25字符

//这里采用的是1602指针右移的基础命令而不是整屏右移命令

#include

#define LCD_GPIO  P0

void LcdWriteCom(unsigned char); //写入命令子函数声明

void LcdWriteData(unsigned char);//写入数据子函数声明

void LcdInit();//显示屏初始化子函数声明

void delay1ms(unsigned int);//延时函数声明

bit LCD_bz(void);//读忙函数声明

sbit LCD_RW=P2^5;

sbit LCD_RS=P2^6;

sbit LCD_E=P2^7;

unsigned char displayDate1[]="    I'm Cesar   ";//一共16个字符(包括空格在内)

unsigned char displayDate2[]=" Please add QQ775222573  ";//一共25个字符

void main(void)

{

  unsigned char i=0,j=0,n=0;

  LcdInit();

LcdWriteCom(0x80);//设置坐标为第一行第一个字符

for(i=;i<16;i++)

{

   LcdWriteData(displayDate1[ i]);

}

while(1)

  {

if(LCD_bz())

      continue;//读忙,结束本次循环



LcdWriteCom(0x80+0x40);//设置第二行第一个字符起点

for(j=n;j<25+n;j++)//我们没有进行整屏右移,但是我们进行了数组右移O(∩_∩)O~

{

   LcdWriteData(displayDate2[j]);

}

      n++;//数组的显示起点右移,这样实现了滚动

if(n>=(25-15))//当显示移到最右边时,停顿片刻,返回起点再次循环

   {

         n=0;

         delay1ms(2000);

        }

      delay1ms(600);

  }

}
希望有人能解惑。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:889094 发表于 2021-5-3 23:14 来自手机 | 只看该作者
  LcdWriteData(displayDate2[j]);j越界问题可以用j%25,那样到头就会从第0个继续显示
回复

使用道具 举报

板凳
ID:213173 发表于 2021-5-4 06:19 | 只看该作者
1602的一行最多只能显示16个字符,超过16个字符可以用循环移动的方式在一定的时间内全部显示。如果要移动显示25个字符,可以设置字符数组长度为26。每次刷新LCD只显示数组前16个字符。然后把0移到25,再把所有字符前移。示例如下:
  1.         displayDate2[26]=" Please add QQ775222573   ";

  2.         displayDate2[25]=displayDate2[0];
  3.         for(i=0;i<25;i++)
  4.                 displayDate2[i]=displayDate2[i+1];
复制代码
回复

使用道具 举报

地板
ID:213173 发表于 2021-5-4 06:27 | 只看该作者
楼主的示例采用的是分段显示的方法达到移动显示的目的,就是先显示0~15、再显示1~16、2~17、3~18以此类推。
回复

使用道具 举报

5#
ID:213173 发表于 2021-5-4 07:17 | 只看该作者
1602的寄存器一行最多可以写入40个字符,但只能正常显示16个字符。虽然写for(j=n;j<25+n;j++)有缺陷,但不至于出错。实际写for(j=n;j<16+n;j++)更合理。
回复

使用道具 举报

6#
ID:880294 发表于 2021-5-4 08:48 来自手机 | 只看该作者
wulin 发表于 2021-5-4 07:17
1602的寄存器一行最多可以写入40个字符,但只能正常显示16个字符。虽然写for(j=n;j

字符串长度是26,索引值最大是25,用数组累加j+n会超过最大索引值
回复

使用道具 举报

7#
ID:880294 发表于 2021-5-4 08:50 来自手机 | 只看该作者
birdzhyli 发表于 2021-5-3 23:14
LcdWriteData(displayDate2[j]);j越界问题可以用j%25,那样到头就会从第0个继续显示

这个程序是在网上查的,不能理解j+n超过实际长度j
回复

使用道具 举报

8#
ID:880294 发表于 2021-5-4 08:54 来自手机 | 只看该作者
yjd2799 发表于 2021-5-4 08:50
这个程序是在网上查的,不能理解j+n超过实际长度j

是不是超过长度会补空字符
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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