单片机C语言简易计算器Word格式文档下载.doc

上传人:b****1 文档编号:13165505 上传时间:2022-10-07 格式:DOC 页数:14 大小:72KB
下载 相关 举报
单片机C语言简易计算器Word格式文档下载.doc_第1页
第1页 / 共14页
单片机C语言简易计算器Word格式文档下载.doc_第2页
第2页 / 共14页
单片机C语言简易计算器Word格式文档下载.doc_第3页
第3页 / 共14页
单片机C语言简易计算器Word格式文档下载.doc_第4页
第4页 / 共14页
单片机C语言简易计算器Word格式文档下载.doc_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

单片机C语言简易计算器Word格式文档下载.doc

《单片机C语言简易计算器Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《单片机C语言简易计算器Word格式文档下载.doc(14页珍藏版)》请在冰豆网上搜索。

单片机C语言简易计算器Word格式文档下载.doc

录入

5.硬件设计

(1)电路原理图:

(2)元件清单:

元件名称

型号

数量

用途

单片机

1

控制核心

电阻

10kΩ

4

按键电路

数码管

8位共阳极

显示电路

按键

16

6.软件设计

(1)算法流程图:

开始

主函数

结束

调用运算程序

录入数值

判断符号

中断结束

定时器赋初值

送显示数据

关中断

中断开始

显示函数

按键函数

运算查值

赋值给变量

列扫描

行扫描

(2)程序清单:

#include<

reg51.H>

/***按键程序***/

charkeyscan();

/***显示程序***/

voiddisplay();

chardsp[9]={0,0,12,12,12,12,12,12,12};

//初始化显示数组

/***计算程序***/

voidcalculate(chark,charc1[8],charc2[8]);

/***片选***/

unsignedcharcodeSelect[]=

{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

/***码选***/

unsignedcharcodeLED_CODES[]=

{0xC0,0xF9,0xA4,0xB0,0x99,//0-4

0x92,0x82,0xF8,0x80,0x90,//5-9

0x86,0xAF,0xFF,0x7F,0xBF,};

//E,r,空格,.,-

/***main函数***/

voidmain(void)

{

chari,j,k,c;

chara[8],b[8];

/***定时1ms***/

TMOD=0;

//TL0=-(1000/256);

//TH0=-(1000%256);

EA=1;

//总中断开关

ET0=1;

//开中断

TR0=1;

//启用计数器0

LR:

do

{

for(i=1;

i<

9;

i++)//数字录入循环

{

dsp[0]=keyscan();

if(c==2&

&

dsp[0]<

10)//此段代码验证是否有旧的计算结果在显示,且不再参与新计算

{

dsp[1]=dsp[0];

for(j=2;

j<

j++)

dsp[j]=12;

c=0;

}

elseif(c==2&

dsp[0]>

9)//旧的计算结果将参与新的计算,作为第一个数

if(dsp[0]==0&

dsp[1]==0&

dsp[2]==12)//个位为0且十位为空时按下0,按键无效,跳回LR等待正确输入

/***goto跳转标志***/

gotoLR;

elseif(dsp[0]>

9)break;

//有操作符按下,跳出数字录入循环

else

for(j=i;

j>

0;

j--)

dsp[j]=dsp[j-1];

//移位,以正确显示数字

}

}

if(i==9)//判断是否输入8个有效数字,是则等待操作符,否则直接判断操作符

do//使用dowhile无论是否第一个数都取一次操作符

dsp[0]=keyscan();

//获取操作符号

if(dsp[0]==14||dsp[0]<

10)//按下C或者第9位数字清零

{

dsp[1]=0;

for(i=2;

i++)

dsp[i]=12;

c=0;

}

while((dsp[0]==15)&

(c==0));

//等号被按下,等待新的操作符(仅对第一个数字有效)

}

elseif(dsp[0]==14)//按下C清零

dsp[1]=0;

for(i=2;

dsp[i]=12;

c=0;

while(dsp[0]==15&

c==0)//未输满8位且是第一个数字即按下等号,等待非等号操作符

if(dsp[0]==14||dsp[0]<

10)//按下C或者数字都进行清零,重新输入a

dsp[0]=14;

//将dsp[0]置为14,防止因数字清零未能拦截

dsp[1]=0;

for(i=2;

dsp[i]=12;

}

while(dsp[0]==14);

//数字输入未完成即按下C,重新等待输入

do

if(c==0)//没有数字输入

{

k=dsp[0];

//存计算符(循环内已排除C、=、数字)

for(i=0;

8;

i++)//将第一个数存入a[8]

a[i]=dsp[i+1];

//清零

c=1;

//已输入a

/***goto跳转标志***/

gotoLR;

elseif(c==1)

i++)//将第二个数存入b[8]

b[i]=dsp[i+1];

c=2;

//已输入b

if(dsp[0]!

=15)//b输完后操作符不是等号

calculate(k,a,b);

for(i=0;

i++)//将计算结果存入a[8],a值更新

a[i]=dsp[i+1];

k=dsp[0];

//更新计算符

c=1;

while((dsp[0]==15)&

(c<

2));

//直到ab输入完成且按下等号

calculate(k,a,b);

//进行最后计算

gotoLR;

//跳回LR,等待新一轮计算

while

(1);

//防止程序跑飞

}

charkeyscan()

charKeyL;

charKeyR;

charj;

do

P3=0xF0;

P3=P3|0xF0;

//行扫描11110000

if(P3!

=0xF0)

KeyL=P3;

P3=0x0F;

P3=P3|0x0F;

//列扫描00001111

KeyR=P3;

while(KeyL==0xF0||KeyR==0x0F);

for(j=0;

12;

j++)//延时0.001s=1ms

{;

while(P3!

=0x0F);

switch(KeyL&

KeyR)

case0x28:

{return0;

break;

case0x11:

{return1;

case0x21:

{return2;

case0x41:

{return3;

case0x12:

{return4;

case0x22:

{return5;

case0x42:

{return6;

case0x14:

{return7;

case0x24:

{return8;

case0x44:

{return9;

case0x81:

{return10;

}//加法(第一行,第四列)

case0x82:

{return11;

}//减法(第二行,第四列)

case0x84:

{return12;

}//乘法(第三行,第四列)

case0x88:

{return13;

}//除法(第四行,第四列)

case0x18:

{return14;

}//清零(第四行,第一列)

case0x48:

{return15;

}//计算结果(第四行,第三列)

voiddisplay()interrupt1using1//利用定时器中断实现间时显示

chari,j,h;

ET0=0;

for(j=8;

j--)//扫描8次

for(i=7;

i>

=0;

i--)//从高位到低位扫描显示

P2=0;

P1=LED_CODES[dsp[8-i]];

P2=Select[i];

for(h=0;

h<

h++)

{;

TL0=-(1000/256);

TH0=-(1000%256);

ET0=1;

voi

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

当前位置:首页 > 职业教育 > 职业技术培训

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

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