您的当前位置:首页正文

完整word版基于单片机和PROTEUS的液晶显示屏LCD1602的使用

2022-11-18 来源:步旅网
液晶显示屏1602的使用

LCD1602显示字符‘ A'

斧头帮 2010-05-10

Proteus仿真图

■ ■ ■ r ■ ■ - _ ■

1 「 I

■ 1 ■ 1 ■

■ ■ 1 IF F

_ ■

■ ■ r

1

*■ ■ ■1 - _

_

■I ■ ■ ■

r ■ r ■

・・・・■』・ ■

■ ■

-

I 1

■ ■

■ ■ IF

■ ■ r ■

J

A

: r r

■ ■

1

・ I r

r r p

■ r ■

■,、

LCDIieO?- - ■

L ■ L ■ ■ ■

F

J J ・ F

b b ■ P

■ L ■ ■

■1 -

i; R2| R3 R4| R5 RQ| R7| R3 | R9 叱I 0 0

--I

1

I

■ --1 -1

■ 1 -

I -

-■

^:S: P_ 零史s富出sossa呂fife -B

lOk

-.■■ ■ ■ 1 ■ a 1 1 -.■■ --■ ■ r- ■ ■ ■ a I ■! 1 -a ■ I 丁 1 . ■ 1 -■■ -B .启 ■ : ■ U1

■ ■ +5V

■' ,一 A

Pl-7 PIS PI.5 Pl.4 Pk3 PI-2 Pl.l P1.0 列・

EA AT89C51 JUT

ALE PSB4

P

P3em/R P3 5/n pj

pj.o/uni P3.2/1 WTO pa.imo P3.C;RXD

艮TW

一:

P2.7//M5 P2 6/A14 P2 5//M3 P2 4/A12 P2.3/^1 P2.2//i)D

■1

'1

■0'-

Rsr

XTAL2

“旳 -33 P07ZW po.&r心 P2.0/>Je 叩,5屈 •74■35 P2

™ 1 R1 10k .-tAL-

P o.4yyw

PD.3/An ■JC ■3? PD.2Z^

PO.IASOI -3B PM 叩』呦 PE —pia 1) R

为 ;的-\"n繡晶關 汩弓》3 GND •:斧头帮-- 1

期;2010:0510 C程序: /******************************************

实例81 :用LCD显示字符A

*******************************************/

//包含单片机寄存器的头文件 #in clude

吐尺日

,*

接他

〃包含_n op_()函数定义的头文件

#in clude< intrin II寄存器选择位,将 RS位定义为P2.0引脚 s.h>

〃读写选择位,将 RW位定义为P2.1引脚

sbit RS=PSO;

II使能信号位,将E位定义为P2.2引脚

sbit RW=P 2人1;

II忙碌标志位,,将BF位定义为P0.7引脚

sbit E=P 2人2; I*****************************************************

函数功能:延时1ms

(3j+2)*i=(3 X 33+2) X 10=1010(微秒),可以认为是 1 毫秒

***************************************************/ void delay1ms()

{

unsigned char i,j;

for(i=0;i<10;i++) for(j=0;j<33;j++)

}

/*****************************************************

函数功能:延时若干毫秒

入口参数: n ***************************************************/

void delay(unsigned char n) unsigned char i;

for(i=0;i}

{

/***************************************************** 函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=O,不忙

***************************************************/ unsigned char BusyTest(void)

{

bit result; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); _nop_(); result=BF; E=0;

//空操作四个机器周期,给硬件反应时间 //将忙碌标志电平赋给 result //E=1 ,才允许读写 //空操作

〃根据规定,RS为低电平,RW为高电平时,可以读状态

return result;

}

/***************************************************** 函数功能:将模式设置指令或显

示地址写入液晶模块 入口参数: dictate

***************************************************/ void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1);

RS=0;

//如果忙就等待

//根据规定, RS 和 R/W 同时为低电平时,可以写入指令

RW=0; E=0;

//E 置低电平 (根据表 8-6,写指令时, E 为高脉冲,

// 就是让 E 从 0 到 1 发生正跳变,所以应先置

\"0\"

