基于51单片机计算器设计

目录

一、项目功能

二、仿真

三、程序

资料下载地址:基于51单片机计算器

一、项目功能

1、利用键盘及LCD1602作为计算器的输入及显示模块;

2、能进行加、减、乘、除的基本运算;按键有0~9,“+-*/=”。

3、有清零“CR"按键;

4、有记忆功能键,按下该键,可以直接显示并运用存储数据进行计算。

二、仿真

三、程序

部分程序

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

sbit e=P2^3;
sbit rs=P2^4;
sbit rw=P2^0;
sbit busy=P0^7;

char i,j,temp,num,num_1;
long a,b,c;     
float a_c,b_c;
uchar flag,fuhao;

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,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30};

void delay(uchar z)
{
	uchar y;
	for(z;z>0;z--)
		for(y=0;y<110;y++);
}

void check()
{
	do{
		P0=0xFF;
		rs=0;     
		rw=1;    
    	e=0;     
    	delay(1); 
    	e=1;     
      }while(busy==1); 
}

void write_com(uchar com)
{
	P0=com; 
	rs=0;
	rw=0;
	e=0;
	check();
	e=1;
}

void write_date(uchar date)
{
	P0=date;
	rs=1;
	rw=0;
	e=0;
	check();
	e=1;
}

void init() 
{
	num=-1;
	e=1; 
	write_com(0X01);
	delay(1);
	write_com(0x38); 
	delay(1);
	write_com(0x0c); 
	delay(1);
	write_com(0x06); 
	delay(1);
	write_com(0x80); 
	delay(1);
	write_com(0x01); 
	delay(1);
	num_1=0;
	i=0;
	j=0;
	a=0;     
	b=0;    
	c=0;
	flag=0; 
	fuhao=0; 
}


   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);

        P1=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;

           while(c!=0)

           {

             write_date(0x30+c%10);

             c=c/10;

           }

           write_date(0x3d);     //??"="

           a=0;b=0;flag=0;fuhao=0;

           }

      else if(fuhao==2){write_com(0x80+0x4f);//???????????????

            write_com(0x04);     //?????????,???????,??????(?????????,????????)

           if(a-b>0)

             c=a-b;

           else

             c=b-a;

           while(c!=0)

           {

             write_date(0x30+c%10);

             c=c/10;

           }

           if(a-b<0)

             write_date(0x2d);

           write_date(0x3d);     //??"="           

           a=0;b=0;flag=0;fuhao=0;

          }

      else if(fuhao==3){write_com(0x80+0x4f);

            write_com(0x04);

             c=a*b;

             while(c!=0)

             {

             write_date(0x30+c%10);

             c=c/10;

             }

             write_date(0x3d);     

          a=0;b=0;flag=0;fuhao=0;

             }

      else if(fuhao==4){write_com(0x80+0x4f);

            write_com(0x04);

            i=0;

            c=(long)(((float)a/b)*1000);

            while(c!=0)

             {

               write_date(0x30+c%10);

               c=c/10;

           i++;

           if(i==3)

               write_date(0x2e);

             }

            if(a/b<=0)

              write_date(0x30);

            write_date(0x3d);                              

            a=0;b=0;flag=0;fuhao=0;

                    }

      }

     break;

     case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}

     break;

   }

}

}

main()

{

	init();

	while(1)
 	{

  		 keyscan();

 	}
}

  • 2
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森旺电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值