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