教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

基于51单片机的简易计算器c程序

来源:网络收集 时间:2026-08-30
导读: 基于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字,全部文档内容请下载后查看。喜欢就下载吧 ……

基于51单片机的简易计算器c程序.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/1443139.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)