//改程序?qū)?shí)現(xiàn)靜態(tài)字符串在液晶屏上的顯示
//程序員:徐茂龍
//完成時(shí)間:2012.03.22
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define Data P0
//管腳的定義
sbit RS = P2^1;
sbit RW = P1^5;
sbit E = P1^6;
sbit BF = P0^7;
sbit WEI = P2^7;
sbit DUAN = P2^6;
uchar code string[] = {"I love WangLele!"};
//函數(shù)聲明
void Delay(uchar); //延時(shí)函數(shù)
void Init(); //初始化函數(shù)
void Busy(); //忙時(shí)檢測(cè)函數(shù)
void Write(uchar, bit); //寫(xiě)入函數(shù)
void Display(uchar);
void main()
{
uchar i;
//關(guān)閉所有數(shù)碼管
Data = 0x0;
WEI = 1;
WEI = 0;
Data = 0xff;
DUAN = 1;
DUAN = 0;
Init();
Display(0x0);
while(1)
{
Write(string[i], 1);
i ++;
if(i == '!')
while(1);
}
}
void Delay(uchar i)
{
uchar j;
for(; i > 0; i --)
for(j = 155; j > 0; j --); //最少延時(shí)1ms
}
void Busy()
{
Delay(5);
RS = 0; //根據(jù)規(guī)定:當(dāng)RS = 0; RW = 1時(shí)才能讀取指令
RW = 1;
E = 1; //E = 1才允許讀寫(xiě)
_nop_();
_nop_(); //兩個(gè)空操作,給硬件反應(yīng)時(shí)間
while(BF); //忙時(shí)檢測(cè)
E = 0;
}
void Write(uchar i, bit flag)
{
Delay(5);
Busy(); //當(dāng)不是忙時(shí)時(shí),
RS = flag; //flag的值將決定是對(duì)數(shù)據(jù)操作還是對(duì)指令操作
RW = 0;
E = 0; //在寫(xiě)指令或者數(shù)據(jù)時(shí),E要處于高脈沖,就是說(shuō)E要從0狀態(tài)轉(zhuǎn)為1
_nop_();
_nop_(); //兩個(gè)空操作,給硬件反應(yīng)時(shí)間
Data = i;
_nop_();
_nop_(); //兩個(gè)空操作,給硬件反應(yīng)時(shí)間
E = 1;
_nop_();
_nop_(); //兩個(gè)空操作,給硬件反應(yīng)時(shí)間
E = 0; //當(dāng)E由高電平轉(zhuǎn)為低電平時(shí),開(kāi)始執(zhí)行指令操作
}
void Init() //初始化函數(shù)
{
Delay(15); //第一次進(jìn)行操作時(shí),延時(shí)時(shí)間稍長(zhǎng)一點(diǎn)
Busy();
Write(0x01, 0); //清平指令
Delay(5);
Write(0x06, 0); //【輸入方式設(shè)置命令】光標(biāo)從左向右移動(dòng),內(nèi)容不移動(dòng)
Delay(5);
Write(0x0f, 0); //【顯示開(kāi)關(guān)設(shè)置命令】顯示開(kāi),光標(biāo)顯示,字符閃爍
Delay(5);
Write(0x38, 0); //【功能設(shè)置命令】8位數(shù)據(jù),雙行顯示,5*7點(diǎn)陣
Delay(5);
}
void Display(uchar temp)
{
Write(temp | 0x80, 0);
}