找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2330|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+1602液晶滾動(dòng)顯示程序看不明白

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:880294 發(fā)表于 2021-5-3 21:27 來(lái)自手機(jī) | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
//下面這條程序看不明白
for(j=n;j<25+n;j++)//我們沒(méi)有進(jìn)行整屏右移,但是我們進(jìn)行了數(shù)組右移O(∩_∩)O~

{

   LcdWriteData(displayDate2[j]);

}
//字符串長(zhǎng)度只有25,這里索引25+n超過(guò)最大索引,程序不會(huì)報(bào)錯(cuò)嗎?

接下來(lái)寫(xiě)相關(guān)子程序:

//寫(xiě)入命令子函數(shù)

void LcdWriteCom(unsigned char com)

{

  LCD_RS=0;

  LCD_RW=0;

  LCD_GPIO=com;

  delay1ms(1);

  LCD_E=1;

  delay1ms(1);

  LCD_E=0;

}

//寫(xiě)入數(shù)據(jù)子函數(shù)

void LcdWriteData(unsigned char dat)

{

  LCD_RS=1;

  LCD_RW=0;

  LCD_GPIO=dat;

  delay1ms(1);

  LCD_E=1;

  delay1ms(1);

  LCD_E=0;

}

//讀忙子函數(shù)

bit LCD_bz(void)

{

  bit bz;

  LCD_RS=0;

  LCD_RW=1;

  LCD_E=1;

  delay1ms(10);

  P0=0xff;           //C51單片機(jī)讀引腳要先置高電平,原因不贅述,很多資料沒(méi)有這一步驟,大家格外注意下

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

  LCD_E=0;

  return bz;

}



//延時(shí)子程序

void delay1ms(unsigned int t)

{

  unsigned int i,j;              //節(jié)約內(nèi)存起見(jiàn),建議用uchar,由于后面要做動(dòng)態(tài)顯示,為了滿(mǎn)足顯示效果,這里用了uint

  for(i=0;i

  {

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

  }

}

//初始化顯示屏程序

void LcdInit()

{

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

  LcdWriteCom(0x0c);//開(kāi)顯示 無(wú)光標(biāo) 不閃爍

  LcdWriteCom(0x06);//寫(xiě)一個(gè)指針加1

  LcdWriteCom(0x01);//清屏

  LcdWriteCom(0x80);//設(shè)置(0,0)為起點(diǎn)

}



主程序:

//我們要把第一行做成一個(gè)16字符固定顯示,第二行做成滾動(dòng)顯示25字符

//這里采用的是1602指針右移的基礎(chǔ)命令而不是整屏右移命令

#include

#define LCD_GPIO  P0

void LcdWriteCom(unsigned char); //寫(xiě)入命令子函數(shù)聲明

void LcdWriteData(unsigned char);//寫(xiě)入數(shù)據(jù)子函數(shù)聲明

void LcdInit();//顯示屏初始化子函數(shù)聲明

void delay1ms(unsigned int);//延時(shí)函數(shù)聲明

bit LCD_bz(void);//讀忙函數(shù)聲明

sbit LCD_RW=P2^5;

sbit LCD_RS=P2^6;

sbit LCD_E=P2^7;

unsigned char displayDate1[]="    I'm Cesar   ";//一共16個(gè)字符(包括空格在內(nèi))

unsigned char displayDate2[]=" Please add QQ775222573  ";//一共25個(gè)字符

void main(void)

{

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

  LcdInit();

LcdWriteCom(0x80);//設(shè)置坐標(biāo)為第一行第一個(gè)字符

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

{

   LcdWriteData(displayDate1[ i]);

}

while(1)

  {

if(LCD_bz())

      continue;//讀忙,結(jié)束本次循環(huán)



LcdWriteCom(0x80+0x40);//設(shè)置第二行第一個(gè)字符起點(diǎn)

for(j=n;j<25+n;j++)//我們沒(méi)有進(jìn)行整屏右移,但是我們進(jìn)行了數(shù)組右移O(∩_∩)O~

{

   LcdWriteData(displayDate2[j]);

}

      n++;//數(shù)組的顯示起點(diǎn)右移,這樣實(shí)現(xiàn)了滾動(dòng)

if(n>=(25-15))//當(dāng)顯示移到最右邊時(shí),停頓片刻,返回起點(diǎn)再次循環(huán)

   {

         n=0;

         delay1ms(2000);

        }

      delay1ms(600);

  }

}
希望有人能解惑。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:889094 發(fā)表于 2021-5-3 23:14 來(lái)自手機(jī) | 只看該作者
  LcdWriteData(displayDate2[j]);j越界問(wèn)題可以用j%25,那樣到頭就會(huì)從第0個(gè)繼續(xù)顯示
回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2021-5-4 06:19 | 只看該作者
1602的一行最多只能顯示16個(gè)字符,超過(guò)16個(gè)字符可以用循環(huán)移動(dòng)的方式在一定的時(shí)間內(nèi)全部顯示。如果要移動(dòng)顯示25個(gè)字符,可以設(shè)置字符數(shù)組長(zhǎng)度為26。每次刷新LCD只顯示數(shù)組前16個(gè)字符。然后把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];
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2021-5-4 06:27 | 只看該作者
樓主的示例采用的是分段顯示的方法達(dá)到移動(dòng)顯示的目的,就是先顯示0~15、再顯示1~16、2~17、3~18以此類(lèi)推。
回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2021-5-4 07:17 | 只看該作者
1602的寄存器一行最多可以寫(xiě)入40個(gè)字符,但只能正常顯示16個(gè)字符。雖然寫(xiě)for(j=n;j<25+n;j++)有缺陷,但不至于出錯(cuò)。實(shí)際寫(xiě)for(j=n;j<16+n;j++)更合理。
回復(fù)

使用道具 舉報(bào)

6#
ID:880294 發(fā)表于 2021-5-4 08:48 來(lái)自手機(jī) | 只看該作者
wulin 發(fā)表于 2021-5-4 07:17
1602的寄存器一行最多可以寫(xiě)入40個(gè)字符,但只能正常顯示16個(gè)字符。雖然寫(xiě)for(j=n;j

字符串長(zhǎng)度是26,索引值最大是25,用數(shù)組累加j+n會(huì)超過(guò)最大索引值
回復(fù)

使用道具 舉報(bào)

7#
ID:880294 發(fā)表于 2021-5-4 08:50 來(lái)自手機(jī) | 只看該作者
birdzhyli 發(fā)表于 2021-5-3 23:14
LcdWriteData(displayDate2[j]);j越界問(wèn)題可以用j%25,那樣到頭就會(huì)從第0個(gè)繼續(xù)顯示

這個(gè)程序是在網(wǎng)上查的,不能理解j+n超過(guò)實(shí)際長(zhǎng)度j
回復(fù)

使用道具 舉報(bào)

8#
ID:880294 發(fā)表于 2021-5-4 08:54 來(lái)自手機(jī) | 只看該作者
yjd2799 發(fā)表于 2021-5-4 08:50
這個(gè)程序是在網(wǎng)上查的,不能理解j+n超過(guò)實(shí)際長(zhǎng)度j

是不是超過(guò)長(zhǎng)度會(huì)補(bǔ)空字符
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表