51单片机c语言编写计算器仿真,基于51单片机的计算器设计c程序代码加proteus仿真...

可实现加减乘除各类运算,带有清零复位功能

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

3f829e29e76caa8c3b1f630a6b27d58d.gif

0.png (24.71 KB, 下载次数: 9)

2019-1-10 04:05 上传

程序代码如下:

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

sbit wela=P2^7;          //定义端口

sbit dula=P2^6;

long in1,in2,out,x;

int cnt,i,flag;

uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};          //LED显示字模,共阴

void delay(uint xms)  //延时函数

{

uint j;

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

for(j=114;j>0;j--);

}

void display()         //显示函数声明

{

uchar w1,w2,w3,w4,w5,w6,f=0;

long y;

if(x>=0)   //显示六位计时数

{

if(x>=1e6)

{

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=num[12];

dula=0;

delay(2);

P0=0xff;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=0x3e;

dula=0;

delay(2);

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

dula=1;

P0=num[0];

dula=0;

delay(2);

return;

}

w1=x%10;w2=x/10%10;w3=x/100%10;w4=x/1000%10;w5=x/10000%10;w6=x/100000%10;

if(f==1||w6)

{

f=1;

P0=0xff;

wela=1;

P0=0xfe;

wela=0;

dula=1;

P0=num[w6];

dula=0;

delay(2);

}

if(f==1||w5)

{

f=1;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

dula=1;

P0=num[w5];

dula=0;

delay(2);

}

if(f==1||w4)

{

f=1;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

dula=1;

P0=num[w4];

dula=0;

delay(2);

}

if(f==1||w3)

{

f=1;

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=num[w3];

dula=0;

delay(2);

}

if(f==1||w2)

{

f=1;

P0=0xff;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=num[w2];

dula=0;

delay(2);

}

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

dula=1;

P0=num[w1];

dula=0;

delay(2);

}

else

{

y=labs(x);

if(y>=1e5)

{

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=num[12];

dula=0;

delay(2);

P0=0xff;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=0x3e;

dula=0;

delay(2);

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

dula=1;

P0=num[0];

dula=0;

delay(2);

return;

}

w1=y%10;w2=y/10%10;w3=y/100%10;w4=y/1000%10;w5=y/10000%10;

if(f==1||w5)

{

if(f==0)

{

P0=0xff;

wela=1;

P0=0xfe;

wela=0;

dula=1;

P0=0x40;

dula=0;

delay(2);

}

f=1;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

dula=1;

P0=num[w5];

dula=0;

delay(2);

}

if(f==1||w4)

{

if(f==0)

{

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

dula=1;

P0=0x40;

dula=0;

delay(2);

}

f=1;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

dula=1;

P0=num[w4];

dula=0;

delay(2);

}

if(f==1||w3)

{

if(f==0)

{

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

dula=1;

P0=0x40;

dula=0;

delay(2);

}

f=1;

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=num[w3];

dula=0;

delay(2);

}

if(f==1||w2)

{

if(f==0)

{

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=0x40;

dula=0;

delay(2);

}

f=1;

P0=0xff;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=num[w2];

dula=0;

delay(2);

}

if(f==0)

{

P0=0xff;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=0x40;

dula=0;

delay(2);

}

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

dula=1;

P0=num[w1];

dula=0;

delay(2);

}

}

void keyscan()         //键盘扫描函数

{

uchar temp;

P1=0xfe;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(8);

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xee:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+7;

x=in1;

}

else

{

in2=in2*10+7;

x=in2;

}

}

break;

case 0xde:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+8;

x=in1;

}

else

{

in2=in2*10+8;

x=in2;

}

}

break;

case 0xbe:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+9;

x=in1;

}

else

{

in2=in2*10+9;

x=in2;

}

}

break;

case 0x7e:

if(cnt!=0&&flag==0)

{

cnt=0;

flag=4;

}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

P1=0xfd;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(8);

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xed:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+4;

x=in1;

}

else

{

in2=in2*10+4;

x=in2;

}

}

break;

case 0xdd:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+5;

x=in1;

}

else

{

in2=in2*10+5;

x=in2;

}

}

break;

case 0xbd:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+6;

x=in1;

}

else

{

in2=in2*10+6;

x=in2;

}

}

break;

case 0x7d:

if(cnt!=0&&flag==0)

{

cnt=0;

flag=3;

}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

P1=0xfb;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(8);        //消除抖动

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xeb:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+1;

x=in1;

}

else

{

in2=in2*10+1;

x=in2;

}

}

break;

case 0xdb:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+2;

x=in1;

}

else

{

in2=in2*10+2;

x=in2;

}

}

break;

case 0xbb:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+3;

x=in1;

}

else

{

in2=in2*10+3;

x=in2;

}

}

break;

case 0x7b:

if(cnt!=0&&flag==0)

{

cnt=0;

flag=2;

}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

P1=0xf7;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(8);

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)    //证明有键按下,if语句是为了让键盘松开

{

temp=P1;

switch(temp)

{

case 0xe7:

cnt=0;

in1=0;

in2=0;

out=0;

flag=0;

x=0;

break;

case 0xd7:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+0;

x=in1;

}

else

{

in2=in2*10+0;

x=in2;

}

}

break;

case 0xb7:           //如果得到符号位

switch(flag)

{

case 1:

out=in1+in2;        //加

break;

case 2:

out=in1-in2;        //减

break;

case 3:

out=in1*in2;        //乘

break;

case 4:

if(in2)

out=in1/in2;        //除

break;

}

x=out;

in1=0;

in2=0;

cnt=0;

flag=0;

break;

case 0x77:

if(cnt!=0&&flag==0)

{

cnt=0;

flag=1;

}

break;

}

while(temp!=0xf0)   //等待按键松开

{

temp=P1;

temp=temp&0xf0;

}

}

}

}

void main()          //主函数

{

while(1)

{

keyscan();

display();

}

}

全部资料51hei下载地址:

08888e3a94b1d4845f47f7539b112be4.gif

jisuanqi.zip

(100.27 KB, 下载次数: 26)

2019-1-10 03:32 上传

点击文件名下载附件

下载积分: 黑币 -5

51计算器程序#include #include #define uchar unsigned char #define uint unsigned int sbit lcden=P3^4; sbit lcdrw=P3^6; sbit lcdrs=P3^5; uchar num,temp,jia=0,cheng=0,chu=0,jian=0,qing=0; uint key,key1,shu; uchar fuhao,flag1,flag=0; uchar table[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,}; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); } bit lcd_bz() { bit result; lcdrs = 0; lcdrw= 1; lcden = 1; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P0&0x80;); lcden=0; return result; } void write_com(uchar com) { while(lcd_bz()); lcdrs=0; lcden=0; lcdrw=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar date) { while(lcd_bz()); lcdrs=1; lcden=0; lcdrw=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void lcd_init() { lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void keyscan() { P3=0xfe; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:key=1;num=0;break; case 0xde:key=2;num=0;break; case 0xbe:key=3;num=0;break; case 0x7e:num=1;break; //¼ÓºÅ } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfd; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xed:key=4;num=0;break; case 0xdd:key=5;num=0;break; case 0xbd:key=6;num=0;break; case 0x7d:num=2;break; //¼õºÅ } while( temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfb; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb:key=7;num=0;break; case 0xdb:key=8;num=0;break; case 0xbb:key=9;num=0;break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值