加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

基于51單片機(jī)的計算器設(shè)計(帶小數(shù)點(diǎn))

12/16 09:15
954
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

本設(shè)計是實(shí)現(xiàn)一個有加、減、乘、除、計算功能的多功能計算器。它的硬件主要由四部分組成,一個STC89C52單片機(jī)芯片,一塊LCD1602液晶顯示器,一個4*4的鍵盤。采用STC89C52單片機(jī)為主要控制電路,然后使用液晶顯示管顯示數(shù)據(jù),利用4*4矩陣鍵盤加上一些功能鍵完成電路的輸入操作部分。電路比較簡單,但是很實(shí)用方便。

要求:

1) 采用LCD1602液晶屏顯示

2) 4*4鍵盤來輸入數(shù)據(jù)。

3) 能夠進(jìn)行小數(shù)運(yùn)算。

4) 可以計算不超過13位數(shù)的加減乘除。

#include <stdlib.h>        //包含atof(),字符串->實(shí)數(shù)
#include <stdio.h>         //包含sprintf(),實(shí)數(shù)->字符串
#include <string.h>        //包含strcpy(),字符串復(fù)制
#include <math.h>		   //數(shù)學(xué)函數(shù)頭文件
#define uchar unsigned char
#define uint unsigned int
//sbit choose=P3^4;          //時鐘和計算器選擇鍵
/*************lcd****************/
sbit lcdrs=P2^7;           //LCD控制腳
sbit lcdrw=P2^6;
sbit lcden=P2^5;
bit idata form;            //lcd顯示方式切換
uchar idata state;         //lcd狀態(tài)字存儲
/************計算器*************/
//sbit reset=P3^0;           //計算器復(fù)位
//sbit back=P3^1;            //撤銷上次鍵入鍵
//sbit save=P3^2;            //存儲鍵,存儲有上次的結(jié)果和另外某次計算值
bit idata eqsign;          //按等號標(biāo)志
bit idata press;           //鍵按標(biāo)志
bit idata savesign;        //可存儲結(jié)果標(biāo)志
bit idata sc;			   //復(fù)用標(biāo)志
uchar idata process[30],proc; //記憶計算過程,以便錯誤恢復(fù)和撤銷輸入
uchar idata continu=0;        //連續(xù)計算運(yùn)算符號存儲
uchar idata pai[2][2];        //π 前有數(shù)據(jù)標(biāo)志
uchar idata ferror;        //計算檢錯標(biāo)志
uchar idata ywei;		   //屏幕移位
uchar idata count=0;       //輸入計數(shù)
uchar idata count_num=0;   //組號計數(shù)
uchar idata result[15];    //計算結(jié)果立存,save
//uchar idata saveresult[15];//存儲結(jié)果數(shù)組, sc+save
uchar idata jieguo[15];    //結(jié)果字符串
uchar idata bdate[2][14];  //待計算字符串二維組
uchar idata on_symbol;     //運(yùn)算符號
uchar idata fsym[2];       //函數(shù)前符號
uchar idata ssym[2];       //存儲組前符號
uchar idata bfun[2];       //計算值調(diào)用函數(shù)選擇
uchar idata futojiao[2];   //幅度 to 角度變換
double idata date[2];      //計算值雙精度變量組
double idata resultdate;   //雙精度結(jié)果值
/***************時鐘****************/
sbit stime=P3^3;           //時間設(shè)置鍵,同時用于計算器模式的復(fù)用鍵
uchar idata ms50=0;        //時間調(diào)節(jié)變量
uchar idata s=0;           //秒
uchar idata m=0;           //分
uchar idata h=0;           //小時

/******************函數(shù)聲明**********************/

/***************延時******************/
void delay(uchar z);	
/*************lcd寫命令***************/
void write_com(uchar com);
/*************lcd寫數(shù)據(jù)***************/
void write_date(uchar date);
/*************lcd讀狀態(tài)***************/
void read_date(void);
/*************lcd寫字符串*************/
void write_str(uchar *str);
/************液晶初始化***************/
void init(void );
/**************鍵盤掃描***************/
uchar keyscan(void);
/*************計算器復(fù)位**************/
void fuwei();          
/************error處理****************/
void callerror(void);
/***************撤銷鍵入**************/
void huifu(void);
/**********函數(shù)組前符號處理***********/
uchar funqian(void);
/************運(yùn)算符預(yù)處理*************/
void  cullars(uchar);
/***********輸出存儲數(shù)據(jù)預(yù)處理********/
char  memory(void);
/***********按鍵功能主處理************/
void process_date(uchar press_date);
/***********按鍵功能子處理************/
void calculator(uchar press_date);
/************************************************/
/*************LCD程序****************/
/**************延時******************/
void delay(uchar z)			   //0.2 ms
{
      uchar  x,y;
      for(x=z;x>0;x--)
      for(y=100;y>0;y--);
}

/**************寫命令*****************/
void write_com(uchar com)
{
      lcdrs=0;
      lcdrw=0;
      lcden=0;
      P0=com;
      delay(5);
      lcden=1;
      delay(5);
      lcden=0;
}
/*************寫數(shù)據(jù)******************/
void write_date(uchar date)
{
      lcdrs=1;
      lcdrw=0;
      lcden=0;
      P0=date;
      delay(5);
      lcden=1;
      delay(5);
      lcden=0;
}
/*************讀AC 地址*****************/
void read_date(void)
{
      lcdrs=0;
      lcdrw=1;
	  delay(5);
	  P0=0xff;
      lcden=1;
      delay(5);
      state=P0;
      delay(5);
      lcden=0;delay(5);
	  state=state&127;
}
/*************寫字符串******************/
void write_str(uchar *str)
{     
      uchar idata i;
      for(i=0;str[i]!='?';i++)
         write_date(str[i]);
}
/***********液晶初始化***************/
void init(void )
{
      write_com(0x38);       //模式:8位數(shù)據(jù),兩行,5*7字體
      write_com(0x0c);       //開顯示,無光標(biāo)
      write_com(0x06);       //向左增量移動
      write_com(0x01);       //清屏
}


/**************鍵盤掃描*************/
uchar keyscan(void)          //按行掃描,有鍵按下則返回鍵符號,否則返回null
{     uchar idata key0,key1,keyment=0;
      P1=0Xef;					   //行1
      key0=P1;
      key0=key0&0x0f;
      key1=key0;
      if(key0!=0x0f)
      {
           delay(5);               //鍵抖動處理
           P1=0Xef;
           key0=P1;
           key0=key0&0x0f;
           if(key0==key1)
           {
                switch(key0)
                {

資料借鑒于此紛傳

  • 有需要資料的可了解一下.docx

相關(guān)推薦

電子產(chǎn)業(yè)圖譜