📄 main.lst
字号:
PL/M-96 COMPILER MAIN 06/12/:5 17:37:49 PAGE 1
DOS 7.10 (038-N) PL/M-96 V1.1 COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN C:\WAVE6000\SAMPLES\MAIN.OBJ
COMPILER INVOKED BY: C:\COMP96\PLM96.EXE C:\WAVE6000\SAMPLES\MAIN.PLM DB TY FAST(100)
1 MAIN:DO;
/***************************************************/
/*80C196KB CPU专用寄存器*/
/***************************************************/
2 1 DECLARE ZERO WORD AT (00H); /*R*/
3 1 DECLARE AD_COMMAND BYTE AT(02H); /*W*/
4 1 DECLARE HSI_MODE BYTE AT (03H); /*W*/
5 1 DECLARE HSI_TIME WORD AT (04H); /*R*/
6 1 DECLARE HSO_TIME WORD AT (04H); /*W*/
7 1 DECLARE HSI_STATUS BYTE AT (06H); /*R*/
8 1 DECLARE HSO_COMMAND BYTE AT (06H); /*W*/
9 1 DECLARE SBUF BYTE AT(07H); /* R/W */
10 1 DECLARE INT_MASK BYTE AT (08H); /*R W*/
11 1 DECLARE INT_PENDING BYTE AT (09H); /*R W*/
12 1 DECLARE WATCHDOG BYTE AT (0AH); /*W*/
13 1 DECLARE TIMER1 WORD AT (0AH); /*R*/
14 1 DECLARE TIMER2 WORD AT (0CH); /*R W*/
15 1 DECLARE IOC2 BYTE AT (0BH); /*W*/
16 1 DECLARE IOPORT0 BYTE AT (0EH); /*R*/
17 1 DECLARE IOPORT1 BYTE AT (0FH); /*R W*/
18 1 DECLARE IOPORT2 BYTE AT (10H); /*R W*/
19 1 DECLARE INT_PEND1 BYTE AT (12H); /*R W*/
20 1 DECLARE INT_MASK1 BYTE AT (13H); /*R W*/
21 1 DECLARE WSR BYTE AT (14H); /*R W*/
22 1 DECLARE IOS0 BYTE AT (15H); /*R*/
23 1 DECLARE IOC0 BYTE AT (15H); /*W*/
24 1 DECLARE IOS1 BYTE AT (16H); /*R*/
25 1 DECLARE IOC1 BYTE AT (16H); /*W*/
26 1 DECLARE IOS2 BYTE AT (17H); /*R*/
27 1 DECLARE SP WORD AT (18H); /*R W*/
/*****************************************************/
28 1 DECLARE (DIRECT,P,Q,ORDER) BYTE FAST;
29 1 DECLARE T1OVER WORD;
30 1 DECLARE PWM_WIDTH WORD;
31 1 DECLARE DISP_SPD(4) BYTE;
32 1 DECLARE DISP_BUFF(4) BYTE;
33 1 DECLARE (START_SIGN,BID) BYTE;
34 1 DECLARE R0 BYTE;
35 1 DECLARE (DISP_STATUS,SPD_STEP,FAULT) BYTE;
36 1 DECLARE (II,KK) WORD;
37 1 DECLARE COMM_8279 BYTE AT(0DFFFH);
38 1 DECLARE DATA_8279 BYTE AT(0DE00H);
39 1 DECLARE (AIM_SPD,CONV_SPD,RUN_SPD) WORD ;
40 1 DECLARE (TM1,TM2) WORD FAST;
41 1 DECLARE (TURNON,TURNOFF) WORD FAST;
42 1 DECLARE (E0,E1,EC) INTEGER;
43 1 DECLARE T_SPAN DWORD FAST;
44 1 DECLARE INT13 WORD AT(203AH) DATA(.KEY_PROCESS);
45 1 DECLARE DEFAULT_SPD WORD DATA(400);
46 1 DECLARE DIGI_CODE(10) BYTE DATA(3FH,30H,5BH,79H,74H,6DH,6FH,38H,7FH,7DH);
PL/M-96 COMPILER MAIN 06/12/:5 17:37:49 PAGE 2
47 1 DECLARE FUZZY(225) BYTE DATA(0,0,0,1,1,2,3,3,4,5,5,6,7,7,7,
1,1,2,2,3,3,4,4,5,5,6,7,7,7,8,
2,2,3,3,3,4,4,5,5,6,6,7,7,7,8,
3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,
4,4,4,5,5,6,6,6,6,7,7,7,7,8,8,
4,5,5,6,6,6,6,6,7,7,7,7,7,8,8,
5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,
6,6,6,6,6,7,7,7,7,7,8,8,8,8,8,
6,6,6,7,7,7,7,7,8,8,8,8,8,9,9,
6,6,7,7,7,7,7,8,8,8,8,8,9,9,10,
6,6,7,7,7,7,8,8,8,8,9,9,10,10,10,
6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,
6,7,7,7,8,8,9,9,10,10,11,11,11,12,12,
6,7,7,7,8,9,9,10,10,11,11,12,12,13,13,
7,7,7,8,9,9,10,11,11,12,13,13,14,14,14);
/*显示程序*/
48 1 DISPLAY:PROCEDURE;
49 2 DECLARE I BYTE;
50 2 DO CASE DISP_STATUS;
51 3 DISP0:DO; /*速度显示*/
52 4 II=II+1;
53 4 IF II>500 THEN DO;
55 5 II=0;
56 5 CONV_SPD=RUN_SPD;
57 5 END;
58 4 CALL CONVERSION;
59 4 DO I=0 TO 3;
60 5 DISP_BUFF(I)=DISP_SPD(I);
61 5 END;
62 4 END;
63 3 DISP1:DO; /*一般故障显示*/
64 4 IF BITTST(.FAULT,1) THEN DISP_BUFF(0)=00H;
66 4 ELSE DISP_BUFF(0)=40H;
67 4 IF BITTST(.FAULT,2) THEN DISP_BUFF(1)=00H;
69 4 ELSE DISP_BUFF(1)=40H;
70 4 IF BITTST(.FAULT,3) THEN DISP_BUFF(2)=80H;
72 4 ELSE DISP_BUFF(2)=0c0H;
73 4 IF BITTST(.FAULT,4) THEN DISP_BUFF(3)=00H;
75 4 ELSE DISP_BUFF(3)=40H;
76 4 END;
77 3 DISP2:DO; /*电源故障显示*/
78 4 DO I=0 TO 2;
79 5 IF BITTST(.FAULT,0) THEN DISP_BUFF(I)=00H;
81 5 ELSE DISP_BUFF(I)=40H;
82 5 END;
83 4 DISP_BUFF(3)=0DEH;
84 4 END;
85 3 DISP3:DO;
86 4 CONV_SPD=PWM_WIDTH;
87 4 CALL CONVERSION;
88 4 DO I=0 TO 3;
89 5 DISP_BUFF(I)=DISP_SPD(I);
90 5 END;
91 4 END;
92 3 DISP4:DO;
93 4 CONV_SPD=UNSIGN(IABS(E1));
94 4 CALL CONVERSION;
PL/M-96 COMPILER MAIN 06/12/:5 17:37:49 PAGE 3
95 4 DO I=0 TO 3;
96 5 DISP_BUFF(I)=DISP_SPD(I);
97 5 END;
98 4 END;
99 3 DISP5:DO;
100 4 CONV_SPD=UNSIGN(IABS(EC));
101 4 CALL CONVERSION;
102 4 DO I=0 TO 3;
103 5 DISP_BUFF(I)=DISP_SPD(I);
104 5 END;
105 4 END;
106 3 DISP6:DO;
107 4 CONV_SPD=SPD_STEP;
108 4 CALL CONVERSION;
109 4 DO I=0 TO 3;
110 5 DISP_BUFF(I)=DISP_SPD(I);
111 5 END;
112 4 END;
113 3 DISP7:DO;
114 4 CONV_SPD=AIM_SPD;
115 4 CALL CONVERSION;
116 4 DO I=0 TO 3;
117 5 DISP_BUFF(I)=DISP_SPD(I);
118 5 END;
119 4 END;
120 3 END;
121 2 IF START_SIGN=1 THEN DISP_BUFF(0)=(DISP_BUFF(0) OR 80H);
123 2 IF DIRECT=1 THEN DISP_BUFF(1)=(DISP_BUFF(1) OR 80H);
125 2 IF FAULT<1FH THEN DISP_BUFF(3)=(DISP_BUFF(3) OR 80H);
127 2 CALL REFRESH;
128 2 END DISPLAY;
129 1 CONVERSION:PROCEDURE;
130 2 DECLARE K BYTE;
131 2 DECLARE NN BYTE;
132 2 DECLARE DIGI_N(4) BYTE;
133 2 DIGI_N(0)=CONV_SPD/1000;
134 2 DIGI_N(1)=(CONV_SPD MOD 1000)/100;
135 2 DIGI_N(2)=(CONV_SPD MOD 100)/10;
136 2 DIGI_N(3)=CONV_SPD MOD 10;
137 2 DO K=0 TO 3;
138 3 NN=DIGI_N(K);
139 3 DISP_SPD(K)=DIGI_CODE(NN);
140 3 END;
141 2 END CONVERSION;
142 1 REFRESH:PROCEDURE;
143 2 DECLARE J BYTE;
144 2 COMM_8279=90H;
145 2 DO J=0 TO 3;
146 3 DATA_8279=DISP_BUFF(J);
147 3 END;
148 2 END REFRESH;
149 1 EXTINT1:PROCEDURE INTERRUPT_CALLABLE ;
150 2 DISABLE;
151 2 DISP_STATUS=1;
PL/M-96 COMPILER MAIN 06/12/:5 17:37:49 PAGE 4
152 2 FAULT=IOPORT1;
153 2 IF BITTST(.FAULT,0) THEN DISP_STATUS=2;
155 2 CALL DISPLAY;
156 2 ENABLE;
157 2 END;
/*键盘处理程序*/
158 1 KEY_PROCESS:PROCEDURE INTERRUPT 7 ;
159 2 DECLARE KEY BYTE;
160 2 DISABLE;
161 2 COMM_8279=40H;
162 2 KEY=DATA_8279;
163 2 COMM_8279=0C2H;
164 2 IF KEY>7 THEN KEY=KEY-8;
166 2 ENABLE;
167 2 DO CASE KEY;
168 3 K0:DO; /*启动键*/
169 4 IF START_SIGN=0 THEN CALL START;
171 4 END;
172 3 K1:DO; /*反向键*/
173 4 IF (START_SIGN=0 AND RUN_SPD=0) THEN DO;
175 5 IF DIRECT=1 THEN DIRECT=0;
177 5 ELSE DIRECT=1;
178 5 END;
179 4 ELSE DO;
180 5 START_SIGN=0;
181 5 AIM_SPD=0;
182 5 BID=1;
183 5 CALL STOP;
184 5 END;
185 4 END;
186 3 K2:DO; /*显示切换键*/
187 4 DISP_STATUS=DISP_STATUS+1;
188 4 IF DISP_STATUS=8 THEN DISP_STATUS=0;
190 4 END;
191 3 K3:DO; /*加速键*/
192 4 DISP_STATUS=7;
193 4 IF AIM_SPD<2000 THEN AIM_SPD=AIM_SPD+SPD_STEP;
195 4 IF AIM_SPD>2000 THEN AIM_SPD=2000;
197 4 END;
198 3 K4:DO; /*减速键*/
199 4 DISP_STATUS=7;
200 4 IF AIM_SPD>50 THEN AIM_SPD=AIM_SPD-SPD_STEP;
202 4 IF AIM_SPD<50 THEN AIM_SPD=50;
204 4 END;
205 3 K5:DO; /*停止键*/
206 4 START_SIGN=0;
207 4 AIM_SPD=0;
208 4 CALL STOP;
209 4 END;
210 3 K6:DO; /*步距调节键*/
211 4 DISP_STATUS=6;
212 4 IF SPD_STEP=100 THEN SPD_STEP=10;
214 4 ELSE IF SPD_STEP=10 THEN SPD_STEP=1;
216 4 ELSE SPD_STEP=100;
217 4 END;
218 3 K7:DO; /*缺省速度键*/
PL/M-96 COMPILER MAIN 06/12/:5 17:37:49 PAGE 5
219 4 DISP_STATUS=7;
220 4 AIM_SPD=DEFAULT_SPD;
221 4 END;
222 3 END;
223 2 END KEY_PROCESS;
224 1 START:PROCEDURE;
225 2 DECLARE PORT BYTE;
226 2 DISABLE;
227 2 IOC2=80H;
228 2 PWM_WIDTH=2;
229 2 PORT=IOPORT1;
230 2 IF BITTST(.PORT,7) THEN P=1;
232 2 ELSE P=0;
233 2 IF BITTST(.PORT,5) THEN Q=1;
235 2 ELSE Q=0;
236 2 TM1=0;
237 2 T1OVER=0;
238 2 CALL PWMTIME;
239 2 START_SIGN=1;
240 2 IF DIRECT=1 THEN DO;
242 3 IF (P=1 AND Q=1) THEN DO;
244 4 HSO_COMMAND=26H;
245 4 HSO_TIME=TIMER1+02H;
246 4 R0=0;
247 4 R0=0;
248 4 HSO_COMMAND=07H;
249 4 HSO_TIME=TIMER1+02H;
250 4 R0=0;
251 4 R0=0;
252 4 END;
253 3 ELSE IF(P=1 AND Q=0) THEN DO;
255 4 HSO_COMMAND=23H;
256 4 HSO_TIME=TIMER1+02H;
257 4 R0=0;
258 4 R0=0;
259 4 HSO_COMMAND=20H;
260 4 HSO_TIME=TIMER1+02H;
261 4 R0=0;
262 4 R0=0;
263 4 HSO_COMMAND=01H;
264 4 HSO_TIME=TIMER1+02H;
265 4 R0=0;
266 4 R0=0;
267 4 HSO_COMMAND=02H;
268 4 HSO_TIME=TIMER1+02H;
269 4 R0=0;
270 4 R0=0;
271 4 END;
272 3 ELSE IF(P=0 AND Q=1) THEN DO;
274 4 HSO_COMMAND=21H;
275 4 HSO_TIME=TIMER1+02H;
276 4 R0=0;
277 4 R0=0;
278 4 HSO_COMMAND=22H;
PL/M-96 COMPILER MAIN 06/12/:5 17:37:49 PAGE 6
279 4 HSO_TIME=TIMER1+02H;
280 4 R0=0;
281 4 R0=0;
282 4 HSO_COMMAND=00H;
283 4 HSO_TIME=TIMER1+02H;
284 4 R0=0;
285 4 R0=0;
286 4 HSO_COMMAND=03H;
287 4 HSO_TIME=TIMER1+02H;
288 4 R0=0;
289 4 R0=0;
290 4 END;
291 3 ELSE DO;
292 4 HSO_COMMAND=27H;
293 4 HSO_TIME=TIMER1+02H;
294 4 R0=0;
295 4 R0=0;
296 4 HSO_COMMAND=06H;
297 4 HSO_TIME=TIMER1+02H;
298 4 R0=0;
299 4 R0=0;
300 4 END;
301 3 END;
302 2 ELSE DO; /*顺时针转*/
303 3 IF (P=0 AND Q=0) THEN DO;
305 4 HSO_COMMAND=26H;
306 4 HSO_TIME=TIMER1+02H;
307 4 R0=0;
308 4 R0=0;
309 4 HSO_COMMAND=07H;
310 4 HSO_TIME=TIMER1+02H;
311 4 R0=0;
312 4 R0=0;
313 4 END;
314 3 ELSE IF(P=1 AND Q=0) THEN DO;
316 4 HSO_COMMAND=21H;
317 4 HSO_TIME=TIMER1+02H;
318 4 R0=0;
319 4 R0=0;
320 4 HSO_COMMAND=22H;
321 4 HSO_TIME=TIMER1+02H;
322 4 R0=0;
323 4 R0=0;
324 4 HSO_COMMAND=00H;
325 4 HSO_TIME=TIMER1+02H;
326 4 R0=0;
327 4 R0=0;
328 4 HSO_COMMAND=03H;
329 4 HSO_TIME=TIMER1+02H;
330 4 R0=0;
331 4 R0=0;
332 4 END;
333 3 ELSE IF(P=0 AND Q=1) THEN DO;
335 4 HSO_COMMAND=20H;
336 4 HSO_TIME=TIMER1+02H;
PL/M-96 COMPILER MAIN 06/12/:5 17:37:49 PAGE 7
337 4 R0=0;
338 4 R0=0;
339 4 HSO_COMMAND=23H;
340 4 HSO_TIME=TIMER1+02H;
341 4 R0=0;
342 4 R0=0;
343 4 HSO_COMMAND=01H;
344 4 HSO_TIME=TIMER1+02H;
345 4 R0=0;
346 4 R0=0;
347 4 HSO_COMMAND=02H;
348 4 HSO_TIME=TIMER1+02H;
349 4 R0=0;
350 4 R0=0;
351 4 END;
352 3 ELSE DO;
353 4 HSO_COMMAND=27H;
354 4 HSO_TIME=TIMER1+02H;
355 4 R0=0;
356 4 R0=0;
357 4 HSO_COMMAND=06H;
358 4 HSO_TIME=TIMER1+02H;
359 4 R0=0;
360 4 R0=0;
361 4 END;
362 3 END;
363 2 ENABLE;
364 2 END START;
/*高速输入中断程序*/
365 1 HSI_INT:PROCEDURE INTERRUPT 2 ;
366 2 DECLARE STATUS BYTE;
367 2 DECLARE IOS BYTE;
368 2 DECLARE T1 BYTE;
369 2 declare (SUM,temp) word;
370 2 DISABLE;
371 2 IOS=IOS1;
372 2 IF BITTST(.IOS,7) THEN DO;
374 3 STATUS=HSI_STATUS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -