基於51單片機12864簡易計算器

2021-01-08 電子產品世界
終於寫計算器了,其實計算器老早就寫好了的,只是那會一直在忙考試還有實驗室項目,所以沒能空出時間來寫博客。現在寒假在家,終於可以靜心的學點東西了。

下面就先寫點自己寫這個程序的過程。其實這是個單片機課的期末課題,但是沒有幾個能寫的好的。計算器其實要考慮周全也是很複雜的,。但我們只要求做簡易計算器,所以我的計算器只有整數加減乘除,帶負數功能。經過檢驗,實用性還是可以的。

這個程序的整體思路很簡單,主要是一些細節的處理。

思路是,先矩陣鍵盤掃描,監測運算符號按下,存儲兩個運算數,計算結果,整個過程的實時顯示。

先是矩陣鍵盤掃描,我以前一直用的郭天祥教的方法,這種方法很好理解,但是缺點是代碼太長了,於是我上網去找一種簡單的矩陣鍵盤掃描。(相比於埋頭苦想,有時候去網上找方法也是不錯的)

void keyscan()

{

uchar h,l;

if(keypress())

{

P3=0X0F;

_nop_();

h=P3;

h&=0X0F;//讀取按鍵所在『行』

P3=0XF0;

_nop_();

_nop_();

l=P3;

l&=0XF0;//讀取按鍵所在『列』

key=h+l;//最後相加作為SWITCH CASE的選擇

//這種掃描過程很清楚明了是吧

switch(key)

{

case 0xEE:key=1;Input[i]=1;break;// 1

case 0xDE:key=4;Input[i]=4;break;// 4

case 0xBE:key=7;Input[i]=7;break;// 7

case 0x7E:key=0;Input[i]=0;break; /// 0

case 0xED:key=2;Input[i]=2;break;// 2

case 0xDD:key=5;Input[i]=5;break;// 5

case 0xBD:key=8;Input[i]=8;break; // 8

case 0x7D:key=16;i--;break; // = 16

case 0xEB:key=3;Input[i]=3;break; // 3

case 0xDB:key=6;Input[i]=6;break; // 6

case 0xBB:key=9;Input[i]=9;break; // 9

case 0x7B: clear();break; // c 17

case 0xE7:key=18;Input[i]=+;n=i;break; // + 18

case 0xD7:key=19;Input[i]=-;n=i;break;// - 19

case 0xB7:key=20;Input[i]=*;n=i;break; // * 20

case 0x77:key=21;Input[i]=/;n=i;break; // / 21

default:key=22;

}

i++;

while(keypress());

}

}

我的keyscan()函數就出來了。。。

把每次按鍵的數存入數組,然後一直顯示數組成員就可以達到實時顯示輸入數字的效果了。

void jisuan(int n,int l,uchar yusuan)

