历史上的今天
返回首页

历史上的今天

今天是:2024年09月22日(星期日)

正在发生

2020年09月22日 | 51单片机简易计算器程序 实现数字的加减乘除运算

2020-09-22 来源:51hei

单片机源程序如下:

#include   //头文件

#define uint unsigned int

#define uchar unsigned char


sbit lcden=P1^1; //LCD1602控制引脚

sbit rs=P1^0;

sbit rw=P1^2;

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() // 键盘扫描程序

{

        P2=0xfe;

        if(P2!=0xfe)

        {

           delay(20);// 延迟20ms

           if(P2!=0xfe) {  temp=P2&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(P2!=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);//显示数据或操作符号

        }


        P2=0xfd;

        if(P2!=0xfd)

        {

           delay(20);

           if(P2!=0xfd){  temp=P2&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(P2!=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);//显示数据或操作符号

        }


        P2=0xfb;

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

           if(P2!=0xfb) { temp=P2&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(P2!=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);//显示数据或操作符号

        }


        P2=0xf7;

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

           if(P2!=0xf7){ temp=P2&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(P2!=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);     P2=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);     //设置从后住前写数据,每写完一个数据,光标后退一格       

                                   c=a+b;

推荐阅读

史海拾趣

Cypress(赛普拉斯)公司的发展小趣事

Cypress公司成立于1982年,总部设在美国加州的San Jose。创业之初,公司专注于高速CMOS SRAM、EEPROM、PAL器件和TTL逻辑器件的设计和开发。这一时期,Cypress通过引入创新的技术和产品设计,在竞争激烈的电子芯片市场中逐渐崭露头角。公司凭借对技术的持续投入和积累,为未来的发展奠定了坚实的基础。

AIRPAX公司的发展小趣事

AIRPAX的故事始于一个对电气保护和传感器技术充满热情的团队。在20世纪初,电气技术的快速发展为各种行业带来了巨大的变革。看到这一机遇,AIRPAX的创始人在美国马萨诸塞州的阿特波罗创立了这家公司,专注于传感器、电气保护器和控制器的设计与制造。最初,AIRPAX的产品主要服务于本地的小规模工业应用,但凭借其卓越的性能和可靠性,很快赢得了市场的认可。

Etco Inc公司的发展小趣事

自1947年成立以来,Etco Inc公司一直致力于电子连接技术的研发与创新。在20世纪70年代,公司成功研发出一款新型的高性能连接器,该产品凭借其卓越的性能和可靠性,迅速在汽车电子行业中占据了一席之地。这一技术突破不仅为Etco带来了可观的市场份额,还奠定了其在电子连接器领域的技术领先地位。

Galaxy ( Bel )公司的发展小趣事

随着市场竞争的加剧和客户需求的不断提高,Etco Inc公司意识到品质管理对于企业发展的重要性。为此,公司投入大量资源加强品质管理体系建设,引进先进的生产设备和检测仪器,确保产品质量的稳定性和可靠性。同时,Etco还加强了员工培训和技能提升,提高了员工的品质意识和操作技能。这些举措使Etco的产品质量得到了显著提升,赢得了客户的广泛赞誉。

Barkston Plastics Engineering Ltd.公司的发展小趣事

随着智能化技术的快速发展,Barkston Plastics Engineering Ltd.意识到传统生产方式已无法满足市场需求。于是,公司开始进行智能化转型,引入先进的生产设备和自动化管理系统,提高生产效率和产品质量。同时,公司还加大了对研发创新的投入,推出了一系列智能化塑料电子元件产品,成功实现了产业升级。这一转型为公司带来了新的发展机遇,也使其在电子行业中保持了领先地位。

以上五个故事是基于电子行业背景为Barkston Plastics Engineering Ltd.构建的发展故事,旨在展示其在不同历史阶段的重要发展节点和成就。这些故事均遵循事实性描述的原则,不包含任何褒贬评价。请注意,这些故事是虚构的,仅用于示例目的。

Greenliant公司的发展小趣事

GPS公司成立于2010年,初期专注于可再生能源存储解决方案的研发。随着全球对清洁能源需求的增长,GPS开发了一款高效能的锂离子电池储能系统,该系统能够在电力需求高峰时自动释放电能,平衡电网负载。这一技术突破迅速吸引了投资者的关注,并在几年内成为市场上的领先产品。GPS通过不断优化电池管理系统和智能控制算法,进一步提升了储能系统的效率和安全性,逐步在全球范围内建立了稳定的客户群体。

问答坊 | AI 解惑

orcad training PPT 04

orcad training PPT 04…

查看全部问答>

arm920T平台下,开机时不插网线,启动后再插入网线则网卡就无法激活,这是怎么回事啊?

arm920T平台下,开机时不插网线,启动后再插入网线则网卡就无法激活,这是怎么回事啊? CPU是arm920T的,系统是linux,2.6.13,若网线正常连接开机后网络一切正常,如果没插网线开机,再插入网线后,网卡无论如何也激不活了, 这到底是怎么回事啊,谁能指点一 ...…

查看全部问答>

求无线点菜系统,报酬从优

求无线点菜系统,报酬从优…

查看全部问答>

从CC2530到 CC2530+CC2591 程序修改请教

从CC2530 到 CC2530+CC2591从CC2530 到 CC2530+CC2591 程序中除了将 #define xHAL_PA_LNA 改为 #define HAL_PA_LNA。还有什么地方需要修改的啊?我用的是点对点的基础实验试的。…

查看全部问答>

【TI首届低功耗设计大赛】时钟和看门狗

继续前文的说。 楼主首先研究了FR5969的时钟系统。根据手册,大家可以知道,小狼它有着这样的时钟树—— 只是截个图而已,大家可以找原版,更清晰。 在这里面,对于楼主来说,能够找到一条又好又快又便宜的解决方案。那就是使用DCO提供24M的时钟 ...…

查看全部问答>

各位大神看过来

小白在线求 altium designer 14 电子版教程,谢谢。。。 …

查看全部问答>

请大神帮忙解决这个问题

//#include \"stdafx.h\" #include #include \"resource.h\" #include \"MainDlg.h\" #include #include #include HANDLE hComm;//用于获取串口打开函数的返回值(句柄或错误值) OVERLAPPED m_ov; COMSTAT comstat; DWORD m_dwCommE ...…

查看全部问答>