好長時間沒有來了,發個仿真計算器。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1111.png (42.51 KB, 下載次數: 53)
下載附件
2020-11-8 17:05 上傳
單片機源程序如下:
- #include "math.h" //c51庫函數
- #include "lcd.h"
- #include "zifu.h" //字符串
- #include "jianpan.h"
- void xianshixy_chuli(uchar i)//顯示處理
- {
- switch(i)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:y=i;x=0;break;//第1行 一行128列/8=8個8*16的字符
- case 16:
- case 17:
- case 18:
- case 19:
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- case 26:
- case 27:
- case 28:
- case 29:
- case 30:
- case 31:y=i-16;x=2;break;//第2行
- case 32:
- case 33:
- case 34:
- case 35:
- case 36:
- case 37:
- case 38:
- case 39:
- case 40:
- case 41:
- case 42:
- case 43:
- case 44:
- case 45:
- case 46:
- case 47: y=i-32;x=4;break;//第3行
-
- case 48:
- case 49:
- case 50:
- case 51:
- case 52:
- case 53:
- case 54:
- case 55:
- case 56:
- case 57:
- case 58:
- case 59:
- case 60:
- case 61:
- case 62:
- case 63:y=i-48;x=6;break;//第4行
- default: break;
- }
- xianshi_i++;//一屏最多顯示64個8*16的字符
- }
- void key_chuli()//鍵盤處理
- { static uchar key_i=0;
- static uchar xdata key_buf[64];
- static float data_buf[10];
-
- static uchar fuhao_i=0,dian_i=0;
-
- uchar i;
- ulong k;
- long int32_k;
- float dian_k;
-
- if(key!=0xff)
- {
- if(key!=15)//////*************
- {
- key_buf[key_i]=key;
- key_i++;
- }
- xianshixy_chuli(xianshi_i);
- switch(key)
- {
- case 0: LCD_bmp(x,y*8,2,8,dian);dian_bzw=1;break;//小數點//行 列 高度 寬度 :高是8的倍數
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9: LCD_bmp(x,y*8,2,8,data_tab[key]); //顯示鍵盤數字
-
- if(dian_bzw==0) data_buf[fuhao_i]=data_buf[fuhao_i]*10+key; //整數
-
- else //小數
- {
- dian_i++;
- dian_k=key;
-
- for(i=0;i<dian_i;i++)dian_k=dian_k/10;
-
- data_buf[fuhao_i]=data_buf[fuhao_i]+dian_k;
- }
- break;
- case 10:LCD_bmp(x,y*8,2,8,jia); //+
- ys_fuhao=key;
- fuhao_i++; // 當按下運算符時為下個被加數組做準備 data_buf[0]+data_buf[i];
- dian_bzw=0;
- dian_i=0;
- break;
- case 11:LCD_bmp(x,y*8,2,8,jian); //-
- ys_fuhao=key;
- fuhao_i++;
- dian_bzw=0;
- dian_i=0;
- break;
- case 12:LCD_bmp(x,y*8,2,8,cheng); //*
- ys_fuhao=key;
- fuhao_i++;
- dian_bzw=0;
- dian_i=0;
- break;
- case 13:LCD_bmp(x,y*8,2,8,chu); // /
- ys_fuhao=key;
- fuhao_i++;
- dian_bzw=0;
- dian_i=0;
- break;
- case 14:dian_bzw=0;
- dian_i=0;
- LCD_bmp(x,y*8,2,8,denghao); //=
-
-
- if(ys_fuhao==11)data_buf[0]=data_buf[0]-data_buf[1]; //兩數相 減
-
- if(ys_fuhao==10)data_buf[0]=data_buf[0]+data_buf[1]; //兩數相 加
-
- if(ys_fuhao==12)data_buf[0]=data_buf[0]*data_buf[1]; //兩數相 乘
-
- if(ys_fuhao==13)data_buf[0]=data_buf[0]/data_buf[1]; //兩數相 除
-
- int32_k=(long)data_buf[0];
- for(i=1;i<11;i++)
- {
- int32_k=int32_k/10;
- if(int32_k==0) break;
- }
- if(data_buf[0]<0)
- {
- xianshixy_chuli(xianshi_i);
- LED_xie_char2(x,y,jian); //結果是負數
- //k=~data_buf[0]+1;
- k=(ulong)fabs(data_buf[0]); //調用庫函數fabs
- }
- else
- k=(ulong)data_buf[0];
- switch(i)
- { double double_k;
- uchar j;
- case 10: i=k/1000000000;
- k=k%1000000000;
- xianshixy_chuli(xianshi_i);
- LED_xie_char2(x,y,data_tab[i]);
- case 9: i=k/100000000;
- k=k%100000000;
- xianshixy_chuli(xianshi_i);
- LED_xie_char2(x,y,data_tab[i]);
- case 8: i=k/10000000;
- k=k%10000000;
- xianshixy_chuli(xianshi_i);
- LED_xie_char2(x,y,data_tab[i]);
- case 7: i=k/1000000;
- k=k%1000000;
- xianshixy_chuli(xianshi_i);
- LED_xie_char2(x,y,data_tab[i]);
- case 6: i=k/100000;
- k=k%100000;
- xianshixy_chuli(xianshi_i);
- LED_xie_char2(x,y,data_tab[i]);
- case 5: i=k/10000;
- k=k%10000;
- xianshixy_chuli(xianshi_i);
- LED_xie_char2(x,y,data_tab[i]);
- case 4: i=k/1000;
- k=k%1000;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png (12.39 KB, 下載次數: 63)
下載附件
2020-11-9 03:18 上傳
所有資料51hei提供下載:
仿真計算器.rar
(74.41 KB, 下載次數: 59)
2020-11-8 17:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|