{

int a=0,b=0,c=0,result;

uchar x;

for(x=0;x

{

a+=(Input[x]-0)*pow(10,n-x-1);

}

for(x=n+1;x

{

b+=(Input[x]-0)*pow(10,l-x-1);

}

// write_num(0,1,a);

// write_num(0,2,b);

switch(yusuan)

{

case +:result=a+b;write_num(0,1,result); break; // + 18

case -:result=a-b;write_num(0,1,result);break;// - 19

case *:result=a*b;write_num(0,1,result);break; // * 20

case /:result=a/b;write_num(0,1,result);break; // / 21

}

}

這個就是計算函數了,裡面的

a+=(Input[x]-0)*pow(10,n-x-1);

b+=(Input[x]-0)*pow(10,l-x-1);

這是用來計算輸入數值的,這個應該可以理解

最後是主函數:

void main()

{

Lcd_Init();

// write_string(0,3,"check ok");

while(1)

{

keyscan();

write_string(0,0,Input);

if(key==16)

{

l=i;

if(n>0&&n!=i-1)

{

switch(Input[n])

{

case +:jisuan(n,l,+); break; // + 18

case -:jisuan(n,l,-);break;// - 19

case *:jisuan(n,l,*);break; // * 20

case /:jisuan(n,l,/);break; // / 21

}

}

else

{

write_string(0,1,"ERROR");

}

}

delayms(1);

}

while(1);

}

簡易計算器的51程序就此結束了

相關焦點

  • 一款基於51單片機的簡易示波器設計
    > 隨著電子通信以及教學事業的發展,示波器的應用越來越廣泛,它在教學中所起到的作用越來越重要,示波器可以測量信號的幅度,頻率以及波形等等,但是高精度的示波器非常昂貴,對於非盈利事業的教學組織來說無疑不合適,所以提出了一種以單片機為控制核心的簡易示波器設計方案
  • 如何使用MSP430單片機實現簡易計算器的設計
    本文介紹了一種基於MSP430單片機的簡易電子計算器設計。基於MSP430單片機的簡易電子計算器設計具有體積小、便於攜帶、應用方便、組成元器件少、製造成本低等優點。MSP430單片機具有的超低功耗、硬體浮點數運算等功能使得簡易電子計算器設計簡單、計算能力強,有著廣闊的發展前景。
  • 基於AT89C51單片機的十進位計算器系統設計
    基於AT89C51單片機的十進位計算器系統設計
  • 基於51單片機運用LCD12864液晶顯示
    (void){delay_50ms(2);write_12864com(0x30);delay_50us(4);write_12864com(0x30);delay_50us(4);write_12864com(0x0f);delay_50us(4);write_12864com
  • 基於51單片機設計的簡易智慧機器人
    這種技術促使機器人技術也有了突飛猛進的發展,目前人們已經完全可以設計並製造出具有某些特殊功能的簡易智慧機器人。1 設計思想與總體方案1.1 簡易智慧機器人的設計思想本機器人能在任意區域內沿引導線行走,自動繞障,在有光源引導的條件下能沿光源行走。
  • 51單片機之4位數加法計算器的設計報告
    關鍵字:51單片機  4位數  加法計算器 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/ic482105.html
  • 基於STC89C52單片機的溫度檢測系統設計
    摘要:為了檢測現場溫度,並直觀反映其變化趨勢,設計了基於STC89C52單片機的溫度檢測系統。利用數字溫度傳感器DS18B20採集溫度信號,該信號送入STC89C52單片機處理,後由液晶顯示器LCD12864(ST7920)顯示溫度值,並繪製出溫度變化曲線。實測結果表明,系統可靠性、測試精度及溫度趨勢曲線繪製達到設計要求。
  • 51單片機之計時器與計數器
    例如:外接晶振為12MHz時,51單片機相關周期的具體值為:振蕩周期=1/12us;狀態周期=1/6us;機器周期=1us;指令周期=1~4us;初始化程序應完成如下工作:對TMOD賦值,以確定T0和T1的工作方式。
  • 51單片機+帶字庫液晶12864+DS1302數字時鐘C源程序
    本文引用地址:http://www.eepw.com.cn/article/201612/325258.htm適用於開發板:51單片機(AT89S52)+帶字庫液晶12864(ST7920)+DS1302(實時時鐘)實現功能:簡單,數字時鐘
  • 單片機的七個創意設計實例(從易到難),附電路圖、原始碼、演示視頻
    家庭供電中控系統全套資料(PCB源文件原理圖源文件程序原始碼設計製作詳細教程)現如今家居智能化越來越受全民的關注,理工科班出身的我,總感覺要研究一些東東順應一下潮流,這不家庭供電中控系統順潮而生,這個作品是即興之作,它基於51單片機,實現目標設備的智能電源控制功能,穩定安全高效,適合作為畢業設計素材的好資料,當然也可以作為電子愛好者參考的全套資料
  • 基於KEIL 51的單片機開發系統設計
    1.引言本文引用地址:http://www.eepw.com.cn/article/171806.htm近年來隨著KEIL 51不斷升級,高版本的KEIL 51編譯器,尤其是Keil μVision2(基於Windows的C51集成編譯環境)
  • 單片機的智能溫度預警系統教學案例
    隨著單片機技術的飛速發展,利用單片機設計溫控系統成為控制技術發展的需要。本文提出了一種基於單片機的溫度預警系統的設計方案,並採用PROTEUS進行了仿真。該系統不僅可以高精度的測量溫度,同時對溫度進行實時監控並做到超溫報警,有較高的實用價值。
  • 基於單片機控制的小型簡易程控交換系統
    基於以上原因,我們考慮將單片機知識與程控交換的基本原理相結合來設計簡易的交換系統。該系統採用單片機、網絡交換晶片和用戶接口電路晶片,以單片機為微控制器來實現通信系統的呼叫響應、處理、應答,話路接續,通話計時及復位拆線等基本功能。
  • 51單片機教程之基礎編(基於C語言)
    呵呵...目前這個世界上單片機無所不在,洗衣機,電視機,電冰箱等等...都有單片機的身影,單片機就是單片微型計算機的簡稱,最早由英特爾公司發明,沒錯!就是大名鼎鼎的英特爾!哎!又一中國人的遺憾!電子技術什麼東西才是我們中國的專利啊!說到計算機,咦?名字很熟悉?這個計算機可不是我們用的計算器啊,而是指電腦!什麼?你說單片機是一個電腦?對!沒錯,單片機就是一個微型電腦。
  • 基於51單片機定時器的電子時鐘設計方案
    今天我們將會為大家分享一種比較基礎的電子時鐘設計方案,該方案基於51單片機定時器進行設計,精度較高,時鐘鬧鐘調節簡單。本文引用地址:http://www.eepw.com.cn/article/201808/387025.htm在本方案中,我們所設計的這種電子時鐘主要由51單片機定時器、1602LCD液晶屏等構成。
  • 如何設計一個基於單片機的智能排插?
    如何設計一個基於單片機的智能排插?為此,本文設計研發了一款基於51 單片機控制的節能環保的智能排插,舊一代的家電通過使用這個排插可以蛻變為智能化家電,具備遙控、定時開關、無待機功耗等功能,節約了家電更新換代的成本。該排插現場運行效果良好,符合一般用戶需求,具有一定的推廣應用價值。
  • 基於51單片機的人體紅外模塊的自動門設計
    方案二:採用51系列單片機。系統的要求不高,程序的編寫也比較簡單,需要用到的I/O口的數量用該系列的單片機來操作完全能夠實現,無需再擴展,充分的利用了單片機資源。另外,經典的51系列單片機的處理速度也能夠滿足系統要求,性價比相對CPLD器件更高。綜合以上兩種方案,本系統選擇方案二,以AT89C51作為系統的微控制器。4.
  • 12864液晶深入學習筆記_2——基於msp430g2553
    液晶是有兩根線WREN串行控制的//*這裡是液晶的串行連接控制,可以大大節省單片機的IO口,但是數據處理起來要比並行連接的要慢,所以如果要求顯示內容數據較大,//*>2,用12864顯示圖片時,取模用的圖片像素大小不要超過128*64,如果超過會出現一些問題。
  • 基於51單片機的兩路溫度控制器的設計方案
    本方案設計的實現基於C51單片機的兩路溫度控制器,做到成本最低化,精確度高,兩路溫度的顯示和控制,能在溫度超出設定的最高溫度時啟動電風扇進行降溫,在溫度低於設定的最低溫度時啟動蜂鳴器報警,能夠用戶設定最高最低溫。  2.系統結構  溫度控制器系統包括以下幾個主要部分:溫度傳感器,報警電路,LED顯示電路,鍵盤控制,89C51控制部分。
  • 基於proteus的51單片機開發實例37-DAC0832
    基於proteus的51單片機開發實例37-DAC08321.1. 實驗目的之前我們學習了數模轉換晶片DAC0808,今天我們繼續學習另一種D/A轉換晶片DAC0832。設計思路圖1 DAC0832電路本例中使用51單片機控制D/A