/***************************************************** 函数功能:指定

_nop_(); _nop_(); P0=dictate; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0;

}

//空操作两个机器周期,给硬件反应时间 //将数据送入 P0 口,即写入指令或地址

//空操作四个机器周期,给硬件反应时间 //E 置高电平

//空操作四个机器周期,给硬件反应时间

//当 E 由高电平跳变成低电平时,液晶模块开始执行命

字符显示的实际地址 入口参数: x

***************************************************/ void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80); // 显示位置的确定方法规定为 \"80H+ 地址码 x\"

}

/***************************************************** 函数功能:将数据 (字符的标准 ASCII 码 )写入液晶模块 入口参数:y(为字符常量) ***************************************************/

void WriteData(unsigned char y) {

while(BusyTest()==1);

RS=1; //RS 为高电平, RW 为低电平时,可以写入数据

RW=0;

//E 置低电平 (根据表 8-6 ,写指令时, E 为高脉E=0;

冲, //就是让E从0到1发生正跳变,所以应先置 \"0\"

//将数据送入 P0 口,即将数据写入液晶模块 P0=y;

_nop_();

_nop_();

_nop_(); _nop_();

//空操作四个机器周期,给硬件反应时间

E=1;

_nop_(); _nop_();

//E 置高电平

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当 E 由高电平跳变成低电平时,液晶模块开始执行命 }

I********************************************* ******** 函数功能:对 LCD 的显示模式进行初始

化设置

******************************************* void LcdInitiate(void) ********/ {

delay(15);

II延时15ms,首次写指令时应给 LCD —段较长的反应时间 WriteInstruction(0x38); 示模式设置:16X 2显示,5 X 7点阵,8位数据接口 delay(5); II延时 5ms WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x0f);

delay(5); //显示模式设置:显示开,有光标,光标闪烁 WriteInstruction(0x06);

delay(5); //显示模式设置:光标右移,字符不 WriteInstruction(0x01); 移 delay(5); //清屏幕指令,将以前的显示内容清}

void main(void)

除 {

LcdInitiate();

//主函数

WriteAddress(0x07); WriteData('A'); //调用 LCD 初始化函数 //将显示地址指定为第 1 行第 8 列 //将字符常量 'A' 写入液晶模块

//字符的字形点阵读出和显示由液晶模块自动完

while(1)

;

}

〃显

、LCD1602循环右移显示字符串

斧头帮 2010-05-10

P roteus仿真图:

LCD1602'

WeLcone Lo China

發奥盛山soasasas

‘4

H

S+ 9 ■■■■ - -- .......白1 J -- ■•耗 -■出打・口 P1 * -- \"-R- J— - ■ ・ ■ ・ 1 r □ B □ PW

P3.&WR P3.5/n P3 4nD P3.3dtlll P3.i/IW1D P3.i/nP2e;A14 P2.5//y3

2

P1.7 PI 5 PI.5 PI 4 PI.3 Pl.i P1.1 P1.0 EA F

■ F ・■

■■■■■■

P

叱钠

■…4 □…

㈣二■

J

■ L ■

■ I ■ J ・■ ■ .. •

f

13

RST

P2 2;AI0

P2 1/^ P0.7//t(7 & ■ \"pm ■R PEIS PD SfflCS ■a* PO \"05 m PCAffiCA ■35 曲

XTAL2 XTALI

PC 3应

P0,3PC V/Cl

OSS ■IT ■ZE ~p?n~ FBI mt Tn

