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