📄 disp.lst
字号:
C51 COMPILER V7.50 DISP 07/01/2008 10:35:02 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DISP
OBJECT MODULE PLACED IN Disp.OBJ
COMPILER INVOKED BY: C:\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 DISPSCANPORT P3
17 #define DISPDATAPORT P2
18
19 /* 全局变量 */
20 static INT8U DispBuffer[MAXDISPLEN]; //显示内容缓冲区
21 static INT8U DispPro[MAXDISPLEN]; //显示属性缓冲区
22 //显示属性定义
23 #define PRO_POINT (1<<0) //小数点
24 #define PRO_BLINK (1<<1) //闪烁
25
26
27 /* 7段数码管显示字模 */
28 static INT8U code SegCode[] = {
29 0x3F, //0
30 0x06, //1
31 0x5B, //2
32 0x4F, //3
33 0x66, //4
34 0x6D, //5
35 0x7D, //6
36 0x07, //7
37 0x7F, //8
38 0x6F, //9
39 0x77, //10 A
40 0x7C, //11 b
41 0x39, //12 C
42 0x5E, //13 d
43 0x79, //14 E
44 0x71, //15 F
45 0x00, //16 ' '
46 0x40, //17 '-'
47 0x50, //18 'r'
48 0x80, //19 '.'
49 };
50
51
52
53 /***************************************
54
55 显示扫描刷新程序
C51 COMPILER V7.50 DISP 07/01/2008 10:35:02 PAGE 2
56
57 ****************************************/
58 void DispRef(void)
59 {
60 1 static INT8U CurI = 0; //当前扫描数码管位号
61 1 static INT8U BlinkCnt = 0; //闪烁显示计数器
62 1 static BOOLEAN BlinkStatus = 0; //当前闪烁状态
63 1 INT8U dc;
64 1
65 1 /* 计算当前位的显示内容 */
66 1 dc = SegCode[DispBuffer[CurI]];
67 1 if ((DispPro[CurI] & PRO_POINT) != 0) //是否附加小数点
68 1 dc |= SegCode[DC_POINT];
69 1
70 1 /* 计算显示闪烁状态 */
71 1 BlinkCnt ++;
72 1 BlinkCnt %= T_BLINK;
73 1 if (BlinkCnt == 0)
74 1 BlinkStatus = !BlinkStatus;
75 1
76 1 /* 若当前闪烁状态=0且当前显示位允许闪烁 */
77 1 if ((BlinkStatus == 0) && ((DispPro[CurI] & PRO_BLINK) != 0))
78 1 dc = 0;
79 1
80 1 /* 扫描输出当前位 */
81 1 DISPDATAPORT = 0xFF;
82 1 DISPSCANPORT = (1<<CurI);
83 1 DISPDATAPORT = ~dc;
84 1
85 1 CurI ++;
86 1 CurI %= MAXDISPLEN;
87 1 }
88
89
90 /***************************************
91
92 获取整数的长度
93
94 ****************************************/
95 static INT8U GetIntLen(INT32U val)
96 {
97 1 INT8U len;
98 1
99 1 len = 0;
100 1 while (val != 0)
101 1 {
102 2 val /= 10;
103 2 len ++;
104 2 }
105 1
106 1 if (len == 0)
107 1 len = 1;
108 1
109 1 return len;
110 1 }
111
112
113 /***************************************
114
115 将显示缓冲区的内容由左对齐变为右对齐
116 入口参数: 被操作的数的长度
117
C51 COMPILER V7.50 DISP 07/01/2008 10:35:02 PAGE 3
118 ****************************************/
119 static void Right(INT8U len)
120 {
121 1 INT8U sorc,targ;
122 1
123 1 targ = MAXDISPLEN-1;
124 1 sorc = len - 1;
125 1
126 1 while (len != 0)
127 1 {
128 2 DispBuffer[targ] = DispBuffer[sorc];
129 2 DispPro[targ] = DispPro[sorc];
130 2 sorc --;
131 2 targ --;
132 2 len --;
133 2 }
134 1
135 1 while (targ != 0xFF)
136 1 {
137 2 DispBuffer[targ] = DC_EMPTY;
138 2 DispPro[targ] = 0;
139 2 targ --;
140 2 }
141 1 }
142
143 /***************************************
144
145 显示一个整数
146 入口参数:整数数值,起始显示位置,长度
147
148 ****************************************/
149 void DispInt(INT32U val,INT8U position,INT8U len)
150 {
151 1 INT8U n,end;
152 1
153 1 end = position + len - 1;
154 1 for (n=0;n<len;n++)
155 1 {
156 2 DispBuffer[end] = val % 10;
157 2 DispPro[end] = 0;
158 2 val /= 10;
159 2 end --;
160 2 }
161 1 }
162
163 /***************************************
164
165 显示一个整数(左对齐)
166
167 ****************************************/
168 void DispIntLeft(INT32U val)
169 {
170 1 INT8U n;
171 1
172 1 n = GetIntLen(val);
173 1
174 1 DispInt(val,0,n);
175 1 }
176
177 /***************************************
178
179 显示一个整数(右对齐)
C51 COMPILER V7.50 DISP 07/01/2008 10:35:02 PAGE 4
180
181 ****************************************/
182 void DispIntRight(INT32U val)
183 {
184 1 INT8U n;
185 1
186 1 n = GetIntLen(val);
187 1
188 1 DispInt(val,MAXDISPLEN-n,n);
189 1 }
190
191 /***************************************
192
193 显示一个字符
194 入口参数:字符,显示位置,是否闪烁
195
196 ****************************************/
197 void DispChr(INT8U cv,INT8U position,BOOLEAN blink)
198 {
199 1 DispBuffer[position] = cv;
200 1 if (blink == TRUE)
201 1 DispPro[position] = PRO_BLINK;
202 1 else
203 1 DispPro[position] = 0;
204 1 }
205
206
207 /***************************************
208
209 显示一个浮点数
210 注:无超显示范围判断
211 使用全部的显示区域
212
213 ****************************************/
214 void DispFloat(float val)
215 {
216 1 INT8U IntLen,n,DispOrg;
217 1
218 1 DispCls();
219 1
220 1 /* 符号位处理 */
221 1 if (val < 0)
222 1 {
223 2 DispBuffer[0] = DC_SUB;
224 2 IntLen = 1;
225 2 val = -val;
226 2 DispOrg = 1;
227 2 }
228 1 else
229 1 {
230 2 IntLen = 0;
231 2 DispOrg = 0;
232 2 }
233 1
234 1 /* 整数位数计算 */
235 1 IntLen += GetIntLen((INT32U)val);
236 1
237 1 /* 浮点数定长度归一化 */
238 1 for (n=IntLen;n<MAXDISPLEN;n++)
239 1 {
240 2 val *= 10;
241 2 }
C51 COMPILER V7.50 DISP 07/01/2008 10:35:02 PAGE 5
242 1
243 1 /* 四舍五入 */
244 1 val += 0.5;
245 1
246 1 /* 显示有效位数 */
247 1 DispInt((INT32U)val, DispOrg , MAXDISPLEN-DispOrg);
248 1 DispPro[IntLen - 1] = PRO_POINT;
249 1
250 1 /* 计算实际有效位数,去掉小数部分尾数的所有0 */
251 1 n = MAXDISPLEN - 1;
252 1 while (n >= IntLen)
253 1 {
254 2 if (DispBuffer[n] != 0)
255 2 {
256 3 break;
257 3 }
258 2 n --;
259 2 }
260 1
261 1 /* 右对齐 */
262 1 Right(n+1);
263 1
264 1 }
265
266 /***************************************
267
268 显示清屏
269
270 ****************************************/
271 void DispCls(void)
272 {
273 1 INT8U n;
274 1 for (n=0;n<MAXDISPLEN;n++)
275 1 {
276 2 DispBuffer[n] = DC_EMPTY;
277 2 DispPro[n] = 0;
278 2 }
279 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 601 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 28
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -