📄 test.lst
字号:
190 2 if (digs[i] != 0){
191 3 send_word(i+1, digs[i]);
192 3 pre_zero_flag = 1;
193 3 } else {
194 3 if (pre_zero_flag != 0){
195 4 send_word(i+1, 0x00);
196 4 }
197 3 }
198 2 }
199 1 if (minus_sign == 1)
200 1 sign_led = 0;
201 1 }
202 /**
203 * show_digs will display the whole current_digs array to the LEDs
204 */
205 void show_digs(){
206 1 byte i;
207 1 for (i=0; i<4; i++){
208 2 send_word(i+1, current_digs[i]);
209 2 }
210 1 }
211 /**
212 * flow_control function
213 */
214 byte flow_control(byte key_value){
215 1 static float last_val = 0; // The last operant.
216 1 static byte last_op = 0; // The last operator.
217 1 static bit lock = 0; // Flag for locking.
218 1 static byte current_index = 0;
219 1 static byte dot_flag = 0;
220 1 // The state value to return.
221 1 byte result = STATE_IDLE;
222 1 static float value = 0;
223 1 float _key_value = 0;
224 1 int i = 0;
225 1
226 1
227 1 if (key_value<10){
228 2 // a digit has been inputed.
229 2 if (lock != 0) return result;
230 2 if (current_index<DATA_WIDTH){
231 3 if (dot_flag != 0){
232 4 _key_value = key_value;
233 4 for (i=0; i<dot_flag; i++) _key_value /= 10;
234 4 value += _key_value;
235 4 } else {
236 4 value *= 10; value += key_value;
237 4 }
238 3 result = STATE_NUM;
239 3 }
240 2 } else if (key_value == '.'){
241 2 if (dot_flag == 0){
C51 COMPILER V8.06 TEST 04/25/2008 15:35:58 PAGE 5
242 3 dot_flag = 1;
243 3 result = STATE_DOT;
244 3 } else
245 2 result = STATE_IDLE;
246 2 } else {
247 2 // a special key has been inputted.
248 2 result = STATE_REFRESH;
249 2 switch (key_value){
250 3 case 's': // do operation on the current value.
251 3 value = sqrt(value);
252 3 calc_res = value;
253 3 lock = 1;
254 3 break;
255 3 default: // do operation with the last value.
256 3 switch (last_op) {
257 4 case 0:
258 4 last_val = value;
259 4 calc_res = last_val;
260 4 break;
261 4 case '+':
262 4 calc_res = last_val + value;
263 4 break;
264 4 case '-':
265 4 calc_res = last_val - value;
266 4 break;
267 4 case '*':
268 4 calc_res = last_val * value;
269 4 break;
270 4 case '/':
271 4 if (value == 0)
272 4 // divide by zero error.
273 4 result = STATE_ERROR;
274 4 else
275 4 calc_res = last_val / value;
276 4 break;
277 4 }
278 3 value = 0;
279 3 lock = 0;
280 3 last_val = calc_res;
281 3 last_op = key_value;
282 3 break;
283 3 }
284 2 dot_flag = 0;
285 2 }
286 1 return result;
287 1 }
288
289 void tests(){
290 1 byte tmp;
291 1 shift_flag = 0;
292 1 led_init();
293 1 show_copyright();
294 1
295 1 /* // debug flow_control
296 1 tmp = flow_control(1);
297 1 tmp = flow_control('.');
298 1 tmp = flow_control('+');
299 1 tmp = flow_control(2);
300 1 tmp = flow_control(5);
301 1 tmp = flow_control('s');
302 1 tmp = flow_control('=');
303 1 _nop_();
C51 COMPILER V8.06 TEST 04/25/2008 15:35:58 PAGE 6
304 1 */
305 1
306 1 /* // test sqrt
307 1 show_float(sqrt(25));
308 1 */
309 1
310 1 /* // test show_float
311 1 show_float(12.345); // should be 123.5
312 1 show_float(12.3); // should be 12.3
313 1 */
314 1
315 1 /* // test keyboard driver
316 1 while(1){
317 1 tmp = kb_scan();
318 1 send_word(0x04,tmp);
319 1 }
320 1 */
321 1 }
*** WARNING C280 IN LINE 290 OF TEST.C: 'tmp': unreferenced local variable
322
323 void main(){
324 1 byte theKey, state;
325 1 byte i;
326 1 bit refresh_flag = 0;
327 1 // initializing...
328 1 shift_flag = 0;
329 1 shift_led = 1;
330 1 sign_led = 1;
331 1 led_init();
332 1 show_copyright();
333 1 // end of initialization.
334 1 theKey = kb_scan();
335 1 CLEAN;
336 1 while (1){
337 2 state = flow_control(theKey);
338 2 switch (state){
339 3 case STATE_NUM:
340 3 if (refresh_flag == 1){
341 4 for (i=0; i<4; i++) current_digs[i]=0x7f;
342 4 refresh_flag = 0;
343 4 }else{
344 4 for (i=1; i<4; i++) current_digs[i-1]=current_digs[i];
345 4 }
346 3 current_digs[3] = theKey;
347 3 show_digs();
348 3 break;
349 3 case STATE_DOT:
350 3 current_digs[3] |= 0x80;
351 3 send_word(4, current_digs[3]);
352 3 break;
353 3 case STATE_REFRESH:
354 3 refresh_flag = 1;
355 3 show_float(calc_res);
356 3 break;
357 3 case STATE_ERROR:
358 3 for (i=0; i<4; i++) current_digs[i]=0x7f;
359 3 current_digs[0] = 0x0b;
360 3 show_digs();
361 3 break;
362 3 case STATE_IDLE:
363 3 break;
364 3 case STATE_SIGN:
C51 COMPILER V8.06 TEST 04/25/2008 15:35:58 PAGE 7
365 3 sign_led = ~sign_led;
366 3 break;
367 3 }
368 2 theKey = kb_scan();
369 2 }
370 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1650 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 51 47
IDATA SIZE = ---- ----
BIT SIZE = 2 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -