基于51单片机的简易计算器c程序
基于51单片机的简易计算器c程序
/*...............菜鸟一枚,不好勿喷 →_→ ............................
【简易计算器的功能简介】
【 时间紧,先做个简易的吧,复杂的算法太难,没那么多时间写【现在也不太会 →_→】,
以后再研究→_→】
此程序是完全基于开发板的,可在板子上直接测试【程序跑飞的概率比较大,还不太明
白是哪的问题】
可实现总数小于等于九位【long int】的数字的加减乘除运算【每次只能进行一项】,可清
楚修改输入的数据,由于键盘等因素显示【4X4】,没有小数点键,
故无法直接进行小数运算,进行除法运算时,小数点后最多可保留6位,第7位进行四舍
五入。显示器采用1602,输入或修改时开光标并闪烁,
输入数据超出9位,有警告提示,加上运算符总的输入不超过15位【超过10输入逻辑已
经错误】。显示结果时关光标【重复按下时结果不变】,
显示结果后,也可对输入端进行修改,按下等于键再次显示结果。 2015/1 qq:1036894850 */
#include"reg52.h"
#include"stdio.h"
#define uchar unsigned char
sbit rs=P2^4; //lcd的控制线口
sbit rw=P2^5;
sbit ep=P2^6;
uchar ip[15]; //存输入的数据 ,15位【理论上10位就够了】'$'记运算符'*'记为负号
uchar sign; //存运算符
int k=0,equ=0,sk=0,ksk=0,sg=0;
void write_data(uchar dat); //给1602写数据
void write_com(uchar com);
void lcdinit();
void delay(int z);
void warn();
void key_deal(uchar key);
void sdeal(uchar i);
void key_sub_deal();
void key_equ_deal();
void key_del_deal();
uchar scankey();
void main()
{uchar key=0xff;
lcdinit(); // 1602初始化,结果输出位显示0,数据输入位光标闪烁。。。。
while(1) //循环扫面键盘
{ key=scankey();
key_deal(key);
}
}
基于51单片机的简易计算器c程序
uchar scankey() //键盘扫描函数,使用行列反转扫描法
{
uchar key,new_key;
uchar cord_h=0x0f,cord_l;//行列值中间变量
while(cord_h==0x0f) //。。。。。。。等待按键按下。。。。。
{P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
}
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(10); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
key=cord_h+cord_l;//键盘最后组合码值
}
do
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
new_key=cord_h+cord_l;//键盘最后组合码值
}
while(new_key==key); //。。。。。。。等待按键放开。。。
return(key);
}return(0xff); //返回该值
}
void key_deal(uchar key) //按键处理函数
{ int i=0;
if(key==0xb7)key_equ_deal();
else
if(key==0x77)key_del_deal();
else
{ if(equ==1) //等于键按下后如果有数字或者运算符键按下,则清除第一行显示 {write_com(0x80);
for(i=0;i<16;i++)write_data(' ');
write_com(0x0f);
write_com(0x80);
equ=0;k=0;sk=0;ksk=0;sg=0;sign='\0'; //一堆标记号清零
}
基于51单片机的简易计算器c程序
switch(key)
{
case 0xee: sdeal(0);break; //S0
case 0xde: sdeal(1);break; //S1
case 0xbe: sdeal(2);break; //S2
case 0x7e: sdeal(3);break; //S3
case 0xed: sdeal(4);break; //S4
case 0xdd: sdeal(5);break; //S5
case 0xbd: sdeal(6);break; //S6
case 0x7d:sdeal(7);break; //S7
case 0xeb:sdeal(8);break; //S8
case 0xdb:sdeal(9);break; //S9
case
0xbb:if(k<15){write_com(0x80+k);if(sg==0)sign='+';sg++;ip[k++]='$';write_data('+');}break;
//S10
case 0x7b:key_sub_deal();break; //S11
case
0xe7:if(k<15){write_com(0x80+k);if(sg==0)sign='x';sg++;ip[k++]='$';write_data('x');}break; //S12
case
0xd7:if(k<15){write_com(0x80+k);if(sg==0)sign='/';sg++;ip[k++]='$';write_data(0xfd);}break;
//S13
default: break; //【只记录第一个输入的sign】
}
}
}
void key_equ_deal() //等于处理键函数
{ int error=0,i=0,j=0; //error=0时输入逻辑正确
long int ip1=0,ip2=0,op=0,p=0,fp=0;
long float f=0;
uchar a[11];
uchar *s;
equ=1;
write_com(0xc0);
for(i=0;i<16;i++)write_data(' '); //
if((ip[0]=='$')||((ip[k-1]=='$')||(ip[k-1]=='*')))error=1; //先判断输入是否符合逻辑 【前面的限制使负号后面不会有负号可以有运算符或者数字】
i=1;
while(i<k)
{ if(ip[i]=='$')j++;
i++ ;
基于51单片机的简易计算器c程序
}
if(j>=2)error=1;
if(error==0) //输入的逻辑没有错误则计算结果
{ i=0;
if(ip[0]=='*')
{ i++;
while((ip[i]!='$')&&(i<k))
{ ip1=ip1*10+ip[i];i++;}
ip1=-ip1;
}
else
while((ip[i]!='$')&&(i<k))
{ ip1=ip1*10+ip[i];i++;}
i++;
if((ip[i]=='*')&&(i<k))
{ i++;
while(i<k)
{ ip2=ip2*10+ip[i];i++;}
ip2=-ip2;
}
else
while(i<k)
{ ip2=ip2*10+ip[i];i++;}
if(sign=='+') //输出结果的计算
op=ip1+ip2;
else
if(sign=='-')
op=ip1-ip2;
else
if(sign=='x')
op=ip1*ip2;
else
if(sign=='/')
{f=ip1;
f=f/ip2;
op=f;
if(op>=0)fp=10000000*(f-op); //进行除法运算时,保留小数点后6位
else fp=-10000000*(f-op);
}
else
op=ip1;
if(ip2!=0)
基于51单片机的简易计算器c程序
{ i=0;j=1; //结果的输出计算
if(op>=0)p=op;
else p=-op;
if(p==0)a[i++]=0;
else
while(p!=0)
{a[i++]=p%10;
p=p/10;
}
if(op<0)a[i]='-';
else i--;
write_com(0xc0);
write_com(0x0c);
while(i>=0)
{if(a[i]=='-')write_data(a[i]); …… 此处隐藏:4128字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [政务民生]2013年公共基础知识热点问题(七)
- [政务民生]检验检测机构资质认定评审准则及释义20
- [政务民生]关于印发重庆市房屋建筑和市政基础设施
- [政务民生]1、隧道洞身开挖支护施工技术交底书
- [政务民生]2015年山东省17地市中考语文试题分类汇
- [政务民生]2-高级会计师资格考试和评审流程图
- [政务民生]2018版中国清分机行业发展分析及前景策
- [政务民生]新课改高中政治探究
- [政务民生]2018-2024年中国新型组合房屋行业投资
- [政务民生]2015年上海市春季高考数学模拟试卷五
- [政务民生]灌砂法及环刀法测压实度(带计算过程)
- [政务民生]运筹学实验2求解非线性规划
- [政务民生]劝学、逍遥游默写(教师卷)
- [政务民生]《运筹学》 - 期末考试 - 试卷A - 答案
- [政务民生]八年级英语下册 Module 6 Hobbies测试
- [政务民生]2019年宪法知识竞赛试题库100题(含答
- [政务民生]自动化英文文献翻译
- [政务民生]公文格式实施细则
- [政务民生]高一地理上册课堂跟踪练习题6
- [政务民生]会计继续教育习题及答案
- 第三章 无约束最优化方法
- 泛读教程第三册答案
- 魏晋南北朝文学
- 幂的运算复习题
- 城市环境问题的成因与治理策略_以社会
- 钢结构行业产业链及竞争分析研究
- 新型热塑性弹性体增韧聚丙烯的研究
- 中国旅游地理B卷试题及答案
- (苏教版)五年级数学上册第三单元测试卷
- 不稳定性心绞痛诊断与治疗
- 俞氏国际后勤职能部门绩效考核办法
- GB7258-2017新标准考试题含答案
- 小学生汉字听写比赛活动方案
- 1.3《平抛运动》学案 教科版必修2
- 2011香港特别行政区公务员考试复习资料
- 考虑水力条件变化的城市给水管网可靠性
- 表面活性剂在油田开发和生产中的应用
- ITT内部培训资料-FI端吸泵的介绍
- 文明守纪,从我做起学生发言稿
- 初中读《聊斋志异》心得体会800字范文




