📄 disp_drive.lst
字号:
C51 COMPILER V7.50 DISP_DRIVE 01/04/2009 22:44:57 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DISP_DRIVE
OBJECT MODULE PLACED IN Disp_drive.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Disp_drive.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 ****************************************************
3
4 显示
5
6 ****************************************************/
7 #include<rtx51tny.h>
8 #include <reg52.H>
9 #include "Typedef.H"
10 #include "Disp_drive.h"
11 #include "UserDef.H"
12
13
14 /* 端口定义 */
15 #define DISPDATAPORT P0 //数据端口
16 sbit Pin_RS = P2^5; //指令、数据选择(0=指令;1=数据)
17 sbit Pin_RW = P2^6; //读写选择(0=写,1=读)
18 sbit Pin_E = P2^7; //锁存(下降沿有效)
19
20
21 /* 全局变量 */
22 static INT8U idata DispBuffer[2][MAXDISPLEN]; //显示内容缓冲区
23 static INT8U idata DispPro[2][MAXDISPLEN]; //显示属性缓冲区
24 //显示属性定义
25 #define PRO_BLINK (1<<1) //闪烁
26
27
28 /***************************************
29
30 LCD忙等待
31
32 ****************************************/
33 void Busy(void)
34 {
35 1 INT8U bf;
36 1
37 1 Pin_E = 0;
38 1 DISPDATAPORT = 0xFF; //使端口为输入状态
39 1 Pin_RW = 1; //读
40 1 Pin_RS = 0; //指令
41 1
42 1 while (1)
43 1 {
44 2 Pin_E = 1;
45 2 bf = DISPDATAPORT;
46 2 Pin_E = 0;
47 2 if ((bf & 0x80) == 0)
48 2 break;
49 2 }
50 1 }
51
52
53 /***************************************
54
55 LCD数据写
C51 COMPILER V7.50 DISP_DRIVE 01/04/2009 22:44:57 PAGE 2
56
57 ****************************************/
58 void LCD_Data(INT8U Data)
59 {
60 1 Busy();
61 1
62 1 Pin_E = 0;
63 1 Pin_RW = 0; //写
64 1 Pin_RS = 1; //数据
65 1
66 1 Pin_E = 1;
67 1
68 1 DISPDATAPORT = Data;
69 1
70 1 Pin_E = 0;
71 1 }
72
73 /***************************************
74
75 LCD命令写
76
77 ****************************************/
78 void LCD_Cmd(INT8U cmd)
79 {
80 1 Busy();
81 1
82 1 Pin_E = 0;
83 1 Pin_RW = 0; //写
84 1 Pin_RS = 0; //指令
85 1
86 1 Pin_E = 1;
87 1
88 1 DISPDATAPORT = cmd;
89 1
90 1 Pin_E = 0;
91 1 }
92
93 /***************************************
94
95 显示扫描刷新程序
96
97 ****************************************/
98 void DispRef(void)
99 {
100 1 static INT8U BlinkCnt = 0; //闪烁显示计数器
101 1 static BOOLEAN BlinkStatus = 0; //当前闪烁状态
102 1 INT8U n;
103 1
104 1 /* 计算显示闪烁状态 */
105 1 BlinkCnt ++;
106 1 BlinkCnt %= T_BLINK;
107 1 if (BlinkCnt == 0)
108 1 BlinkStatus = !BlinkStatus;
109 1
110 1 /* 若当前闪烁状态=0且当前显示位允许闪烁 */
111 1
112 1
113 1 /* 输出行0 */
114 1 LCD_Cmd(0x80);
115 1 for (n=0;n<MAXDISPLEN;n++)
116 1 {
117 2 if ((BlinkStatus == 0) && ((DispPro[0][n] & PRO_BLINK) != 0))
C51 COMPILER V7.50 DISP_DRIVE 01/04/2009 22:44:57 PAGE 3
118 2 LCD_Data(' ');
119 2 else
120 2 LCD_Data(DispBuffer[0][n]);
121 2 }
122 1
123 1 /* 输出行1 */
124 1 LCD_Cmd(0xC0);
125 1 for (n=0;n<MAXDISPLEN;n++)
126 1 {
127 2 if ((BlinkStatus == 0) && ((DispPro[1][n] & PRO_BLINK) != 0))
128 2 LCD_Data(' ');
129 2 else
130 2 LCD_Data(DispBuffer[1][n]);
131 2 }
132 1 }
133
134
135 /***************************************
136
137 获取整数的长度
138
139 ****************************************/
140 static INT8U GetIntLen(INT32U val)
141 {
142 1 INT8U len;
143 1
144 1 len = 0;
145 1 while (val != 0)
146 1 {
147 2 val /= 10;
148 2 len ++;
149 2 }
150 1
151 1 if (len == 0)
152 1 len = 1;
153 1
154 1 return len;
155 1 }
156
157
158
159 /***************************************
160
161 显示一个整数
162 入口参数:整数数值,起始显示位置,长度
163
164 ****************************************/
165 void DispInt(INT32U val,INT8U row,INT8U col,INT8U len)
166 {
167 1 INT8U n,end;
168 1
169 1 end = col + len - 1;
170 1 for (n=0;n<len;n++)
171 1 {
172 2 DispBuffer[row][end] = val % 10 + '0';
173 2
174 2 DispPro[0][end] = 0;
175 2 val /= 10;
176 2 end --;
177 2 }
178 1 }
179
C51 COMPILER V7.50 DISP_DRIVE 01/04/2009 22:44:57 PAGE 4
180
181 /***************************************
182
183 显示一个整数(可闪烁)
184 入口参数:整数数值,起始显示位置,长度
185
186 ****************************************/
187 void DispInt_blink(INT32U val,INT8U row,INT8U col,INT8U len,BOOLEAN blink)
188 {
189 1 INT8U n,end;
190 1
191 1 end = col + len - 1;
192 1 for (n=0;n<len;n++)
193 1 {
194 2 DispBuffer[row][end] = val % 10 + '0';
195 2
196 2 if (blink == TRUE)
197 2 DispPro[row][col+n] = PRO_BLINK;
198 2 else
199 2 DispPro[row][col+n] = 0;
200 2 // DispPro[0][end] = 0;
201 2 val /= 10;
202 2 end --;
203 2 }
204 1 }
205
206
207
208
209
210
211 /***************************************
212
213 显示一个字符
214 入口参数:字符,显示位置,是否闪烁
215
216 ****************************************/
217 void DispChr(INT8U cv,INT8U row,INT8U col,BOOLEAN blink)
218 {
219 1 DispBuffer[row][col] = cv;
220 1 if (blink == TRUE)
221 1 DispPro[row][col] = PRO_BLINK;
222 1 else
223 1 DispPro[row][col] = 0;
224 1 }
225
226 /***************************************
227
228 显示一个字符串
229 入口参数:字符串指针,显示位置,是否闪烁
230
231 ****************************************/
232 void DispStr(INT8U *str,INT8U row,INT8U col,BOOLEAN blink)
233 {
234 1 while ((*str)!=0)
235 1 {
236 2 DispBuffer[row][col] = *str;
237 2 if (blink == TRUE)
238 2 DispPro[row][col] = PRO_BLINK;
239 2 else
240 2 DispPro[row][col] = 0;
241 2
C51 COMPILER V7.50 DISP_DRIVE 01/04/2009 22:44:57 PAGE 5
242 2 str ++;
243 2 col ++;
244 2 }
245 1 }
246
247 /***************************************
248
249 显示一个浮点数
250 注:无超显示范围判断
251 使用全部的显示区域
252
253 ****************************************/
254 void DispFloat(float val,INT8U row,INT8U col,INT8U Len)
255 {
256 1 INT8U IntLen,n;
257 1 INT32U iv,ivf;
258 1
259 1
260 1 /* 符号位处理 */
261 1 if (val < 0)
262 1 {
263 2 DispBuffer[row][col] = '-';
264 2 val = -val;
265 2 col ++;
266 2 Len --;
267 2 }
268 1
269 1 /* 整数位数计算 */
270 1 IntLen = GetIntLen((INT32U)val);
271 1
272 1 /* 整数部分 */
273 1 iv = (INT32U)val;
274 1
275 1 /* */
276 1 for (n=0;n<(Len-IntLen);n++)
277 1 {
278 2 val *= 10;
279 2 }
280 1 ivf = (INT32U)val;
281 1 ivf += 5;
282 1 ivf /= 10;
283 1
284 1 /* 显示整数部分 */
285 1 DispInt(iv,row,col, IntLen);
286 1 /* 显示小数点 */
287 1 DispChr('.',row,col+IntLen ,FALSE);
288 1 /* 显示小数部分 */
289 1 for (n=0;n<(Len-IntLen-1);n++)
290 1 {
291 2 DispInt(ivf%10 , row , col + Len -n -1, 1);
292 2 ivf /= 10;
293 2 }
294 1
295 1 /* 计算实际有效位数,去掉小数部分尾数的所有0 */
296 1 n = col + Len - 1;
297 1 while (n >= IntLen)
298 1 {
299 2 if (DispBuffer[row][n] != '0')
300 2 {
301 3 break;
302 3 }
303 2 DispBuffer[row][n] = ' ';
C51 COMPILER V7.50 DISP_DRIVE 01/04/2009 22:44:57 PAGE 6
304 2 n --;
305 2 }
306 1 }
307
308 /***************************************
309
310 显示清屏
311
312 ****************************************/
313 void DispCls(void)
314 {
315 1 INT8U col,row;
316 1
317 1 for (row=0;row<2;row++)
318 1 {
319 2 for (col=0;col<MAXDISPLEN;col++)
320 2 {
321 3 DispBuffer[row][col] = ' ';
322 3 DispPro[row][col] = 0;
323 3 }
324 2 }
325 1 }
326
327
328
329 /***************************************
330
331 屏初始化
332
333 ****************************************/
334 void DispInit(void)
335 {
336 1
337 1 LCD_Cmd(0x38); //Function Set
338 1 //data bus length = 1 (8 bits)
339 1 //display lines = 1 (2 lines)
340 1 //character font = 0(5x7 Dot Font)
341 1
342 1 LCD_Cmd(0x06); //Entry Mode Set
343 1 //Sets DD RAM counter to increment
344 1
345 1 LCD_Cmd(0x0C); //Sets Display
346 1
347 1 LCD_Cmd(0x01); //Clears Display
348 1 //returns cursor to the Home Position (Address 00)
349 1 }
350
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 912 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 45
IDATA SIZE = 64 ----
BIT SIZE = 1 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -