发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
[创意DIY] 基于51系列单片机制作简易计算器
2019-12-2 17:28:13  349 51单片机
分享
基于51单片机的简易计算器。
电路图
file:///C:\Users\王康\AppData\Roaming\Tencent\Users\749019186\QQ\WinTemp\RichOle\CP]DHSSRI6BN$VC6`_4`ZIB.png
源程序
#include<reg52.h>//52单片机头文件
#include<math.h>//要用到数学计算公式,所以调用
#include <intrins.h>//移位
#define key P2    //定义矩阵键盘的I/O
#define GPIO_LCD P0//定义LCD1602  数据/命令的输入端
unsigned char number[20];//用来储存我们所按键按下去的字符和数字
unsigned char add=0;//是否按过+号
unsigned char subtract=0;//是否按过-号
unsigned char ride=0;//是否按过*号
unsigned char divide=0;//是否按过/号
unsigned char eliminate=0;//是否按过清除键
unsigned char minus=0;//是否计算的数据需要添加负号
unsigned char decimals=0;//是否计算的数据需要小数点
unsigned char equal=0;//是否按下等号键
sbit LCD_RS =P3^4;//定义LCD的模式选择,1为写数据,0为写命令
sbit LCD_RW =P3^5;//定义LCD功能  1是读,0是写
sbit LCD_E =P3^6;//定义LCD使能端
unsigned long a=0,b=0;//用于储存我们所要运算的数据
unsigned char i;//定义一个全局变量
unsigned char LCD_Wait(void)//判忙函数
{
        LCD_RS=0;
        LCD_RW=1;
        _nop_();
        LCD_E=1;
        _nop_();
       
        LCD_E=0;
        return         GPIO_LCD;               
}
void delay(void)   //延时函数
{
    unsigned char x,z;
    for(z=19;z>0;z--)
        for(x=130;x>0;x--);
}
void LCD_Write_Com(unsigned char com)//LCD1602写命令函数
{
LCD_RS =0;
LCD_RW =0;
GPIO_LCD=com;
delay() ;
LCD_E=1;
delay() ;
LCD_E=0;
delay() ;
}
void LCD_Write_Date( unsigned char input)//LCD1602写数据函数
{
        LCD_RS=1;
        LCD_RW=0;        ;
        LCD_E=0;
_nop_();
        GPIO_LCD =input;       
        _nop_();
        LCD_E=1;       
_nop_();
        LCD_E=0;                        
_nop_();
        LCD_Wait();
}
void LCD_Initial()//LCD1602初始化函数
{
delay();
LCD_Write_Com (0x38);
delay() ;         
LCD_Write_Com (0x38);
delay() ;  
LCD_Write_Com (0x08);
delay() ;  
LCD_Write_Com (0x0c);  
delay() ;   
LCD_Write_Com (0x06);  
delay() ;
LCD_Write_Com (0x01);
delay() ;
}
以上函数是LCD1602的模块化函数库,如果看不懂,需要先学习一下LCD1602.如果懒得学的话,可以直接用这个函数库,前提是上面定义的变量要整体一一对应,各个端口的引脚也要和你的实际端口一一对应
unsigned long calculate()//计算数据模块
{
   unsigned long value=0;
          
                 
                         IF(add)//如果我们按键按下了加号,那么在计算时进入这个加运算
                         {
                                 value=a+b;
                         }
                         if(subtract) //如果我们按键按下了减号,那么在计算时进入这个减运算
                         {
                              if(a>=b)
                                                        value=a-b;
                                                else
                                                {
                                                    value=b-a;
                                                        minus=1;//说明后面的数大于前面的额数,将其标志为一,在输出结果是,可以利用它判断是否输出负号
                                                }
                                        }
                         if(ride)//乘法运算
                         {
                         value=a*b;
                         }
                         if(divide)//除法运算
                         {
                         value=(unsigned long)(((float)a/b)*1000);//因为此计算器是,保留小数点后三位,所以,两数相除,1/2=0.5,那么通过这个,可以让其先等于200,方便我们后续的结果处理
                                 decimals=1;//标示结果已经<0,最后结果要出现小数点,
                         }
                       
                         return value;//返回计算的结果
                         }
                 



1
CP]DHSSRI6BN$VC6`_4`ZIB.png

计算器修改.rar

下载积分: 积分 -1 分

375.26 KB, 下载次数: 3, 下载积分: 积分 -1 分

2019-12-2 17:28:13   评论 分享淘帖
1 个讨论
收藏备用  感谢楼主分享
2019-12-2 21:19:09 评论

举报

高级模式
您需要登录后才可以回帖 登录 | 注册

发表新帖
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表