//改程序将实现液晶屏字符串的动态显示
//程序员:徐茂龙
//完成时间:2012.03.23
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define Data P0
//管脚定义
sbit WEI = P2^7;
sbit DUAN = P2^6;
sbit RS = P2^1;
sbit RW = P1^5;
sbit E = P1^6;
sbit BF = P0^7;
//用到的函数声明
void Delay(uchar); //延时函数
void Init(); //初始化函数
void Write(uchar, bit); //写入指令/数据函数
void Busy(); //忙时检测函数
void Display(uchar); //打印函数
uchar code string[] = {"I love WangLele!"};
void main()
{
uchar i, j;
//关闭数码管
Data = 0x0;
WEI = 1;
WEI = 0;
Data = 0xff;
DUAN = 1;
DUAN = 0;
Init();
Display(0x0); //从第一行第一个字符开始
while(1)
{
i = 0; //每检测完一次,就给i清零
while(string[i] != '\0')
{
Write(string[i], 1);
i ++;
for(j = 5; j > 0; j --)
Delay(150);
}
for(j = 20; j > 0; j --) //没显示完一遍,停顿2s
Delay(200);
}
}
void Delay(uchar i)
{
uchar j;
for(; i > 0; i --)
for(j = 155; j > 0; j --);
}
void Busy()
{
Delay(5);
RS = 0; //RS = 0; RW = 1;表示读取指令
RW = 1;
E = 1; //只有当E = 1时才能进行读写操作
_nop_();
_nop_(); //两个空操作给硬件一定反应时间
while(BF); //忙时检测
_nop_();
_nop_(); //两个空操作给硬件一定的反应时间
E = 0; //当E有高电平跳至低电平时,开始执行指令
}
void Write(uchar msg, bit flag)
{
Delay(5);
Busy(); //只有在闲时才能进行读写操作
RS = flag; //flag的值决定是对数据操作还是对指令进行操作
RW = 0; //对操作对像进行写操作
E = 0; //当进行读写操作时,E要处于高脉冲,就是说E要从0跳至1状态
_nop_();
_nop_(); //两个空操作给硬件一定的反应时间
E = 1;
_nop_();
_nop_(); //两个空操作给硬件一定的反应时间
Data = msg; //将数据送入P0口
_nop_();
_nop_(); //两个空操作给硬件一定的反应时间
E = 0; //当E有高电平跳至低电平时,开始执行指令
}
void Init()
{
Delay(15); //第一次操作时,稍微延时长一点
Write(0x01, 0); //清平指令
Delay(5);
Write(0x07, 0); //【输入方式设置命令】光标从左向右移动,内容也移动
Delay(5);
Write(0x0c, 0); //【显示开关控制指令】显示开,光标不显示,字符不闪烁
Delay(5);
Write(0x34, 0); //【功能设置命令】8位数据,单行显示,5*7点阵
Delay(5);
}
void Display(uchar addr)
{
Write((addr | 0x80), 0);
}