[原创] 1602的0x07和0x1c两个整屏左移命令的区别

tangrui1220   2016-1-20 22:59 楼主
昨天刚学1602,有几个命令没搞懂,比如0x07和0x1c,都是整屏左移,比如0x05和0x18都是整屏右移,这两组命令有什么区别,如何使用。
首先,对移屏这个事儿做下解释。
下面两张图中红色方框代表液晶显示器,16字×2行,而LCD内部地址是40字×2行,共80个字节。初始化后默认的状态是如图1,液晶显示器对应地址是00H-0FH,而移屏是两者之间的相对位置发生变化。说起运动,那就是相对的了,我的思维习惯是认为液晶显示器固定,移动的是地址。把地址看做一条“纸带”,整屏左移1位相当于“纸带”左移了1位,就变成了图2的状态。
360截图20160120213744718.jpg
1
360截图20160120213840781.jpg
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-4FHDDRAM中的数据不变
       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++);
}

回复评论 (4)

2推荐 fish001 

多谢楼主的经验分享
点赞  2016-1-21 09:08
楼主在学学习笔记吗,我要向楼主学习
点赞  2016-1-21 10:07
好东西,谢谢
点赞  2016-8-28 22:01
谢谢
点赞  2016-8-28 22:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复