//改程序?qū)?shí)現(xiàn)液晶屏字符串的動(dòng)態(tài)顯示
//程序員:徐茂龍
//完成時(shí)間: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;
//用到的函數(shù)聲明
void Delay(uchar); //延時(shí)函數(shù)
void Init(); //初始化函數(shù)
void Write(uchar, bit); //寫入指令/數(shù)據(jù)函數(shù)
void Busy(); //忙時(shí)檢測函數(shù)
void Display(uchar); //打印函數(shù)
uchar code string[] = {"I love WangLele!"};
void main()
{
uchar i, j;
//關(guān)閉數(shù)碼管
Data = 0x0;
WEI = 1;
WEI = 0;
Data = 0xff;
DUAN = 1;
DUAN = 0;
Init();
Display(0x0); //從第一行第一個(gè)字符開始
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; //只有當(dāng)E = 1時(shí)才能進(jìn)行讀寫操作
_nop_();
_nop_(); //兩個(gè)空操作給硬件一定反應(yīng)時(shí)間
while(BF); //忙時(shí)檢測
_nop_();
_nop_(); //兩個(gè)空操作給硬件一定的反應(yīng)時(shí)間
E = 0; //當(dāng)E有高電平跳至低電平時(shí),開始執(zhí)行指令
}
void Write(uchar msg, bit flag)
{
Delay(5);
Busy(); //只有在閑時(shí)才能進(jìn)行讀寫操作
RS = flag; //flag的值決定是對數(shù)據(jù)操作還是對指令進(jìn)行操作
RW = 0; //對操作對像進(jìn)行寫操作
E = 0; //當(dāng)進(jìn)行讀寫操作時(shí),E要處于高脈沖,就是說E要從0跳至1狀態(tài)
_nop_();
_nop_(); //兩個(gè)空操作給硬件一定的反應(yīng)時(shí)間
E = 1;
_nop_();
_nop_(); //兩個(gè)空操作給硬件一定的反應(yīng)時(shí)間
Data = msg; //將數(shù)據(jù)送入P0口
_nop_();
_nop_(); //兩個(gè)空操作給硬件一定的反應(yīng)時(shí)間
E = 0; //當(dāng)E有高電平跳至低電平時(shí),開始執(zhí)行指令
}
void Init()
{
Delay(15); //第一次操作時(shí),稍微延時(shí)長一點(diǎn)
Write(0x01, 0); //清平指令
Delay(5);
Write(0x07, 0); //【輸入方式設(shè)置命令】光標(biāo)從左向右移動(dòng),內(nèi)容也移動(dòng)
Delay(5);
Write(0x0c, 0); //【顯示開關(guān)控制指令】顯示開,光標(biāo)不顯示,字符不閃爍
Delay(5);
Write(0x34, 0); //【功能設(shè)置命令】8位數(shù)據(jù),單行顯示,5*7點(diǎn)陣
Delay(5);
}
void Display(uchar addr)
{
Write((addr | 0x80), 0);
}