📄 time_lcd.lst
字号:
C51 COMPILER V8.02 TIME_LCD 12/09/2008 14:31:25 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TIME_LCD
OBJECT MODULE PLACED IN time_lcd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE time_lcd.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include"reg51.h"
2 #define uchar unsigned char
3 #define uint unsigned int
4 sbit LCM_RW=P3^3; /*定义引脚*/
5 sbit LCM_RS=P3^2;
6 sbit LCM_E=P3^4 ;
7 #define LCM_Data P0
8 #define Busy 0x80 /*用于检测LCM状态字中的Busy标识*/
9 #define XMS 5500
10 uchar MScond=0; /*ms*/
11 uchar Scond=0; /*s*/
12 uchar Minute=0; /*min*/
13 uchar Hour=0; /*h*/
14 uchar buf[8];
15 void WriteDataLCM(uchar WDLCM);
16 void WriteCommandLCM(uchar WCLCM,BuysC);
17 uchar ReadDataLCM(void);
18 uchar ReadStatusLCM(void);
19 void LCMInit(void);
20 void DisplayOneChar(uchar X, uchar Y, uchar DData);
21 void DisplayStrChar(uchar X, uchar Y, uchar *DData);
22 void Delay5Ms(void);
23 void Delay400Ms(void);
24
25 uchar code Time[] = {"Now Time:"};
26 /**************************************************************************/
27 void timer0(void) interrupt 1 using 0
28 {
29 1 TH0=0xb1;
30 1 TL0=0xeb;
31 1 MScond=MScond+1;
32 1 if(MScond==50)
33 1 {
34 2 MScond=0;
35 2 Scond=Scond+1;
36 2 if(Scond==60)
37 2 {
38 3 Scond=0;
39 3 Minute=Minute+1;
40 3 if(Minute==60)
41 3 {
42 4 Minute=0;
43 4 Hour=Hour+1;
44 4 if(Hour==24)Hour=0;
45 4 }
46 3 }
47 2 }
48 1 }
49
50 void BCD(void)
51 {
52 1 buf[7]=Scond%10+0x30;
53 1 buf[6]=Scond/10+0x30;
54 1 buf[5]=0x3a;
55 1 buf[4]=Minute%10+0x30;
C51 COMPILER V8.02 TIME_LCD 12/09/2008 14:31:25 PAGE 2
56 1 buf[3]=Minute/10+0x30;
57 1 buf[2]=0x3a;
58 1 buf[1]=Hour%10+0x30;
59 1 buf[0]=Hour/10+0x30;
60 1 }
61 /*************************************************************************/
62
63 void main(void)
64 {
65 1 uchar TMP;
66 1 TMOD=0x01;
67 1 TH0=0xb1;
68 1 TL0=0xeb;
69 1 TR0=1;
70 1 ET0=1;
71 1 EA=1;
72 1
73 1 Delay400Ms(); /*启动等待,等LCM讲入工作状态*/
74 1 LCMInit(); /*LCM初始化*/
75 1 Delay5Ms(); /*延时片刻(可不要)*/
76 1 DisplayStrChar(0, 0, Time);
77 1 while(1)
78 1 {if(TMP!=Scond){TMP=Scond;BCD();DisplayStrChar(8, 1, buf);}}
79 1 }
80 /*写数据*/
81 void WriteDataLCM(uchar WDLCM)
82 {
83 1 ReadStatusLCM(); /*检测忙*/
84 1 LCM_Data = WDLCM;
85 1 LCM_RS = 1;
86 1 LCM_RW = 0;
87 1 LCM_E = 0; /*若晶振速度太高可以在这后加小的延时*/
88 1 LCM_E = 0; /*延时*/
89 1 LCM_E = 1;
90 1 }
91
92 /*写指令*/
93 void WriteCommandLCM(uchar WCLCM,BuysC) /*BuysC为0时忽略忙检测*/
94 {
95 1 if (BuysC) ReadStatusLCM(); /*根据需要检测忙*/
96 1 LCM_Data = WCLCM;
97 1 LCM_RS = 0;
98 1 LCM_RW = 0;
99 1 LCM_E = 0;
100 1 LCM_E = 0;
101 1 LCM_E = 1;
102 1 }
103
104 /*读数据*/
105 uchar ReadDataLCM(void)
106 {
107 1 LCM_RS = 1;
108 1 LCM_RW = 1;
109 1 LCM_E = 0;
110 1 LCM_E = 0;
111 1 LCM_E = 1;
112 1 return(LCM_Data);
113 1 }
114
115 /*读状态*/
116 uchar ReadStatusLCM(void)
117 {
C51 COMPILER V8.02 TIME_LCD 12/09/2008 14:31:25 PAGE 3
118 1 LCM_Data = 0xFF;
119 1 LCM_RS=0;
120 1 LCM_RW = 1;
121 1 LCM_E = 0;
122 1 LCM_E = 0;
123 1 LCM_E = 1;
124 1 while (LCM_Data & Busy); /*检测忙信号*/
125 1 return(LCM_Data);
126 1 }
127
128 void LCMInit(void) /*LCM初始化*/
129 {
130 1 LCM_Data = 0;
131 1 WriteCommandLCM(0x38,0); /*三次显示模式设置,不检测忙信号*/
132 1 Delay5Ms();
133 1 WriteCommandLCM(0x38,0);
134 1 Delay5Ms();
135 1 WriteCommandLCM(0x38,0);
136 1 Delay5Ms();
137 1
138 1 WriteCommandLCM(0x38,1); /*显示模式设置,开始要求每次检测忙信号*/
139 1 WriteCommandLCM(0x08,1); /*关闭显示*/
140 1 WriteCommandLCM(0x01,1); /*显示清屏*/
141 1 WriteCommandLCM(0x06,1); /* 显示光标移动设置*/
142 1 WriteCommandLCM(0x0C,1); /* 显示开及光标设置*/
143 1 }
144
145 /*按指定位置显示一个字符*/
146 void DisplayOneChar(uchar X, uchar Y, uchar DData)
147 {
148 1 Y &= 0x1;
149 1 X &= 0xF; /*限制X不能大于15,Y不能大于1*/
150 1 if (Y) X |= 0x40; /*当要显示第二行时地址码+0x40;*/
151 1 X |= 0x80; /*算出指令码*/
152 1 WriteCommandLCM(X, 0); /*这里不检测忙信号,发送地址码*/
153 1 WriteDataLCM(DData);
154 1 }
155
156 /*按指定位置显示一串字符*/
157 void DisplayStrChar(uchar X, uchar Y, uchar *DData)
158 {
159 1 uchar ListLength;
160 1 ListLength = 0;
161 1 Y &= 0x1;
162 1 X &= 0xF; /*限制X不能大于15,Y不能大于1*/
163 1 while (DData[ListLength]>0) /*若到达字串尾则退出*/
164 1 {
165 2 if (X <= 0xF) /*X坐标应小于0xF*/
166 2 {
167 3 DisplayOneChar(X, Y, DData[ListLength]);/*显示单个字符*/
168 3 ListLength++;
169 3 X++;
170 3 }
171 2 }
172 1 }
173
174 /*5ms延时*/
175 void Delay5Ms(void)
176 {
177 1 uint TempCyc = 5552;
178 1 while(TempCyc--);
179 1 }
C51 COMPILER V8.02 TIME_LCD 12/09/2008 14:31:25 PAGE 4
180
181 /*400ms延时*/
182 void Delay400Ms(void)
183 {
184 1 uchar TempCycA = 5;
185 1 uint TempCycB;
186 1 while(TempCycA--)
187 1 {
188 2 TempCycB=7269;
189 2 while(TempCycB--);
190 2 }
191 1 }
192
193
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 472 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 10
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -