//下面這條程序看不明白
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);
}
}
希望有人能解惑。 |