📄 51
字号:
C51 COMPILER V8.09 EX84 07/12/2010 14:33:30 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE EX84
OBJECT MODULE PLACED IN ex84.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE ex84.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //液晶时钟设计
2 #include<reg52.h> //包含单片机寄存器的头文件
3 #include<stdlib.h> //包含随机函数rand()的定义文件
4 #include<intrins.h> //包含_nop_()函数定义的头文件
5 sbit RS=P2^7; //寄存器选择位,将RS位定义为P2.0引脚
6 sbit RW=P2^6; //读写选择位,将RW位定义为P2.1引脚
7 sbit E=P2^5; //使能信号位,将E位定义为P2.2引脚
8 sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
9 unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字
10 unsigned char code string[ ]={"Beijing Time"}; //定义字符数组显示提示信息
11 unsigned char count; //定义变量统计中断累计次数
12 unsigned char s,m,h; //定义变量储存秒、分钟和小时
13 /*****************************************************
14 函数功能:延时1ms
15 (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
16 ***************************************************/
17 void delay1ms()
18 {
19 1 unsigned char i,j;
20 1 for(i=0;i<10;i++)
21 1 for(j=0;j<33;j++)
22 1 ;
23 1 }
24 /*****************************************************
25 函数功能:延时若干毫秒
26 入口参数:n
27 ***************************************************/
28 void delay(unsigned char n)
29 {
30 1 unsigned char i;
31 1 for(i=0;i<n;i++)
32 1 delay1ms();
33 1 }
34 /*****************************************************
35 函数功能:判断液晶模块的忙碌状态
36 返回值:result。result=1,忙碌;result=0,不忙
37 ***************************************************/
38 unsigned char BusyTest(void)
39 {
40 1 bit result;
41 1 RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
42 1 RW=1;
43 1 E=1; //E=1,才允许读写
44 1 _nop_(); //空操作
45 1 _nop_();
46 1 _nop_();
47 1 _nop_(); //空操作四个机器周期,给硬件反应时间
48 1 result=BF; //将忙碌标志电平赋给result
49 1 E=0; //将E恢复低电平
50 1 return result;
51 1 }
52 /*****************************************************
53 函数功能:将模式设置指令或显示地址写入液晶模块
54 入口参数:dictate
55 ***************************************************/
C51 COMPILER V8.09 EX84 07/12/2010 14:33:30 PAGE 2
56 void WriteInstruction (unsigned char dictate)
57 {
58 1 while(BusyTest()==1); //如果忙就等待
59 1 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
60 1 RW=0;
61 1 E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
62 1 // 就是让E从0到1发生正跳变,所以应先置"0"
63 1 _nop_();
64 1 _nop_(); //空操作两个机器周期,给硬件反应时间
65 1 P0=dictate; //将数据送入P0口,即写入指令或地址
66 1 _nop_();
67 1 _nop_();
68 1 _nop_();
69 1 _nop_(); //空操作四个机器周期,给硬件反应时间
70 1 E=1; //E置高电平
71 1 _nop_();
72 1 _nop_();
73 1 _nop_();
74 1 _nop_(); //空操作四个机器周期,给硬件反应时间
75 1 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
76 1 }
77 /*****************************************************
78 函数功能:指定字符显示的实际地址
79 入口参数:x
80 ***************************************************/
81 void WriteAddress(unsigned char x)
82 {
83 1 WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
84 1 }
85 /*****************************************************
86 函数功能:将数据(字符的标准ASCII码)写入液晶模块
87 入口参数:y(为字符常量)
88 ***************************************************/
89 void WriteData(unsigned char y)
90 {
91 1 while(BusyTest()==1);
92 1 RS=1; //RS为高电平,RW为低电平时,可以写入数据
93 1 RW=0;
94 1 E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
95 1 // 就是让E从0到1发生正跳变,所以应先置"0"
96 1 P0=y; //将数据送入P0口,即将数据写入液晶模块
97 1 _nop_();
98 1 _nop_();
99 1 _nop_();
100 1 _nop_(); //空操作四个机器周期,给硬件反应时间
101 1 E=1; //E置高电平
102 1 _nop_();
103 1 _nop_();
104 1 _nop_();
105 1 _nop_(); //空操作四个机器周期,给硬件反应时间
106 1 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
107 1 }
108 /*****************************************************
109 函数功能:对LCD的显示模式进行初始化设置
110 ***************************************************/
111 void LcdInitiate(void)
112 {
113 1 delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
114 1 WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
115 1 delay(5); //延时5ms ,给硬件一点反应时间
116 1 WriteInstruction(0x38);
117 1 delay(5);
C51 COMPILER V8.09 EX84 07/12/2010 14:33:30 PAGE 3
118 1 WriteInstruction(0x38); //连续三次,确保初始化成功
119 1 delay(5);
120 1 WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
121 1 delay(5);
122 1 WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -