基于AT89C51单片机C语言编写的计算器Word格式.docx

上传人:b****6 文档编号:17671250 上传时间:2022-12-08 格式:DOCX 页数:10 大小:17.24KB
下载 相关 举报
基于AT89C51单片机C语言编写的计算器Word格式.docx_第1页
第1页 / 共10页
基于AT89C51单片机C语言编写的计算器Word格式.docx_第2页
第2页 / 共10页
基于AT89C51单片机C语言编写的计算器Word格式.docx_第3页
第3页 / 共10页
基于AT89C51单片机C语言编写的计算器Word格式.docx_第4页
第4页 / 共10页
基于AT89C51单片机C语言编写的计算器Word格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

基于AT89C51单片机C语言编写的计算器Word格式.docx

《基于AT89C51单片机C语言编写的计算器Word格式.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机C语言编写的计算器Word格式.docx(10页珍藏版)》请在冰豆网上搜索。

基于AT89C51单片机C语言编写的计算器Word格式.docx

temp=P3;

temp=temp&

0xf0;

while(temp!

=0xf0)

delay(5);

switch(temp)

case0xee:

num=1;

break;

case0xde:

num=2;

case0xbe:

num=3;

case0x7e:

num=4;

P3=0xfd;

case0xed:

num=5;

case0xdd:

num=6;

case0xbd:

num=7;

case0x7d:

num=8;

 

P3=0xfb;

case0xeb:

num=9;

case0xdb:

num=10;

case0xbb:

num=11;

case0x7b:

num=12;

P3=0xf7;

case0xe7:

num=13;

case0xd7:

num=14;

case0xb7:

num=15;

case0x77:

num=16;

returnnum;

/***************89C51单片机【计算器】C语言程序******************/

/**************** 

P2位选P0段选时钟12MHZ 

*********************/

/*包含的头文件*/

#defineucharunsignedchar 

/*宏定义*/

#defineuintunsignedint

ucharLed[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

/*数码管段选*/

longfloatNumber[]={0,0,0,0};

/*数码管显示位控制寄存器*/ 

ucharA[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

longintD[]={0,0,0,0,0,0,0,0};

 

//数码管显示内容寄存器 

ucharcodeC[]={0x0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

/*数码管位选*/

/*列扫描控制LED1位2位3位4位5位6位7位8位*/

uchark=16;

/* 

按键对外控制 

*/

ucharb;

/* 

按键【+】【-】【*】【/】对外的控制 

longfloatOut_put;

/*定义变量【Out_put】作为结果 

uchare=0;

数字的位存储递进的控制 

*/ 

ucharg=0;

运算方式的控制变量 

ucharL=0;

ucharg1=0;

ucharg2=0;

ucharg3=0;

ucharg4=0;

charj=-1;

与Number[]数组连用 

ucharm=0;

按键【=】的控制变量 

ucharn=0;

按键【.】的控制变量 

ucharx=0;

小数点个数的记录变量 

ucharxo=0;

控制开始计数小数点的变量 

longintresult;

voidDelay(uinto) 

/*延时函数delay()的定义*/

uinti,j;

for(i=0;

i<

o;

i++)

for(j=0;

j<

121;

j++) 

{;

voidshow(longfloatOut_put)

ucharr;

uchark;

longintq,p;

uchars=0;

uchari;

longinttemp;

temp=Out_put;

if( 

(Out_put-temp)!

=0) 

{result=Out_put*10000;

r=4;

else 

{result=Out_put;

r=0;

p=result;

if(m==1)

if(result<

0)

result=-result;

q=result;

for(i=1;

i<

=8;

i++){q=q/10;

if(q==0){k=i;

i=9;

}}P0=0x40;

P2=C[8-k];

Delay

(1);

//负号的显示

P0=0x80;

P2=C[r];

P0=0x00;

result=p;

P0=Led[result%10];

P2=C[8];

result=result/10;

Delay

(1);

if((result%10==0)&

&

(result%100==0)&

(result%1000==0)&

(result%10000==0)&

(result%100000==0)&

(result%1000000==0)) 

{P0=0x00;

}

else{P0=Led[result%10];

P2=C[7];

(result%100000==0)) 

P2=C[6];

(result%10000==0)) 

P2=C[5];

(result%1000==0)) 

P2=C[4];

(result%100==0)) 

P2=C[3];

if((result%10==0)) 

P2=C[2];

if(result==0) 

P2=C[1];

voidIn_put() 

//输入函数输入小数 

加小数点 

uchari;

if(k>

=0&

k<

=9)

switch(e)

case8:

D[7]=D[6];

A[7]=A[6];

//用来存放数值

case7:

D[6]=D[5];

A[6]=A[5];

case6:

D[5]=D[4];

A[5]=A[4];

case5:

D[4]=D[3];

A[4]=A[3];

case4:

D[3]=D[2];

A[3]=A[2];

case3:

D[2]=D[1];

A[2]=A[1];

case2:

D[1]=D[0];

A[1]=A[0];

case1:

if(n==0) 

{D[0]=k;

A[0]=Led[k];

if(xo==1) 

x++;

}

if(n==1) 

A[0]=Led[k]|0x80;

xo=1;

n=0;

=11&

=15&

b==1)

switch(k)

case11:

g1++;

g++;

if(g2==1)L=1;

if(g3==1)L=2;

if(g4==1)L=3;

break;

// 

+

case12:

g2++;

if(g1==1)L=4;

if(g3==1)L=5;

if(g4==1)L=6;

-

case13:

g3++;

if(g1==1)L=7;

if(g2==1)L=8;

if(g4==1)L=9;

*

case14:

g4++;

if(g1==1)L=10;

if(g2==1)L=11;

if(g3==1)L=12;

j++;

Number[j]=10000000*D[7]+1000000*D[6]+100000*D[5]+10000*D[4]+1000*D[3]+100*D[2]+10*D[1]+D[0];

=x;

i++){Number[j]=(float)Number[j]/10;

x=0;

for(i=0;

=7;

i++) 

//数据存储器清零

D[i]=0;

//数据显示清零

{A[i]=0x00;

b=0;

e=0;

xo=0;

voidKey_scan() 

//键盘扫描函数 

Key_scan()

unsignedcharX,Y,Z;

P3=0xff;

P3=0x0f;

//先对P2置数行扫描

if(P3!

=0x0f) 

//判断是否有键按下

Delay(20);

//延时10ms,软件去干扰

//确认按键按下;

X=P3;

//保存行扫描时有键按下时状态

P3=0xf0;

//列扫描

Y=P3;

//保存列扫描时有键按下时状态

Z=X|Y;

//取出键值

while(P3!

=0xf0);

//按键防止抖动

switch(Z) 

//判断键值(那一个键按下)

case0xe7:

k=0;

e++;

In_put();

//数字【0】

case0xd7:

k=1;

e++;

//数字【1】

case0xdb:

k=2;

//数字【2】

case0xdd:

k=3;

//数字【3】

case0xb7:

k=4;

//数字【4】

case0xbb:

k=5;

//数字【5】

case0xbd:

k=6;

//数字【6】

case0x77:

k=7;

//数字【7】

case0x7b:

k=8;

//数字【8】

case0x7d:

k=9;

//数字【9】

case0xeb:

n=1;

//小数点【.】

case0x7e:

k=11;

b=1;

//字符【B+】

case0xbe:

k=12;

//字符【C-】

case0xde:

k=13;

//字符【D*】

case0xee:

k=14;

//字符【E/】

case0xed:

k=15;

m=1;

In_put();

//字符【F=】

voidYun_suan()

if(g1==1&

g==1) 

Out_put=Number[0]+Number[1];

if(g2==1&

g==1)Out_put=Number[0]-Number[1];

if(g3==1&

Out_put=Number[0]*Number[1];

if(g4==1&

g==1)Out_put=Number[0]/Number[1];

if(g1==2&

g==2)Out_put=Number[0]+Number[1]+Number[2];

if(g2==2&

g==2)Out_put=Number[0]-Number[1]-Number[2];

if(g3==2&

g==2) 

Out_put=Number[0]*Number[1]*Number[2];

if(g4==2&

g==2)Out_put=Number[0]/Number[1]/Number[2];

if(L==1) 

Out_put=Number[0]-Number[1]+Number[2];

if(L==2) 

Out_put=Number[0]*Number[1]+Number[2];

if(L==3) 

Out_put=Number[0]/Number[1]+Number[2];

if(L==4) 

Out_put=Number[0]+Number[1]-Number[2];

if(L==5) 

Out_put=Number[0]*Number[1]-Number[2];

if(L==6) 

Out_put=Number[0]/Number[1]-Number[2];

if(L==7) 

Out_put=Number[0]+Number[1]*Number[2];

if(L==8) 

Out_put=Number[0]-Number[1]*Number[2];

if(L==9) 

Out_put=Number[0]/Number[1]*Number[2];

if(L==10)Out_put=Number[0]+Number[1]/Number[2];

if(L==11)Out_put=Number[0]-Number[1]/Number[2];

if(L==12)Out_put=Number[0]*Number[1]/Number[2];

voidXian_shi()

if(m!

=1)

Key_scan();

/*显示函数 

与A[i]有关*/ 

P0=A[0];

P0=A[1];

P0=A[2];

P0=A[3];

P0=A[4];

P0=A[5];

P0=A[6];

P0=A[7];

while

(1)

Xian_shi();

Yun_suan();

show(Out_put);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1