找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7491|回复: 5
打印 上一主题 下一主题
收起左侧

89C51单片机实现LCD1602液晶滚动显示

[复制链接]
跳转到指定楼层
楼主
ID:264442 发表于 2017-12-20 19:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
uint8 a[16]="perchin designed";
uint8 b[27]="welcome to the world of mcu";
void delay(uint16 i)  //1us
{
        while(i--);
}
void wrc(uint8 c)
{
        delay(1000);
        rs=0;
        rw=0;
        e=0;
        P0=c;
        e=1;
        delay(10);
        e=0;
        /*
        P0=c<<4;
        e=1;
        e=0;*/       //四位的LCD要加上
}
void wrd(uint8 dat)
{
        delay(1000);
        rs=1;
        rw=0;
        e=0;
        P0=dat;
        e=1;
        delay(10);
        e=0;
        /*
        P0=dat<<4;
        e=1;
        e=0;*/           //四位的LCD要加上
        rs=0;       
}
void init()
{
        delay(1000);
        /*wrc(0x32);         
        wrc(0x28);
        wrc(0x28);        */        //四位的LCD要加上
        wrc(0x38);
        wrc(0x38);
        wrc(0x38);       
        wrc(0x0c);       
        wrc(0x01);       
}
void display()
{
        uint8 i;
        wrc(0x00+0x80);
        for(i=0;i<16;i++)
        {
                wrd(a[i]);       
        }
        wrc(0x40+0x80);
        for(i=0;i<27;i++)
        {
                wrd(b[i]);
        }
        wrc(0x07);         //每写一个数据屏幕就要右移一位,就相对于数据来说就是左移了;
        while(1)
        {       
                wrc(0x00+0x80);
                for(i=0;i<16;i++)
                {
                        wrd(a[i]);
                        delay(30000);        //如果不加这条延时语句的话滚动会非常快。
                }
        }
}
void main()
{
        init();
        while(1)
        {
                display();
        }       
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:373650 发表于 2018-7-21 17:00 | 只看该作者
wrc(0x00+0x80)这个是什么意思?
回复

使用道具 举报

板凳
ID:367440 发表于 2018-7-21 20:59 | 只看该作者
正常 发表于 2018-7-21 17:00
wrc(0x00+0x80)这个是什么意思?

表示起始位置是第一行第一个,如果是第二行第一个就是wrc(0x40+0x80);
第一行第一个地址是0x00,第二行第一个地址是0x40,不过实际使用的时候起始地址都要加上0x80,因为有的地址不是用于显示的,但是却存在,所以使用时都要加上0x80。
回复

使用道具 举报

地板
ID:274435 发表于 2018-7-27 09:47 | 只看该作者
不负时光~田 发表于 2018-7-21 20:59
表示起始位置是第一行第一个,如果是第二行第一个就是wrc(0x40+0x80);
第一行第一个地址是0x00,第二行第 ...

为什么用wrc(0x00+0x80)控制使得wrd(a[ i])滚动;b[ i]也能滚动。
回复

使用道具 举报

5#
ID:433067 发表于 2018-12-4 15:34 | 只看该作者
VampireHoly 发表于 2018-7-27 09:47
为什么用wrc(0x00+0x80)控制使得wrd(a)滚动;b也能滚动。

wrc(0c00+0x80)不是控制滚动,是控制显示起始位置是第一行第一个
回复

使用道具 举报

6#
ID:71421 发表于 2018-12-5 22:01 | 只看该作者
感谢分享!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表