昨天刚学1602,有几个命令没搞懂,比如0x07和0x1c,都是整屏左移,比如0x05和0x18都是整屏右移,这两组命令有什么区别,如何使用。
首先,对移屏这个事儿做下解释。
下面两张图中红色方框代表液晶显示器,16字×2行,而LCD内部地址是40字×2行,共80个字节。初始化后默认的状态是如图1,液晶显示器对应地址是00H-0FH,而移屏是两者之间的相对位置发生变化。说起运动,那就是相对的了,我的思维习惯是认为液晶显示器固定,移动的是地址。把地址看做一条“纸带”,整屏左移1位相当于“纸带”左移了1位,就变成了图2的状态。
图1
图2
定义好移屏这个事儿之后,我们来谈谈0x07和0x1c这两个命令的区别:
0x07是定义字符输入模式,该模式下每输入1个字符,整屏左移1位,无字符输入时,无反应。
0x1c是一条操作命令,输入该命令后,就会整屏左移1位。
相应地,0x05和0x18分别是上面两条命令的相反命令。
注:LCD初始化后,只能进行左移命令,或者0x07输入模式,因为“纸带”的左端已经在显示器的左边缘了,不能进行右移。
下附一段程序和一些注释:
/****************头文件和宏定义****************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define time 30
/****************变量定义****************/
sbit dula=P2^6;
sbit rs=P3^5;
sbit wr=P3^6;
sbit lcden=P3^4;
void write_command(uchar);
void write_data(uchar);
void delay(uint);
void lcd_initial();
uchar code table[]={"Hello,I'm1602!"};
uchar code table1[]={"WelcomeHere!"};
uchar code table2[]={"I LoveYou,Dear!"};
uchar code table3[]={"WelcomeBack!"};
uchar i;
/****************主函数****************************************************************************/
void main()
{
P0=0;
dula=1;
dula=0;
lcd_initial();
/***********从左往右写,每写1个字符指针自动右移1位(初始化时设置该模式)*******/
for(i=0;i
{
write_data(table);
delay(time);
}
/***********从左往右写,每写1个字符指针自动右移1位,整屏左移1位***************/
write_command(0x80+0x4f);//设置指针地址
write_command(0x07);//设置输入模式:每输入1个字符,整屏字符左移1位。之后输入字符都按照此模式,直到重新设置输入模式。
for(i=0;i
{
write_data(table1);
delay(time);
}
/***********整屏右移***************/
for(i=0;i
{
write_command(0x18);//整屏字符右移1位,该命令直接操作,无需写字符
delay(time);
}
/***********整屏左移***************/
for(i=0;i<15;i++)
{
write_command(0x1c);//整屏字符左移1位,无需与写数据配合使用
delay(time);
}
/***********光标左移***************/
for(i=0;i
{
write_command(0x10);//光标左移1位
delay(time);
}
write_command(0x06);//设置新的输入模式
for(i=0;i
{
write_data(table2);
delay(time);
}
/***********光标和显示屏复位***************/
write_command(0x02);//光标和显示屏复位到地址00H位置,即第一行00H-0FH,第二行40H-4FH,DDRAM中的数据不变
delay(time);
/***********光标右移***************/
for(i=0;i<31;i++)
{
write_command(0x14);//光标右移1位
if(i>=15)
write_command(0x1c);//当光标移出了显示屏的范围时,将整个屏幕里的字符左移1位,光标又回到显示屏内
delay(time);
}
/***********从右往左写,每写1个字符指针自动左移1位*******/
write_command(0x04);//设置输入模式:从右往左输入,每输入1个字符,光标自动左移1位
for(i=strlen(table3);i>0;i--)//不能是i>=0,否则溢出会导致死循环
{
write_data(table3[i-1]);
delay(time);
}
while(1)
{
};
}
/****************LCD初始化***********************************************************************/
void lcd_initial()
{
write_command(0x38);
write_command(0x08);
write_command(0x01);
write_command(0x06);//proteus仿真时,改成0x04,0x05,0x07都没效果!
write_command(0x0f);
}
/****************写命令 子函数*******************************************************************/
void write_command(uchar command)
{
rs=0;
wr=0;
lcden=0;
P0=command;
lcden=1;
delay(2);//必须有,否则出错 为什么?
lcden=0;
}
/****************写数据 子函数******************************************************************/
void write_data(uchar lcd_data)
{
rs=1;
wr=0;
lcden=0;
P0=lcd_data;
lcden=1;
delay(2);//必须有,否则出错 为什么?
lcden=0;
}
/****************延时 子函数********************************************************************/
void delay(uint x)
{
ucharj;
uinti;
for(i=x;i>0;i--)//不能是i>=0,否则溢出会导致死循环
for(j=0;j<200;j++);
}
楼主在学学习笔记吗,我要向楼主学习