新手:1602的一个整屏移动问题

2019-07-15 20:19发布

本帖最后由 天涯琼 于 2014-4-3 22:50 编辑

#include<reg51.h>#define uchar unsigned char
#define uint   unsigned int


sbit lcdrs=P2^6;//数据、命令选择
sbit lcdrw=P2^5;//读写选择
sbit lcden=P2^7;//使能
uchar code table1[]="I LOVE Shenzhen";
uchar code table2[]="WELCOME TO 1602 ";
uchar num;


void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}


void write_com(uchar com)//写命令
{
        lcdrs=0;//数据命令选择,置0选命令
        lcdrw=0;//读写选择,置0选写
        delay(5);//根据时序,要延时一段时间
        P0=com;//把命令送入1602


        lcden=1;//开使能,完成mcu向1602的传输
        delay(5);//使能延时足够时间,以完成数据传输
        lcden=0;//关使能
}
void write_data(uchar dat)//写数据
{
        lcdrs=1;//数据命令选择,置1选命令
        lcdrw=0;//读写选择,置0选写
        delay(5);//根据时序,要延时一段时间
        P0=dat;//把数据送入1602


        lcden=1;//开使能,完成mcu向1602的传输
        delay(5);//使能延时足够时间,以完成数据传输
        lcden=0;//关使能
}
void init()
{        lcden=0;//平时使能一定是关的,传输数据瞬间才开
        write_com(0x38);//显示模式,初始化0x38一定要有,没有商量余地
        write_com(0x0c);//后三位110,开显示,光标显示,光标不闪烁
        write_com(0x06);//后二位,指针、光标加一,写个字符整屏不移动
}
void main()
{
                init();
                write_com(0x80+0x10);//首地址在屏外第一格
                for(num=0;num<15;num++)//在屏外从第一格依次写完整句
                {
                 write_data(table1[num]);        
                 delay(100);
                }        


                /*for(num=0;num<16;num++)
                {
                        write_com(0x18);//整屏移动16次
                        delay(100);
                }*/


                write_com(0x80+0x50);//首地址在屏外第一格
                for(num=0;num<15;num++)/在屏外从第一格依次写完整句
                {
                 write_data(table2[num]);        
                 delay(100);
                }        


                for(num=0;num<16;num++)
                {
                        write_com(0x18);//整屏移动16次
                        delay(100);
                }


while(1); //这句话使显示稳定下来,等待
         
}        
     以上是我写的1602显示程序,是正确的。功能是从右到左移动显示字符“I LOVE Shenzhen”  “WELCOME TO 1602”,以上被注释掉的绿 {MOD}部分是我写错的地方。
     起初想法是,第一行先从右到左整屏移动显示,然后再是第二行从右到左整屏移动显示,最后两行的字符稳定显示,而且都在液晶显示范围之内。      最初是有上述那绿 {MOD}部分语句的,可调试结果跟我所想不一样,产生这样一个奇怪现象:第一行“I LOVE Shenzhen” 是从右边整屏移出来的没错,第二行却是从左到右依次写入(在液晶显示范围内),最后两行字符都向左移出屏幕,一个字都没有了。
       请问各位前辈,这是怎么回事?地址指针怎么变?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
Zhangchen11
1楼-- · 2019-07-16 02:14
你好,我使用了你的程序,可是我没能实现民屏幕移动,能帮我一下吗。
hkaizhoufeng
2楼-- · 2019-07-16 07:10
首先,我认为“write_com(0x06);//后二位,指针、光标加一,写个字符整屏不移动”这行不应出现在初始化中,应该放在主程序中,其次这行应该是write_com(0x05);//指令00000101,读或写一个字符后,地址指针减一,且光标减一,写一个字符整屏显示左移。多看看datasheet
王梦玮
3楼-- · 2019-07-16 08:20
 精彩回答 2  元偷偷看……
王梦玮
4楼-- · 2019-07-16 09:43
Zhangchen11 发表于 2016-1-3 22:00
你好,我使用了你的程序,可是我没能实现民屏幕移动,能帮我一下吗。

这个程序主函数里面while语句放在所有子程序之后 常理说是没办法整屏移动的 你可以把所有程序放while语气里面 应该就可以实现你的要求
极限学业
5楼-- · 2019-07-16 10:48
你的程序没问题,二楼说法有问题

一周热门 更多>