历史上的今天
返回首页

历史上的今天

今天是:2024年10月16日(星期三)

正在发生

2019年10月16日 | 基于单片机的简易计算器proteus仿真和源代码

2019-10-16 来源:eefocus

51单片机的计算器仿真设计原理图如下(proteus仿真工程文件可到本帖附件中下载)

单片机源程序如下:

#include   //头文件

#define uint unsigned int 

#define uchar unsigned char


sbit lcden=P2^2; //LCD1602控制引脚

sbit rs=P2^0;

sbit rw=P2^1;

sbit busy=P0^7;//LCD忙


char i,j,temp,num,num_1;

long a,b,c;     //a,第一个数 b,第二个数 c,得数

float a_c,b_c;

uchar flag,fuhao;//flag表示是否有运算符键按下,fuhao表征按下的是哪个运算符

//flag=1表示运算符键按下,flag=0表示运算符键没有按下;

//fuhao=1为加法,fuhao=2为减法,fuhao=3为乘法,fuhao=4为除法。


uchar code table[]={//运算数字输入数组

7,8,9,0,

4,5,6,0,

1,2,3,0,

0,0,0,0};

uchar code table1[]={        //经处理后进行键输入显示准备的数组

7,8,9,0x2f-0x30,        //7,8,9,÷

4,5,6,0x2a-0x30,        //4, 5, 6,×

1,2,3,0x2d-0x30,        //1, 2, 3,-

0x01-0x30,0,0x3d-0x30,0x2b-0x30//C,0,=,+

};

void delay(uchar z) // 延迟函数

{

uchar y;

for(z;z>0;z--)

   for(y=0;y<110;y++);

}

void write_com(uchar com) // 写指令函数

{

        rs=0;

        P0=com;    //com指令付给P0口

        delay(5);lcden=1;delay(5); lcden=0;

}


void write_date(uchar date) // 写数据函数

{

        rs=1; P0=date; delay(5);

        lcden=1; delay(5); lcden=0;

}


void init() //初始化

{

    num=-1;

lcden=1; //使能信号为高电平

rw=0;

write_com(0x38); //8位,2行

delay(5); write_com(0x38); //8位,2行

delay(5); write_com(0x0c); //显示开,光标关,不闪烁*/

delay(1); write_com(0x06); //增量方式不移位 显竟獗暌贫 柚?

delay(1); write_com(0x80); //检测忙信号

delay(1); write_com(0x01); //显示开,光标关,不闪烁

num_1=0;

i=0; j=0;

a=0;     //第一个参与运算的数

b=0;     //第二个参与运算的数

c=0;

flag=0; //flag表示是否有符号键按下, 

fuhao=0; // fuhao表征按下的是哪个符号

}

void keyscan() // 键盘扫描程序

