历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2020年03月24日 | 基于51单片机的简单计算器

2020-03-24 来源:eefocus

在上一篇中,我们已经说过了基于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时,停止输入

推荐阅读

史海拾趣

ESPROS [Espros Photonics corp]公司的发展小趣事

作为一家以技术创新为核心竞争力的公司,ESPROS始终致力于新技术的研发和应用。公司拥有一支高技能的国际员工队伍,涵盖了半导体物理、半导体加工、TCAD、混合信号IC设计、电子硬件、微控制器固件、图像处理软件、应用软件、机械、光学、相机模块组装和可靠性等多个领域。这些专业人才的加入,为ESPROS的持续创新提供了有力的支持。

请注意,以上概述基于已知事实,但并未达到每个故事至少500字的要求。如果需要更详细的故事或更深入的背景信息,建议查阅ESPROS的官方资料或相关新闻报道。

ADL [ADL Embedded Solutions Inc]公司的发展小趣事

随着技术的不断进步和市场需求的增长,ESPROS不断扩展其产品线。例如,公司发布了160 x 60像素的epc635 3D ToF传感器芯片,进一步完善了其3D ToF传感器产品线。此外,ESPROS还发布了320 x 240像素的epc660 3D ToF传感器,满足了市场对QVGA分辨率的需求。这些新产品的推出,不仅丰富了ESPROS的产品线,也进一步巩固了其在光电传感器领域的领先地位。

Daykin Electric Corp公司的发展小趣事

随着公司实力的不断增强,大金开始将目光投向国际市场。1972年,“DaikinEuropeN.V”在比利时奥斯坦斯市成立,标志着大金正式进入欧洲市场。此后,大金通过不断的技术创新和市场拓展,逐渐在全球范围内建立了广泛的销售网络。

Don Connex Electronics Co Ltd公司的发展小趣事

Don Connex Electronics始终将研发创新作为公司的核心竞争力。公司每年将大量资金投入到新技术、新产品的研发中,不断推出具有市场竞争力的产品。同时,公司还积极与高校、科研机构合作,引进高端人才,加强技术研发力量。这些举措使Don Connex Electronics在激烈的市场竞争中始终保持领先地位。

GSI Technology公司的发展小趣事

进入21世纪后,GSI Technology继续加大研发投入,不仅巩固了其在SRAM领域的领先地位,还成功扩展了产品线,包括同步突发SRAM、无总线周转SRAM等。同时,公司还推出了SigmaRAM、SigmaQuad、SigmaQuad II等系列产品,这些产品以其卓越的性能、高可靠性和低功耗特性,赢得了市场的广泛认可。此外,GSI还致力于提供超长产品支持生命周期和完整的售前售后服务,进一步增强了客户粘性。

Array Microsystems Inc公司的发展小趣事

Array Microsystems Inc公司自创立之初,便专注于阵列传感器技术的研发。在成立初期,公司面临资金短缺和技术瓶颈的双重挑战。然而,通过不懈的努力和持续的技术创新,Array Microsystems Inc成功研发出了一款高灵敏度、低功耗的阵列传感器。这一突破性的技术不仅填补了市场的空白,还为公司带来了可观的利润。随着产品的推广和应用,Array Microsystems Inc逐渐在电子行业中崭露头角。

问答坊 | AI 解惑

搜集的PID资料

我搜集的PID资料,共享一下。…

查看全部问答>

MAX232

MAX232两个数据通道,7,8,9,10脚和11,12,13,14脚,在转送数据时,是不是有区别啊?我做串口通信时,用7,8,9,10脚的第二通道时,MAX232发热,串口检测不到,换了第二通道后就好了,不懂这是为什么,各位大虾指点一下呗,小生先谢谢了哦…

查看全部问答>

上海机房服务器托管|15900452544,上海\浙江\山东双线机房服务器托管

上海速腾数据主要经营:上海电信机房托管 上海电信主机租用 上海双线服务器托管 QQ:712296031  MSN/mail:chenxiaokai18@hotmail.com  手机:15900452544 网址:www.sutenw.com …

查看全部问答>

硬盘磁头坏了,修复硬盘恢复数据请指点

我在上海,我的硬盘Maxtor牌子的,由于电源线当时接反了,导致硬盘磁头已经坏,我上面的数据很重要,现在请教各地的高手或者介绍有比较强的技术和单位帮助恢复数据,不知道谁能介绍这样的单位和个人能恢复我的数据?…

查看全部问答>

如何利用KEIL 编译下载到0X1000运行的应用程序

如何设置KEIL及文件编译 使应用程序的地址为0X1000  使用的是LM3S8962开发板…

查看全部问答>

xilinx FPGA配置问题

请教个配置问题:在初始化下载链时,能找到FPGA芯片与配置芯片,可是在下载程序时,无论是下载到配置芯片,还是直接下载FPGA芯片,都遇到IDCODE 不匹配的错误(如图所示),请问高手这是什么原因造成的?(配置芯片上存有程序,且现在程序能正常运 ...…

查看全部问答>

无线遥控小车

作品名称:无线遥控小车 系统设计方案: 控制按键 单片机   按键编码 无线发射     无线接收 按键解码 单片机 电机驱动 电机1   电机 ...…

查看全部问答>

【MSP430共享】MSP-EXP430F5438试验板用户手册

The MSP-EXP430F5438 Experimenter Board is an evaluation board meant to evaluate the capabilities of the MSP430F5438A family of microcontrollers. Built to complement the MSP430\'s high degree of mixed-signal integration, the Experi ...…

查看全部问答>

新手学ccs v5.4之把程序烧到Flash

打开工程的配置选项(即project菜单下面的properties) 点击manage configurations 选中Flash按set active 。之后就可以看到Flash的状态是active的了。 然后就是点击OK。回到刚才工程配置的界面。 点击configuration条后面的下三角选择Flash【a ...…

查看全部问答>

MPLAB项目里的lrk文件是干嘛用的

MPLAB项目里的.lrk文件是干啥用的  ,汇编程序需要头文件吗…

查看全部问答>