■ ■ ( 1 >R2・Rg为土拉电阻;-■

GND

:::(2)液晶檯块的引脚谗龜

设计1賢头帮 ............

-日期:2010^5.1 0 ..............

C程序: II用LCD循环右移显示\"Welcome to China\"

//包含单片机寄存器的头文件

〃包含_n op_()函数定义的头文件

//寄存器选择位,将 RS位定义为P2.0引脚 #in clude

#in clude< intrin 〃读写选择位,将 RW位定义为P2.1引脚

s.h> //使能信号位,将E位定义为P2.2引脚 sbit RS=P\"。; sbit RW=P 2人1; sbit E=P 2人2; sbit BF=P0A7;

un sig ned char code stri ng[ ]={\"Welcome to Chin a\I*****************************************************

II忙碌标志位,,将BF位定义为P0.7引脚

函数功能:延时1ms

(3j+2)*i=(3 X 33+2) X 10=1010(微秒),可以认为是 1 毫秒

***************************************************I void delay1ms()

{

unsigned char i,j;

for(i=0;i<10;i++) for(j=0;j<33;j++)

}

/*****************************************************

函数功能:延时若干毫秒

入口参数: n ***************************************************/

void delay(unsigned char n) unsigned char i;

for(i=0;i}

{

/***************************************************** 函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=O,不忙

***************************************************/ unsigned char BusyTest(void)

{

bit result; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); _nop_();

//空操作四个机器周期,给硬件反应时间

result=BF;

//将忙碌标志电平赋给 result

E=0;

return result;

//E=1 ,才允许读写 //空操作

〃根据规定,RS为低电平,RW为高电平时,可以读状态

}

/***************************************************** 函数功能:将模式设置指令或显

示地址写入液晶模块 入口参数: dictate

***************************************************/ void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); // 如果忙就等待

RS=0; RW=0; E=0;

//E 置低电平 (根据表 8-6,写指令时, E 为高脉冲, //根据规定, RS 和 R/W 同时为低电平时,可以写入指令

//就是让E从0到1发生正跳变,所以应先置

}

\"0\"

_nop_(); _nop_(); P0=dictate; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0;

//空操作四个机器周期,给硬件反应时间

//当 E 由高电平跳变成低电平时,液晶模块开始执行命//空操作四个机器周期,给硬件反应时间 //E 置高电平

//空操作两个机器周期,给硬件反应时间

〃将数据送入P0 口,即写入指令或地址

/***************************************************** 函数功能:指定字符显

示的实际地址 入口参数: x

***************************************************/ void WriteAddress(unsigned char x)

WriteInstruction(x|0x80); // 显示位置的确定方法规定为 \"80H+ 地址码 x\"

/***************************************************** 函数功能:将数据 (字符

}

{

的标准 ASCII 码)写入液晶模块 入口参数:y(为字符常量)

***************************************************/

void WriteData(unsigned char y) { while(BusyTest()==1);

//RS 为高电平, RW 为低电平时,可以写入数据 RS=1;

RW=0; //E 置低电平 (根据表 8-6,写指令时, E 为高脉

E=0;

冲, \"0\"

// 就是让 E 从 0 到 1 发生正跳变,所以应先置 〃P0=y;

_nop_(); 将数据送入P0 口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

//空操作四个机器周期,给硬件反应时间

E=1;

_nop_(); _nop_(); _nop_(); _nop_();

//E 置高电平

//空操作四个机器周期,给硬件反应时间

E=0; //当 E 由高电平跳变成低电平时,液晶模块开始执行命令

void LcdInitiate(void) { //延时15ms,首次写指令时应给 LCD —段较长的反应时间 〃显delay(15);

WriteInstruction(0x38); 示模式设置:16X 2显示,5 X 7点阵,8位数据接口 delay(5); //延时 5ms

WriteInstruction(0x38);

delay(5); WriteInstruction(0x38);

WriteInstruction(0x0f); //显示模式设置:显示开,有光标,光标闪烁 delay(5);

WriteInstruction(0x06); //显示模式设置:光标右移,字符不 delay(5); 移

WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清

delay(5); 除 } }

/*********************************************

void main(void)

//主函数 ******** 函数功能:对 LCD 的显示模式进行初始{

化设置 unsigned char i; **********************************************LcdInitiate(); //调LCD 初始化函数 *****/

