📄 disp.lst
字号:
C51 COMPILER V7.50 DISP 10/24/2007 00:27:06 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DISP
OBJECT MODULE PLACED IN Disp.OBJ
COMPILER INVOKED BY: F:\edu\Keil\C51\BIN\C51.EXE Disp.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 ****************************************************
3
4 显示
5
6 ****************************************************
7 */
8
9 #include <reg52.H>
10 #include "Typedef.H"
11 #include "UserDef.H"
12 #include "Disp.h"
13
14
15 /* 端口定义 */
16 #define DISPDATAPORT P0 //数据端口
17 sbit Pin_RS = P2^0; //指令、数据选择(0=指令;1=数据)
18 sbit Pin_RW = P2^1; //读写选择(0=写,1=读)
19 sbit Pin_E = P2^2; //锁存(下降沿有效)
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 10/24/2007 00:27:06 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 10/24/2007 00:27:06 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 static 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 DispPro[0][end] = 0;
175 2 val /= 10;
176 2 end --;
177 2 }
178 1 }
179
C51 COMPILER V7.50 DISP 10/24/2007 00:27:06 PAGE 4
180
181 /***************************************
182
183 显示一个字符
184 入口参数:字符,显示位置,是否闪烁
185
186 ****************************************/
187 void DispChr(INT8U cv,INT8U row,INT8U col,BOOLEAN blink)
188 {
189 1 DispBuffer[row][col] = cv;
190 1 if (blink == TRUE)
191 1 DispPro[row][col] = PRO_BLINK;
192 1 else
193 1 DispPro[row][col] = 0;
194 1 }
195
196 /***************************************
197
198 显示一个字符串
199 入口参数:字符串指针,显示位置,是否闪烁
200
201 ****************************************/
202 void DispStr(INT8U *str,INT8U row,INT8U col,BOOLEAN blink)
203 {
204 1 while ((*str)!=0)
205 1 {
206 2 DispBuffer[row][col] = *str;
207 2 if (blink == TRUE)
208 2 DispPro[row][col] = PRO_BLINK;
209 2 else
210 2 DispPro[row][col] = 0;
211 2
212 2 str ++;
213 2 col ++;
214 2 }
215 1 }
216
217 /***************************************
218
219 显示一个浮点数
220 注:无超显示范围判断
221 使用全部的显示区域
222
223 ****************************************/
224 void DispFloat(float val,INT8U row,INT8U col,INT8U Len)
225 {
226 1 INT8U IntLen,n;
227 1 INT32U iv,ivf;
228 1
229 1
230 1 /* 符号位处理 */
231 1 if (val < 0)
232 1 {
233 2 DispBuffer[row][col] = '-';
234 2 val = -val;
235 2 col ++;
236 2 Len --;
237 2 }
238 1
239 1 /* 整数位数计算 */
240 1 IntLen = GetIntLen((INT32U)val);
241 1
C51 COMPILER V7.50 DISP 10/24/2007 00:27:06 PAGE 5
242 1 /* 整数部分 */
243 1 iv = (INT32U)val;
244 1
245 1 /* */
246 1 for (n=0;n<(Len-IntLen);n++)
247 1 {
248 2 val *= 10;
249 2 }
250 1 ivf = (INT32U)val;
251 1 ivf += 5;
252 1 ivf /= 10;
253 1
254 1 /* 显示整数部分 */
255 1 DispInt(iv,row,col, IntLen);
256 1 /* 显示小数点 */
257 1 DispChr('.',row,col+IntLen ,FALSE);
258 1 /* 显示小数部分 */
259 1 for (n=0;n<(Len-IntLen-1);n++)
260 1 {
261 2 DispInt(ivf%10 , row , col + Len -n -1, 1);
262 2 ivf /= 10;
263 2 }
264 1
265 1 /* 计算实际有效位数,去掉小数部分尾数的所有0 */
266 1 n = col + Len - 1;
267 1 while (n >= IntLen)
268 1 {
269 2 if (DispBuffer[row][n] != '0')
270 2 {
271 3 break;
272 3 }
273 2 DispBuffer[row][n] = ' ';
274 2 n --;
275 2 }
276 1 }
277
278 /***************************************
279
280 显示清屏
281
282 ****************************************/
283 void DispCls(void)
284 {
285 1 INT8U col,row;
286 1
287 1 for (row=0;row<2;row++)
288 1 {
289 2 for (col=0;col<MAXDISPLEN;col++)
290 2 {
291 3 DispBuffer[row][col] = ' ';
292 3 DispPro[row][col] = 0;
293 3 }
294 2 }
295 1 }
296
297
298
299 /***************************************
300
301 屏初始化
302
303 ****************************************/
C51 COMPILER V7.50 DISP 10/24/2007 00:27:06 PAGE 6
304 void DispInit(void)
305 {
306 1
307 1 LCD_Cmd(0x38); //Function Set
308 1 //data bus length = 1 (8 bits)
309 1 //display lines = 1 (2 lines)
310 1 //character font = 0(5x7 Dot Font)
311 1
312 1 LCD_Cmd(0x06); //Entry Mode Set
313 1 //Sets DD RAM counter to increment
314 1
315 1 LCD_Cmd(0x0C); //Sets Display
316 1
317 1 LCD_Cmd(0x01); //Clears Display
318 1 //returns cursor to the Home Position (Address 00)
319 1 }
320
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 793 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 36
IDATA SIZE = 64 ----
BIT SIZE = 1 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -