/*
* 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单片机的计算器
4星 · 超过85%的资源 需积分: 12 108 浏览量
2009-04-25
17:55:11
上传
评论 6
收藏 87KB RAR 举报
zgf009
- 粉丝: 1
- 资源: 5
最新资源
- TG-2024-04-26-183849310.mp4
- 汇编语言的概要介绍与分析
- 个人博客系统设计与开发.zip
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- htmlzwbjq_downyi.com.zip
- 无头单向非循环链表的实现(Test.c)
- 无头单向非循环链表的实现(SList.c)
- 浏览器重定向插件更新文件
- SSA-BP麻雀算法优化BP神经网络多特征分类预测(Matlab实现完整源码和数据)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页