基于51单片机的计算器设计(带小数点)

本文介绍了如何设计一个具备加减乘除功能的计算器,使用STC89C52单片机作为控制器,配合LCD1602液晶显示屏和4*4矩阵键盘,支持小数运算和处理不超过13位的数值操作,提供实用的用户界面。
摘要由CSDN通过智能技术生成

本设计是实现一个有加、减、乘、除、计算功能的多功能计算器。它的硬件主要由四部分组成,一个STC89C52单片机芯片,一块LCD1602液晶显示器,一个4*4的键盘。采用STC89C52单片机为主要控制电路,然后使用液晶显示管显示数据,利用4*4矩阵键盘加上一些功能键完成电路的输入操作部分。电路比较简单,但是很实用方便。

要求:

1) 采用LCD1602液晶屏显示

2) 4*4键盘来输入数据。

3) 能够进行小数运算。

4) 可以计算不超过13位数的加减乘除。

 

 

 

 

#include <stdlib.h>        //包含atof(),字符串->实数
#include <stdio.h>         //包含sprintf(),实数->字符串
#include <string.h>        //包含strcpy(),字符串复制
#include <math.h>		   //数学函数头文件
#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状态字存储
/************计算器*************/
//sbit reset=P3^0;           //计算器复位
//sbit back=P3^1;            //撤销上次键入键
//sbit save=P3^2;            //存储键,存储有上次的结果和另外某次计算值
bit idata eqsign;          //按等号标志
bit idata press;           //键按标志
bit idata savesign;        //可存储结果标志
bit idata sc;			   //复用标志
uchar idata process[30],proc; //记忆计算过程,以便错误恢复和撤销输入
uchar idata continu=0;        //连续计算运算符号存储
uchar idata pai[2][2];        //π 前有数据标志
uchar idata ferror;        //计算检错标志
uchar idata ywei;		   //屏幕移位
uchar idata count=0;       //输入计数
uchar idata count_num=0;   //组号计数
uchar idata result[15];    //计算结果立存,save
//uchar idata saveresult[15];//存储结果数组, sc+save
uchar idata jieguo[15];    //结果字符串
uchar idata bdate[2][14];  //待计算字符串二维组
uchar idata on_symbol;     //运算符号
uchar idata fsym[2];       //函数前符号
uchar idata ssym[2];       //存储组前符号
uchar idata bfun[2];       //计算值调用函数选择
uchar idata futojiao[2];   //幅度 to 角度变换
double idata date[2];      //计算值双精度变量组
double idata resultdate;   //双精度结果值
/***************时钟****************/
sbit stime=P3^3;           //时间设置键,同时用于计算器模式的复用键
uchar idata ms50=0;        //时间调节变量
uchar idata s=0;           //秒
uchar idata m=0;           //分
uchar idata h=0;           //小时

/******************函数声明**********************/

/***************延时******************/
void delay(uchar z);	
/*************lcd写命令***************/
void write_com(uchar com);
/*************lcd写数据***************/
void write_date(uchar date);
/*************lcd读状态***************/
void read_date(void);
/*************lcd写字符串*************/
void write_str(uchar *str);
/************液晶初始化***************/
void init(void );
/**************键盘扫描***************/
uchar keyscan(void);
/*************计算器复位**************/
void fuwei();          
/************error处理****************/
void callerror(void);
/***************撤销键入**************/
void huifu(void);
/**********函数组前符号处理***********/
uchar funqian(void);
/************运算符预处理*************/
void  cullars(uchar);
/***********输出存储数据预处理********/
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;
}
/*************写数据******************/
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]!='\0';i++)
         write_date(str[i]);
}
/***********液晶初始化***************/
void init(void )
{
      write_com(0x38);       //模式:8位数据,两行,5*7字体
      write_com(0x0c);       //开显示,无光标
      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)
                {

资料借鉴于此纷传

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值