/*
* Copyright (c) 2009,301创新实验室
* All rights reserved.
*
* 文件名称:calc.c
* 文件标识:
* 摘 要:单片机课程设计--计算器
*
* 当前版本:Debug.
* 作 者:祝高锋
* 完成日期:2009年3月17日
*/
#include <at89x51.h>
#include <math.h>
#include <intrins.h>
unsigned long TimeCount=0;
unsigned char code LED_TABLE[]={ 0xD7,0x14,0xCD,0x5D,0x1E,0x5B,0xDB,0x15,0xDF,0x5F,0X00};
unsigned char code LED_N[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char k; //test
unsigned char data m = 0x00;
unsigned char data n = 0xfe;
unsigned char keynum;
bit keycon,getkey;
unsigned char calc_mode=0;//计算器模式;
unsigned char ledcode[8];//存储显示的断码
unsigned char calc_val[7],val_location=0,point_location=0; //键值判断
float val1=0,val2=0,val; //val为显示的数据
bit neg_val=0;//数值正负判断
bit first_in=1;//双目运算判断位置;1为第一次输入
bit point_on=0;
bit calcend=0; //一次计算完毕
bit keyinend=0;//一次输入完毕;
bit clearzero=0;
unsigned char calc_symbol=0;
#include <computing.h>
#include <leddisplay.h>
#include <key.h>
void int_key() interrupt 1
{
TimeCount++;
TH0=-4230/256;
TL0=-4230%256;
if(keycon==1)
{
scankey();
}
keycon=!keycon;
}
void int_Out() interrupt 0
{
TH0=-4230/256;
TL0=-4230%256;
ET0=1;
TR0=1;
EX0=0;
PCON=0x00;
}
void main()
{
TMOD=0x01;
TH0=-4230/256;
TL0=-4230%256;
ET0=1;
TR0=1;
EA=1;
while(1)
{
if(TimeCount>(2500*2))
{
TimeCount=0;
P0=0x00;
P2=0xff;
// ET0=0;
// EX0=1;
PCON=PD_;
}
if(getkey==1)
{
TimeCount=0;
getkey=0;
if(calcend==1)
{
calcend=0;
val=0;
for(k=1;k<7;k++){ledcode[k]=0x00;}
ledcode[0]=0xd7;
}
if(keynum<0x0a)
{
clearzero=0;
if(val_location<7)
{
calc_val[val_location]=keynum;
for(k=val_location;k>0;k--){ledcode[k]=ledcode[k-1];}
ledcode[0]=LED_TABLE[keynum];
val=val*10+calc_val[val_location];
val_location++;
}
}
else
{
if(keynum==0x0a) //小数点
{
if(point_on==0)
{
ledcode[0]=ledcode[0]+0x20;
point_location=val_location;
point_on=1;
}
}
if(keynum==0x0b) //负号
{
if(val_location==0)
{
neg_val=!neg_val;
}
}
if(keynum==0x0c) //mode
{
if(calc_mode==2){calc_mode=0;}else{calc_mode++;}
ledcode[7]=LED_TABLE[calc_mode];
calcend=1;
}
if(keynum==0x0e) //CE
{
calcend=1;
val=0;
for(k=1;k<7;k++){ledcode[k]=0x00;}
ledcode[0]=0xd7;
}
if((keynum>=0x0f)&(first_in==1)&(val_location!=0)) //运算符
{
computing(keynum,calc_mode);
}
if((keynum==0x0d)) //等于号的运算
{
clearzero=1;
if(point_on==1)
{
val=val/pow(10,val_location-point_location);
}
val2=val;
if(neg_val==1)
{
val2=(-1)*val2;
neg_val=0;
}
switch(calc_symbol)
{
case 1: val=val1-val2;
break;
case 2: val=val1+val2;
break;
case 3: val=val1/val2;
break;
case 4: val=val1*val2;
break;
case 5: val=pow(val1,val2);
break;
case 6: val=log(val1)/log(val2);
default:break;
}
calcend=1;
}
}
}
if(calcend==1) //一次计算完毕 进入等待
{
calc_symbol=0;
val_location=0;
neg_val=0;
val1=0;
val2=0;
for(k=0;k<7;k++){calc_val[k]=0;}
first_in=1;
point_on=0;
}
if(neg_val==1) //显示模式
{
ledcode[7]=0x08;
}
else
{
ledcode[7]=LED_TABLE[calc_mode];
}
if(clearzero==1)
{
display(val);
}
else
{
for(m = 0; m < 8; m++)
{
P2 = n;
P0 = ledcode[m];
delayms(1);
n = _crol_(n,1);
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于51单片机的计算器
共28个文件
bak:5个
c:4个
h:3个
4星 · 超过85%的资源 需积分: 12 118 下载量 194 浏览量
2009-04-25
17:55:11
上传
评论 6
收藏 87KB RAR 举报
温馨提示
这是本人的一个课程设计,使用at89c52和8位led. 功能:浮点数计算,正负数计算.对数,指数,三角函数计算. 文件中带有protues仿真图.仿真图不能直接用来做硬件制作
资源推荐
资源详情
资源评论
收起资源包目录
calc.rar (28个子文件)
calc
calc.OBJ 17KB
calcfortest.hex 9KB
STARTUP.LST 11KB
calc.Opt 3KB
calc.Uv2 2KB
calc_Opt.Bak 3KB
key.h 3KB
STARTUP.A51 5KB
calc.PWI 768B
leddisplay.h 6KB
calc.lnp 41B
computing.h 2KB
calc.hex 18KB
calc.M51 31KB
calc.LST 10KB
STARTUP.OBJ 749B
computing.c 2KB
Last Loaded calc.DBK 143KB
calc.plg 359B
复件 (2) calc.c 6KB
复件 calc.c 5KB
calc_Uv2.Bak 2KB
calc 12KB
calc.DSN 144KB
calc.bak 777B
key.bak 2KB
leddisplay.bak 6KB
calc.c 6KB
共 28 条
- 1
zgf009
- 粉丝: 1
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页