基于51单片机的简单计算器

发布者:温馨小筑最新更新时间:2020-03-24 来源: eefocus关键字:51单片机  简单计算器  拨号器 手机看文章 扫描二维码
随时随地手机看文章

在上一篇中,我们已经说过了基于51单片机的简单拨号器,在下边,我们将写一个计算器程序,原理很简单,只需要在拨号器的基础上,算出拨号器所表示的数字,并进行计算即可。 

代码如下;


#include"reg51.h"

#include

typedef unsigned char u8;         //对数据类型进行声明定义

typedef unsigned int u16;


sbit LSA=P2^2;  //38译码器数码管位选

sbit LSB=P2^3;

sbit LSC=P2^4;


sbit k1=P3^1;     

sbit k2=P3^0;

sbit k3=P3^2;

sbit k4=P3^3;




#define GPIO_KEY P1

#define GPIO_DIG P0


u16 KeyValue;        //用来存放读取到的键值

u16 keyflag,i;       //用来回复是否有按键按下

u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

                   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //显示0~F的值


u16 wei[8]={0};    //用来存放每一位数码管数字的数组



/*******************************************************************************

* 函 数 名         : delay

* 函数功能         : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{  

     while(i--);

}





/*******************************************************************************

* 函 数 名       : display

* 函数功能       : 扫描显示数码管

* 输    入       : 无

* 输    出         : 无

*******************************************************************************/

void display()    

{    


     LSA=0; LSB=0; LSC=0; P0=smgduan[wei[0]];delay(50); P0=0x00; 

     LSA=1; LSB=0; LSC=0; P0=smgduan[wei[1]];delay(50); P0=0x00;

     LSA=0; LSB=1; LSC=0; P0=smgduan[wei[2]];delay(50); P0=0x00; 

     LSA=1; LSB=1; LSC=0; P0=smgduan[wei[3]];delay(50); P0=0x00; 

     LSA=0; LSB=0; LSC=1; P0=smgduan[wei[4]];delay(50); P0=0x00; 

     LSA=1; LSB=0; LSC=1; P0=smgduan[wei[5]];delay(50); P0=0x00; 

     LSA=0; LSB=1; LSC=1; P0=smgduan[wei[6]];delay(50); P0=0x00; 

     LSA=1; LSB=1; LSC=1; P0=smgduan[wei[7]];delay(50); P0=0x00; 


}







/*******************************************************************************

* 函 数 名         : KeyDown

* 函数功能         : 检测有按键按下并读取键值

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void KeyDown(void)

{

    char a=0;

    GPIO_KEY=0x0f;

    if(GPIO_KEY!=0x0f)//读取按键是否按下

    {

        keyflag=1;

        delay(1000);//延时10ms进行消抖

        if(GPIO_KEY!=0x0f)//再次检测键盘是否按下

        {   

            //测试列

            GPIO_KEY=0X0F;

            switch(GPIO_KEY)

            {

                case(0X07): KeyValue=0;break;

                case(0X0b): KeyValue=1;break;

                case(0X0d): KeyValue=2;break;

                case(0X0e): KeyValue=3;break;

            }

            //测试行

            GPIO_KEY=0XF0;

            switch(GPIO_KEY)

            {

                case(0X70): KeyValue=KeyValue;break;

                case(0Xb0): KeyValue=KeyValue+4;break;

                case(0Xd0): KeyValue=KeyValue+8;break;

                case(0Xe0): KeyValue=KeyValue+12;break;

            }

            while((a<50)&&(GPIO_KEY!=0xf0))  //检测按键松手检测

            {

                delay(1000);

                a++;

            }

        }

    }

}







/*******************************************************************************

* 函 数 名       : main

* 函数功能       : 主函数

* 输    入       : 无

* 输    出         : 无

*******************************************************************************/

void main()

{  

   u16 a=0,b=0,c=0;


   while(1)

   {    

            display();                     /* 第一个数字输入*/

            KeyDown();                     

         if(keyflag==1)                    

         {                                 


            for(i=7;i>0;i--)              //输入一位,数字向左移动一位 

            {wei[i]=wei[i-1];}             

            wei[0]=KeyValue;                            

            keyflag=0;                                  

         }




  /*************************加法运算****************************/

         if(k1==0)      

         {

             a=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;   //计算a的值     


             for(i=0;i<8;i++)

             wei[i]=0;              //对数码管清零


             while(1)                                //输入第二个数

             {

                     display();

                     KeyDown();

                     if(KeyValue==15) break;

                     if(keyflag==1)

                     {  


                        for(i=7;i>0;i--)

                        {wei[i]=wei[i-1];}

                        wei[0]=KeyValue;

                        keyflag=0;

                     }


             }

             b=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;   //计算b的值

             c=a+b;

             wei[0]=c%10;                    //计算C的各个位的数字

             wei[1]=c/10%10;

             wei[2]=c/100%10;

             wei[3]=c/1000%10;

             wei[4]=c/10000%10;

             wei[5]=c/100000%10;

             wei[6]=c/1000000%10;

             wei[7]=c/10000000%10;

             while(1)                                               

             {

               display();

             }



         }


 /*************************减法运算****************************/

         else    if(k2==0)      

         {

             a=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;   //计算a的值

             for(i=0;i<8;i++)

             wei[i]=0;              //对数码管清零


             while(1)

             {                                     //输入第二个数

                     display();

                     KeyDown();

                     if(KeyValue==15) break;       //当读到等于号,既,KeyValue=15时,停止输入

[1] [2]
关键字:51单片机  简单计算器  拨号器 引用地址:基于51单片机的简单计算器

上一篇:51单片机复习:8*8led点阵
下一篇:基于51单片机的贪吃蛇小程序(8*8LED点阵实现)

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved