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/n 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/ir 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 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 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 位重新赋初值 因篇幅问题不能全部显示,请点此查看更多更全内容