欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2549|回復: 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);

  }

}
希望有人能解惑。
回復

使用道具 舉報

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以此類推。
回復

使用道具 舉報

ID:213173 發表于 2021-5-4 07:17 | 顯示全部樓層
1602的寄存器一行最多可以寫入40個字符,但只能正常顯示16個字符。雖然寫for(j=n;j<25+n;j++)有缺陷,但不至于出錯。實際寫for(j=n;j<16+n;j++)更合理。
回復

使用道具 舉報

ID:880294 發表于 2021-5-4 08:48 來自觸屏版 | 顯示全部樓層
wulin 發表于 2021-5-4 07:17
1602的寄存器一行最多可以寫入40個字符,但只能正常顯示16個字符。雖然寫for(j=n;j

字符串長度是26,索引值最大是25,用數組累加j+n會超過最大索引值
回復

使用道具 舉報

ID:880294 發表于 2021-5-4 08:50 來自觸屏版 | 顯示全部樓層
birdzhyli 發表于 2021-5-3 23:14
LcdWriteData(displayDate2[j]);j越界問題可以用j%25,那樣到頭就會從第0個繼續顯示

這個程序是在網上查的,不能理解j+n超過實際長度j
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表