单片机C语言简易计算器Word格式文档下载.doc
- 文档编号:13165505
- 上传时间:2022-10-07
- 格式:DOC
- 页数:14
- 大小:72KB
单片机C语言简易计算器Word格式文档下载.doc
《单片机C语言简易计算器Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《单片机C语言简易计算器Word格式文档下载.doc(14页珍藏版)》请在冰豆网上搜索。
录入
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言 简易 计算器