delay(10); 用 while(1) {

WriteInstruction(0x01);

delay(5);

//

WriteAddress(0x00); // 设置显示位置为第一行的第 5个字

i = 0;

while(string[i] != '\\0') {// 显示字符

WriteData(string[i]);

i++;

delay(150);

while(1);

清显示:清屏幕指令

for(i=0;i<4;i++)

delay(250);

、LCD1602显示随机数检测结果

斧头帮 2010-05-10

P roteus仿真图:

+5V

-el - ■! ■ -si - - ■

I—■-! _ .

. J

■ L ■

As+O R6 R7\\] Re n R9 ■

Test Re^wLt 0204,0 线於 ^iuj sossaas吕 日占

-0.-5- -H

B.

E

a_

.启

■翳

■B

--+5V

' ■ ■ A:

Pl.7 Pie Pl 5 Pl.4 PI.3 PI.2 P1.1 Pl 0 AT89C51 □IB P3.7£U P3.SWR P3.5/n P3JZI1 ps.siiun p?-2/irAI1 P2.I/A1D Tzr Me ■^zT

EA F 3\" PS0J 州钠a ■ - HH F ' '

'■] ■ ■ ■■ ■

叫卩 KS 1 ■弘 jaAL2 R1 . lOt-

^JTTALl 2存F'

PO7WD7 F0■ PDE~ 戲心 P0,■ 3i f ~ 引如5 ■s RU P 0.4>W4 ■菊 PLU FD-JT PQg PD.2//C2 -S Pin~ P 0 1/^1 TE PB poaac ■ N ■ HE ■ 引心 GND

LCD1602

说明:H :二二::m

(1 ) R2-R9为上K电阴;…,

(2>液晶模块的乍㈱接地… 设计-:王东蜂 .............. 日期:2008.07.16 .................

C程序:

〃用LCD显示适时检测随机数结果

#in clude //包含单片机寄存器的头文

件 #in 〃包含随机函数ran d()的定义文件

clude #in clude< intrin 〃包含_n op_()函数定义的头文件

s.h> sbit RS=P\"。; //寄存器选择位,将 RS位定义为P2.0引脚

sbit RW=P 2人〃读写选择位,将 RW位定义为P2.1引脚

1; sbit E=P 2 //使能信号位,将E位定义为P2.2引脚 人2; sbit BF=P0A7;

II忙碌标志位,,将BF位定义为P0.7引脚

un sig ned char code digit[ ]={\"0123456789\定义字符数组显示数字

unsigned char code string[ ]={\"Test Result\定义字符数组显示提示 信息 I*****************************************************

函数功能:延时1ms

(3j+2)*i=(3 X 33+2) X 10=1010(微秒),可以认为是 1 毫秒

***************************************************/ void delay1ms()

{

unsigned char i,j;

for(i=0;i<10;i++) for(j=0;j<33;j++)

}

/***************************************************** 函数功能:延时若干毫秒

入口参数: n ***************************************************/

void delay(unsigned char n) unsigned char i;

for(i=0;i}

{

/***************************************************** 函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=O,不忙

***************************************************/ unsigned char BusyTest(void)

{

bit result; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); _nop_(); result=BF; E=0;

//空操作四个机器周期,给硬件反应时间 //将忙碌标志电平赋给 result //将 E 恢复低电平

return result;

//E=1 ,才允许读写 //空操作

〃根据规定,RS为低电平,RW为高电平时,可以读状态

}

/***************************************************** 函数功能:将模式设置指令或显

示地址写入液晶模块 入口参数: dictate

***************************************************/ void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); // 如果忙就等待

RS=0;

//根据规定, RS 和 R/W 同时为低电平时,可以写入指令

RW=0; E=0;

//E 置低电平 (根据表 8-6,写指令时, E 为高脉冲,

// 就是让 E 从 0 到 1 发生正跳变,所以应先置

\"0\"

/***************************************************** 函数功能:指定

_nop_(); _nop_(); P0=dictate; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0;

}

//空操作两个机器周期,给硬件反应时间 //将数据送入 P0 口,即写入指令或地址

//空操作四个机器周期,给硬件反应时间 //E 置高电平

//空操作四个机器周期,给硬件反应时间

//当 E 由高电平跳变成低电平时,液晶模块开始执行命

字符显示的实际地址 入口参数: x

***************************************************/ void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80); // 显示位置的确定方法规定为 \"80H+ 地址码 x\"

}

/***************************************************** 函数功能:将数据 (字符的标准 ASCII 码 )写入液晶模块 入口参数:y(为字符常量) ***************************************************/ void WriteData(unsigned char y)

{

while(BusyTest()==1); RS=1; RW=0; E=0;

//E 置低电平 (根据表 8-6 ,写指令时, E 为高脉//RS 为高电平, RW 为低电平时,可以写入数据

冲, //就是让E从0到1发生正跳变,所以应先置 \"0\"

P0=y; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_();

//空操作四个机器周期,给硬件反应时间 //E 置高电平

//将数据送入 P0 口,即将数据写入液晶模块

_nop_(); _nop_(); E=0;

}

//空操作四个机器周期,给硬件反应时间

//当 E 由高电平跳变成低电平时,液晶模块开始执行命令

I***************************************************** 函数功能:对 LCD 的显示模式进行初始化设置

***************************************************/

void LcdInitiate(void)

{

delay(15);

WriteInstruction(0x38); delay(5);

WriteInstruction(0x38); delay(5);

II延时15ms,首次写指令时应给 LCD —段较长的反应时间 〃显

示模式设置:16X 2显示,5 X 7点阵,8位数据接口

II延时5ms ,给硬件一点反应时间

Write In structio n(0x06); II显示模式设置:光标右移,字

WriteInstruction(0x38); 连续三次,确保初始化成功 II delay(5);

WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁 delay(5); 符不移

delay(5);

Writel nstructio n(0x01); 〃清屏幕指令,将以前的显示内容清除 delay(5);

}

I*****************************************************

函数功能:主函数

***************************************************/

void main(void)

{

unsigned char i; unsigned int x;

unsigned char D1,D2,D3,D4,D5; LcdInitiate(); delay(10);

WriteAddress(0x02); i = 0;

while(string[i] != '\\0')

{

〃定义变量i指向字符串数组元素 〃定义变量,储存检测结果

II分别储存采集的个位、十位、百位、千位和万位数字 II

调用LCD初始化函数

II延时10ms,给硬件一点反应时间

II 从第 1 行第 3 列开始显示 II指向字符数组的第1个元素

WriteData(string[i]);

i++;

}

{

//指向下字符数组一个元素

while(1)

x=rand();

〃返回一个0到//无限循环 32767之间的为

随机数,对 rand的相继调用将产生相同序列的随机数

// 模拟数据采集

D1=x%10; D2=(x%100)/10; D3=(x%1000)/100; D4=(x%10000)/1000; D5=x/10000; WriteAddress(0x45);

//计算个位数子 //计算十位数字 //计算百位数字 //计算千位数字 //计算万位数字 //从第2行第6列开始显示

WriteData(digit[D5]); //将万位数字的字符常量写入 LCD WriteData(digit[D4]); //将千位数字的字符常量写入 LCD WriteData(digit[D3]); //将百位数字的字符常量写入 LCD WriteData(digit[D2]); //将十位数字的字符常量写入 LCD

〃将小数点的字符常量写入 LCD WriteData('.');

WriteData(digit[D1]); //将个位数字的字符常量写入 LCD

for(i=0;i<4;i++) delay(250);

}

〃延时1s (每1s米集一次数据)

//延时 250ms

四、LCD1602电子时钟的设计

斧头帮 2010-05-11

P roteus仿真图:

LCDieO2'

--aj

RsnRsnRtnRan RS :

-

BeiJinS Tine 90:0引21 §嬰 SILU sosasssfe H ::fl R2r R3n M MOI

■IpH pl 01

IpH .Ta -IpH 1» . -lOk^

¥ rAJ * 冷 7 ¥ RhlJ

■■? LI=*T:

sg Pl.? PI Pl.5 Pl.4 一 a ■ ■ +5V A-

M・| PI.2 pi.1 Pl 0 P3-77RD P5.&WR P3 5/T1 P0.4/P P 3.3Z1HII P3.2/IWTD p Aim® P3.0/FSD P2P2.6/A14 Pi.5/AlJ P2 4ffiil P 2.3/A11 P2,2AT89C51I ST AIF PS0J 衲& 甌 …■ ............

:[.::囲 C3 二:

.■ - Q - ■ FN Jp

屮-I n _ _ T _ _ ,■ _

.T - r—

■.JJI-I.J

- - - L J

I

1B

19

RST XTAL2 侧& P21陶 P 』临0卫心 PO戲心 PO 巧\"OS PD.4/曲 卩 卩翊磁 PmiMOI 何Ml 说明 i

.

(1 )尺NF?9为丄i前R; .........

GND

mi®翱鞭的引鼬接地;; 设计:斧

头帮 ........................

日期:2010=05.i2 ......................

C程序:

/**********************************************

液晶时钟设计 功能:简易时钟,显示时分秒,利用中断定时器 0 进行时间参数的确定,每一秒并不精确等于 实际一秒,误差只有几微秒到几十微秒 斧头帮 2010..5.11

********************/ //包含单片机寄存器的头文件

#include #include #include

sbit RS=P^O; sbit RW=P 2人1;

//包含随机函数 rand() 的定义文件 //包含 _nop_() 函

数定义的头文件

//寄存器选择位,将 RS 位定义为 P2.0 引脚 // 读写选择位,将 RW 位定义为 P2.1 引脚 // 使能信号位,将 E 位定义为 P2.2 引脚 //忙碌标志位, ,将 BF 位定义为 P0.7 引脚

//定义字符数组显示数字

sbit E=P 2人2; unsigned char code digit[ ]={\"O123456789\

unsigned char code string[ ]={\"BeiJing Time\定义字符数组显示提示信

息 unsigned char count;

unsigned char s,m,h;

//定义变量统计中断累计次数 //定义变量储存秒、分钟和小时

/*****************************************************

函数功能:延时 1ms

(3j+2)*i=(3 X 33+2) X 10=1010(微秒),可以认为是 1 毫秒 ***************************************************/ void delay1ms()

{

unsigned char i,j;

for(i=0;i<10;i++) for(j=0;j<33;j++)

}

/***************************************************** 函数功能:延时若

干毫秒 入口参数: n

***************************************************/ void delay(unsigned char n) unsigned char i;

for(i=0;i}

{

/***************************************************** 函数功能:判断液晶

模块的忙碌状态

返回值:result。result=1,忙碌;result=O,不忙

***************************************************/

unsigned char BusyTest(void) {

bit result; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); _nop_(); result=BF; E=0;

return result;

}

〃根据规定,RS为低电平,RW为高电平时,可以读状态

//E=1 ,才允许读写 //空操作

//空操作四个机器周期,给硬件反应时间 //将忙碌标志电平赋给 result //将 E 恢复低电平

/************************************************* **** 函数功能:将模式设置指令或显示地址写入液晶

模块 入口参数: dictate *******************************************

********/ void WriteInstruction (unsigned

{

char dictate) //如果忙就等待 while(BusyTest()==1);

//根据规定, RS 和 R/W 同时为低电平时,可以写入指令 RS=0;

RW=0;

//E 置低电平 (根据表 8-6,写指令时, E 为高脉E=0;

冲, //就是让E从0到1发生正跳变,所以应先置 \"0\"

_nop_();

}

_nop_(); P0=dictate; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0;

//空操作两个机器周期,给硬件反应时间 //将数据送入 P0 口,即写入指令或地址

//空操作四个机器周期,给硬件反应时间 //E 置高电平

//空操作四个机器周期,给硬件反应时间

//当 E 由高电平跳变成低电平时,液晶模块开始执行命

/******************************************** ********* 函数功能:指定字符显示的实际地址

入口参数: x

*******************************************

********/

void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80); // 显示位置的确定方法规定为 \"80H+ 地址码 x\" }

/*****************************************************

函数功能:将数据 (字符的标准 ASCII 码)写入液晶模块 入口参数:y(为字符常量) ***************************************************/

void WriteData(unsigned char y) {

while(BusyTest()==1);

RS=1; //RS 为高电平, RW 为低电平时,可以写入数据

RW=0;

E=0; //E 置低电平 (根据表 8-6,写指令时, E 为高脉冲,

// 就是让 E 从 0 到 1 发生正跳变,所以应先置 〃将\"0\"

数据送入P0 口,

P0=y; 即将数据写入液晶模块

_nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周

给硬件反应时间

E=1; 期,

_nop_(); //E 置高电平

_nop_(); _nop_(); _nop_(); //空操作四个机器周期, 给硬件反应时间

E=0;

//当 E 由高电平跳变成低电平时,液晶模块开始执行命令 }

/*********************************************

******** 函数功能:对 LCD 的显示模式进行初始 化设置

void LcdInitiate(void) ********************************************** {*****/ delay(15); //延时15ms,首次写指令时应给 LCD —段较长的反应时间 WriteInstruction(0x38);

示模式设置:16X 2显示,5X 7点阵,8位数据接口

delay(5); //延时 5ms ,给硬件一点反应时间

WriteInstruction(0x38); delay(5); WriteInstruction(0x38) ; //连续三次,确保初始化成 功 delay(5); WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁

delay(5);

WriteInstruction(0x06)//显示模式设置:光标右移,字符不

; 移

delay(5);

//清屏幕指令,将以前的显示内容清

WriteInstruction(0x01)除

;

delay(5);

〃显

/****************************************************************************** 函数功能:显示小时

******************************************************************************/ void DisplayHour()

{

unsigned char i,j; i=h/10; j=h%10; //取整运算,求得十位数字 //取余

WriteAddress(0x44); 运算,求得各位数字 //写显示地址,WriteData(digit[i]

将十位数字显示在第 //将十位数字的);

字符常量写入 //将个位数字的字符常LCD WriteData(digit[j]

量写入

LCD

}

/****************************************************************************** 函数功能:显示分钟

******************************************************************************/

void DisplayMinute()

{

unsigned char i,j; i=m/10; //取整运算,求得十位数字 j=m%10;

//取余运算,求得各位数字 WriteAddress(0x47); //写显示地址,将十位数字显示在

WriteData(digit[i]

);

第 //将十位数字的字符常量写入 //LCD 将WriteData(digit[j]个位数字的字符常量写入

LCD

);

/****************************************************************************** 函数

功能:显示秒

******************************************************************************/

void DisplaySecond()

{

//取整运算,求得十位数字 unsigned char i,j; //取余运算,求得各位数字 i=s/10; j=s%10; //写显示地址,将十位数字显示在

WriteAddress(0x4a);

第 // 将十位数字的字符常量写入 LCD

WriteData(digit[i]); // 将个位数字的字符常量写入 LCD WriteData(digit[j]);

2 行第 5 列

2 行第 8 列

2 行第 11 列

}

/*********************************************************

************

main function

************************************************************

***********/ void main(void) {

unsigned char i; //调用 LCD 初始化函数

LcdInitiate() ;

// 使用定时器 T0 的模式 1 TMOD=0x01;

// 定时器 T0 的高 8 位设置初值 TH0=(65536-46083)/256;

TL0=(65536-46083)%256; // 定时器 T0 的低 8 位设置初值

EA=1; //开总中断 ET0=1;

//定时器 T0 中断允许 //启动定

TR0=1;

时器 T0

count=0; s=0; m=0; h=0;

// 中断次数初始化为 0 // 秒初始化为 0 //分钟

初始化为 //小时初始化为

WriteAddress(0x03); i=0;

while(string[i]!='\\0')

WriteData(string[i]); // i++;

}

{

//写地址,从第 1 行第 4 列开始显示 //从字符数组的第 1 个元素开始显示

// 只要没有显示到字符串的结束标志 '\\0',就继续

将第 i 个字符数组元素写入 LCD

//指向下一个数组元素

//写地址,将第二个分号显示在第 // 将分号的字符常量写入 LCD //写地址,将第二个分号显示在第 // 将分号的字符常量写入 LCD //无限循环

WriteAddress(0x46); WriteData(':'); WriteAddress(0x49); WriteData(':'); while(1)

{

2 行第 7 列 2 行第 10 列

DisplayHour(); delay(5); DisplayMinute(); delay(5); DisplaySecond(); delay(5);

//显示小时 //给硬件一点反应时间 //显示分钟

//给硬件一点反应时间 //显示秒

//给硬件一点反应时间

/*******************************************************

函数功能:定时器 T0 的中断服务函数

*********/

void Time0(void ) interrupt 1 using { 1 // count++; if(count==20) {

count=0;

s++; }

if(s==60)

{

s=0;

m++;

}

if(m==60)

{

m=0; h++;

}

if(h==24)

{

h=0;

}

TH0=(65536-46083)/256; TL0=(65536-46083)%256;

定时器 T0 的中断编号为 1,使用第 1 组工作寄存器

//每产生 1 次中

中断累计次数加 1 断,

20次

//如果中断次数计满

// 中断累计次数清 0 // 秒加 1

//如果计满 60 秒 // 秒清 0 //分钟加 1

//如果计满 60 分

//分钟清 0 //小时加 1

// 如果计满 24 小

// 小时清 0

// 定时器 T0 高 8 位重新赋初值 //定时器 T0 低 8 位重新赋初值

因篇幅问题不能全部显示,请点此查看更多更全内容