📄 calculator.lst
字号:
241 1 RW = 0;
C51 COMPILER V7.50 CALCULATOR 09/29/2007 20:36:00 PAGE 5
242 1 E = 0;
243 1 Read_Busy();
244 1 E = 1;
245 1 }
246
247 /******************************************************************************/
248 void Write_Data(unsigned char lcddata)//写数据函数
249 {
250 1 Lcd_Data = lcddata;
251 1 RS = 1;
252 1 RW = 0;
253 1 E = 0;
254 1 Read_Busy();
255 1 E = 1;
256 1 }
257
258 /******************************************************************************/
259 void Init_LCD_Cal(void)//初始化LCD
260 {
261 1 Delay_1ms(400); //稍微延时,等待LCM进入工作状态
262 1 Write_Comm(0x01);//清显示
263 1
264 1 Write_Comm(0x38); // 8位 2行.
265 1 Write_Comm(0x0c); //
266 1 Write_Comm(0x07); // 显示模式,从左至右增加
267 1 Write_Comm(0x80+0x10); // 定义首地址.
268 1 }
269
270 /******************************************************************************/
271 void Init_LCD_Logo(void)//初始化LCD
272 {
273 1 Delay_1ms(400); //稍微延时,等待LCM进入工作状态
274 1 Write_Comm(0x01);//清显示
275 1
276 1 Write_Comm(0x38);//8位2行5*8
277 1 Write_Comm(0x06);//文字不动,光标右移
278 1 Write_Comm(0x0c);//显示开/关,光标开闪烁开
279 1 }
280
281 /******************************************************************************/
282 void Init_Timer0(void)//定时器0初始化
283 {
284 1 TMOD=0x01;
285 1 TH0=TH0_TL0 / 256;
286 1 TL0=TH0_TL0 % 256;
287 1 TR0=1;
288 1 ET0=1;
289 1 EA=1;
290 1 }
291
292 /******************************************************************************/
293 void Display(char *buf)//显示函数
294 {
295 1 unsigned char i;
296 1
297 1 Write_Comm(0x01);//clearscreen,清屏命令
298 1 Write_Comm(0x80+0x10);
299 1
300 1 for (i=0 ; buf[i] != 0; i++)
301 1 Write_Data(buf[i]);
302 1 }
303
C51 COMPILER V7.50 CALCULATOR 09/29/2007 20:36:00 PAGE 6
304 /******************************************************************************/
305 void Display_Logo(unsigned char code *DData)//显示LOGO
306 {
307 1 unsigned char j;
308 1
309 1 for(j=0;j<16;j++)
310 1 {
311 2 Write_Data(DData[j]); //显示单个字符
312 2 Delay(30);
313 2 }
314 1 }
315
316 /*******************************************************************************/
317 void Digit_input_calcul(void)//字符输入
318 {
319 1 static unsigned char pos;
320 1 float tmp;
321 1
322 1 unsigned int last_op = 0;
323 1
324 1 Write_Data('0'); //上电显示" 0 "
325 1 pos = 0;//位置为0
326 1
327 1 while(1)
328 1 {
329 2 Key_value = Test_key();//判断是数字还是运算符号,具有等待功能
330 2
331 2 if((Key_value == '.') || ((Key_value >= '0') && (Key_value <= '9')))//如果是数字或小数点
332 2 {
333 3 if (pos != Max_disp_buff ) //最大计算位
334 3 {
335 4 number[pos++] = Key_value;
336 4 number[pos] = 0;
337 4 Display(number);
338 4 }
339 3 }
340 2 else //如果输入的是运算符号(+,-,*,/,=)
341 2 {
342 3
343 3 tmp = atof(number);//atof函数就是把字符转换成双精度的值
344 3
345 3 if((Key_value == '+') || (Key_value == '-') || (Key_value == '*') || (Key_value == '/'))
346 3 {
347 4 left_value = tmp;
348 4 last_op = Key_value;
349 4 }
350 3 else if (Key_value == '=')
351 3 {
352 4 right_value = tmp;
353 4
354 4 Fun_calculator(last_op);//计算
355 4 }
356 3
357 3 pos = 0;//从新归位,输入右值
358 3 }//else
359 2 }//for
360 1 }
361
362 /**********************************************************************************/
363 void Fun_calculator(unsigned int fuhao)//运算函数
364 {
365 1 bit result = 1;
C51 COMPILER V7.50 CALCULATOR 09/29/2007 20:36:00 PAGE 7
366 1
367 1 switch(fuhao)
368 1 {
369 2 case '+': left_value += right_value;result = 1;break;
370 2 case '-': left_value -= right_value;result = 1;break;
371 2 case '*': left_value *= right_value;result = 1;break;
372 2 case '/':
373 2 if(right_value != 0)
374 2 {
375 3 left_value /= right_value;
376 3 result = 1;
377 3 }
378 2 else
379 2 result = 0;//出错
380 2 break;
381 2 default : break;
382 2 }
383 1
384 1 if(result == 1)
385 1 Calculator_output(left_value);
386 1 else
387 1 Display("*ERROR*");
388 1 }
389
390 /******************************************************************************/
391 void Calculator_output(float value)//输出计算结果函数
392 {
393 1 unsigned char buff[Max_disp_buff + 1];//定义显示缓冲
394 1 unsigned char p1=0, p=0;
395 1 float divisor = 100000000;//除数
396 1 float digit = 0;
397 1
398 1 if(value >= 0)
399 1 buff[p++] = ' ';
400 1 else
401 1 {
402 2 buff[p++] = '-';
403 2 value = -value;
404 2 }
405 1
406 1 if(value >= divisor )
407 1 buff[p++]='E';
408 1 else
409 1 while((p < Max_disp_buff ) && (divisor > 1 || value >= 0.00000001))
410 1 {
411 2 divisor /= 10;
412 2 digit = floor(value/divisor);//小于指定数的最小整数
413 2 if (divisor < 1 && divisor > 0.01)
414 2 buff[p++] = '.';
415 2 if (digit != 0 || divisor < 10)
416 2 {
417 3 buff[p++] = digit + '0';
418 3 p1 = 1;
419 3 }
420 2 else if (p1)
421 2 buff[p++] = '0';
422 2 value -= digit*divisor;
423 2 }
424 1 buff[p] = 0;
425 1 Display(buff);
426 1 }
427
C51 COMPILER V7.50 CALCULATOR 09/29/2007 20:36:00 PAGE 8
428 /******************************************************************************/
429 void Show_logo(void)//显示开机画面
430 {
431 1 Write_Comm(0x80);//写入"welcome to"首地址(第一行)
432 1 Display_Logo(welcome);
433 1
434 1 Write_Comm(0xc0);//写入"website"首地址(第2行)
435 1 Display_Logo(website);
436 1 Delay(200);
437 1
438 1 Write_Comm(0x01);//清屏
439 1
440 1 Write_Comm(0x80);//写入"designed "首地址(第一行)
441 1 Display_Logo(designed);
442 1
443 1
444 1 Write_Comm(0xc0);//写入"whoami"首地址(第2行)
445 1 Display_Logo(whoami);
446 1 Delay(200);
447 1
448 1 Write_Data(0x01);//清屏
449 1 }
450
451 /******************************************************************************/
452 void main(void)//主函数
453 {
454 1 Init_Timer0();//初始化T0
455 1 Init_LCD_Logo(); //初始化 Logo
456 1
457 1 Show_logo();//开机画面显示
458 1
459 1 Init_LCD_Cal(); //初始化 LCM
460 1 Digit_input_calcul();//计算值输入函数
461 1 }
462
463
464
465
466
467
468
469
470
471
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1380 ----
CONSTANT SIZE = 96 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 38
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 + -