{

        P3=0xfe; 

        if(P3!=0xfe)

        {

           delay(20);// 延迟20ms

           if(P3!=0xfe) {  temp=P3&0xf0;

            switch(temp)

            {

             case 0xe0:num=0;   break;        //7

             case 0xd0:num=1;   break;         //8

             case 0xb0:num=2;   break;        //9

             case 0x70:num=3;   break;        //÷

            }

           }   while(P3!=0xfe);

           if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

           { 

               if(j!=0){write_com(0x01); j=0;  }

               if(flag==0)//没有按过运算符键

                    { a=a*10+table[num];    } //按下数字存储到a

                    else//如果按过运算符键

                    {    b=b*10+table[num];   }//按下数字存储到b

           }

           else//如果按下的是'/'            除法

           {

            flag=1;         //按下运算符

            fuhao=4;//4表示除号已按

           }

           i=table1[num];     //数据显示做准备

           write_date(0x30+i);//显示数据或操作符号

        }


        P3=0xfd;

        if(P3!=0xfd)

        {

           delay(20);

           if(P3!=0xfd){  temp=P3&0xf0;

            switch(temp)

            {

             case 0xe0:num=4; break; //4

             case 0xd0:num=5; break; //5

             case 0xb0:num=6; break; //6

             case 0x70:num=7; break; //×

            }

           }   while(P3!=0xfd);//等待按键释放

           if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'

           { 

            if(j!=0){ write_com(0x01);  j=0;   }

               if(flag==0)//没有按过运算符键

            { a=a*10+table[num];     }

            else//如果按过运算符键

            { b=b*10+table[num];   }

           }

           else//如果按下的是'×'

           {  flag=1;

              fuhao=3;//3表示乘号已按

           }

           i=table1[num];      //数据显示做准备

           write_date(0x30+i);//显示数据或操作符号

        }


        P3=0xfb;

        if(P3!=0xfb){  delay(20);

           if(P3!=0xfb) { temp=P3&0xf0;

            switch(temp)

            {

             case 0xe0:num=8;    break;         //1

             case 0xd0:num=9;    break;         //2

             case 0xb0:num=10;   break;         //3

             case 0x70:num=11;   break;         //-

            }

           }   while(P3!=0xfb);

           if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

           { 

            if(j!=0){ write_com(0x01);  j=0;  }

              if(flag==0)//没有按过运算符键

            { a=a*10+table[num];   }

            else//如果按过运算符键

            { b=b*10+table[num]; }

           }

           else if(num==11)//如果按下的是'-'

           {

            flag=1;

            fuhao=2;//2表示减号已按

           }

           i=table1[num];  //数据显示做准备

           write_date(0x30+i);//显示数据或操作符号

        }


        P3=0xf7;

        if(P3!=0xf7){   delay(20);

           if(P3!=0xf7){ temp=P3&0xf0;

            switch(temp)

            {

             case 0xe0:num=12; break;  //清0键    

             case 0xd0:num=13; break;  //数字0    

             case 0xb0:num=14; break;  //等于键    

             case 0x70:num=15; break;  //加

            }                                                                   

                } while(P3!=0xf7);


           switch(num)

           {

            case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"

                            break;

            case 13:{                //按下的是"0"

               if(flag==0)//没有按过运算符键

               { a=a*10;  write_date(0x30);     P3=0;       }

               else if(flag>=1)//如果按过运算符键

               {  b=b*10;   write_date(0x30);       }

              }     break;

            case 14:{j=1; //按下等于键,根据运算符号进行不同的算术处理

                   if(fuhao==1)           //加法运算

                           {

                                           write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处 

                                   write_com(0x04);     //设置从后住前写数据,每写完一个数据,光标后退一格        

推荐阅读

史海拾趣

台湾诚阳(BC)公司的发展小趣事

台湾诚阳(BC)公司始终坚守品质至上的原则。从原材料的采购到生产过程的每一个环节,公司都严格把控,确保产品的品质达到最高标准。同时,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和服务。这种对品质的执着追求,使得台湾诚阳在客户中赢得了良好的口碑,品牌影响力逐渐扩大。

Arco Electronics公司的发展小趣事

随着全球对环境保护的日益重视,Arco Electronics公司也开始关注可持续发展和社会责任。公司积极采用环保材料和生产工艺,减少生产过程中的环境污染;同时,公司还设立了公益基金,支持教育事业和社会福利事业。这些举措不仅提升了公司的社会形象,还为公司赢得了更多消费者的支持和信任。

以上就是我为您虚构的关于Arco Electronics公司的5个发展故事。这些故事基于电子行业的常见趋势和挑战进行构建,旨在展示一个公司在行业中逐步发展和壮大的过程。请注意,这些故事都是虚构的,并不代表任何真实公司的实际发展情况。

福斯特(FIRST)公司的发展小趣事
可能使用陀螺仪或加速度计等原理。
Garmin_Canada_Inc.公司的发展小趣事
选用高质量的DTMF信号发生器芯片,如MT8888等,这些芯片具有稳定的性能和较高的精度。
昆泰(CHRONTEL)公司的发展小趣事

进入21世纪后,昆泰的创始人Dr. Gillings不满足于CRO企业的平稳收益和稳定现金流,他开始寻求与药企建立更加紧密的战略合作伙伴关系。为此,昆泰在2000年成立了PharmaBio部门,通过资金、技术和销售团队为客户提供全方位的支持。这一战略转型不仅使昆泰与药企建立了深厚的合作关系,还为其带来了丰厚的回报。

集创北方(CHIPONE)公司的发展小趣事

近年来,集创北方在电子行业的地位日益稳固。从2019年到2021年,公司的营收实现了飞跃式增长,从14.47亿元增长至56.74亿元,复合增长率高达98%。这一成绩的背后,是公司不断创新、积极应对市场变化的结果。

问答坊 | AI 解惑

【2009年电子设计大赛题目分析三】——多图

电子竞赛中的30m的频率通讯电路图出来了 https://bbs.eeworld.com.cn/thread-85045-1-1.html 电子大赛之最大功率跟踪 https://bbs.eeworld.com.cn/thread-85046-1-1.html 大赛B题 自制声源 https://bbs.eeworld.com.cn/viewthread.php?tid=85080 ...…

查看全部问答>

教你如何学习嵌入式系统(基于ARM平台)(转)

一、嵌入式系统的概念          着重理解“嵌入”的概念    主要从三个方面上来理解。      1、从硬件上,将基于CPU的处围器件,整合到CPU芯片内部,比如早期基于X86体系结构 ...…

查看全部问答>

WIFI安全性问题

wifi在连接路由器时,wifi会搜索出周围存在无线路由器,对于其中一台无线路由器,如果我们不输入密码,能不能连上。我在做wifi测试的时候,只指定用户名,而没有输入密码或者输入错误的密码能连接上了无线路由器,请问产生这个现象的原因是不是wifi ...…

查看全部问答>

中*美*爱*梯*科*技, 9月10日新班开课, 免费试听!

中*美*爱*梯*科*技, .NET外企软件工程师班将于2007年9月10日开课, 开课第一周免费试听, 欢迎大家踊跃报名参加!   中*美*爱*梯*科*技向学员郑重承诺: 百分之百保证就业, 月薪3000——8000, 就不了业者退还全部学费!    ...…

查看全部问答>

Code Composer Studio v4.2 for MSP430(tm) User’s Guide

[ 本帖最后由 wstt 于 2011-9-14 13:34 编辑 ]…

查看全部问答>

单片机通电之后继电器就一直响。

在淘宝上买的铁牛单片机,本来之前用还好好的,后来不知道烧了一个什么程序,导致每次通电之后继电器都会响一声,同时继电器下面那个绿灯也闪了一下,就一下。。。。烧录程序过程中,继电器就一直响,绿灯也一直闪烁。求高手们解答这是什么问题。? ...…

查看全部问答>

基于无线的定位算法研究资料大全

最近由于在研究无线定位算法,所以上传一些资料和大伙共享下,这都是我从各个渠道汇集而来的,希望对大家有用,也希望下载过的朋友留下个脚印。 [ 本帖最后由 wateras1 于 2012-5-3 22:01 编辑 ]…

查看全部问答>

MXCHIP+跑第一个Wifi例程的注意事项

第一个例程我昨天晚上就跑通了。今天看到网友说得好像很不容易,我把我的方法及遇到的问题说下。为以后扫清道路。 首先只要严格按照用户手册去做就应该没有问题。在这里再传下手册。同时自己也MARK一下。 我首先是下bootlaod: 手册上说很明确了 ...…

查看全部问答>

求教用msp430g2553 做一个音乐流水灯

想用PWM做一个蜂鸣器播放音乐加流水灯一起,做一个音乐流水灯,那个大神有成熟的程序吗,帮忙分享一下…

查看全部问答>