做一个计算器_用51单片机做一个简单的计算器小程序

做一个计算器_用51单片机做一个简单的计算器小程序

2023年6月28日发(作者:)

做⼀个计算器_⽤51单⽚机做⼀个简单的计算器⼩程序⼀:硬件仿真图分别为8位数码管和4位数码管注意:本仿真案例有偿提供,请点击⽂章最下⽅的阅读原⽂,查看仿真图和程序下载地址。本仿真仅供参考,如有需要修改电路和程序,请联系管理员有偿修改。当然,如果你动⼿能⼒强,完全可以按照本⽂提供的电路图和程序源码⾃⾏搭建。硬件部分⽐较简单,当键盘按键按下时它的那⼀⾏、那⼀列的端⼝为低电平。因此,只要扫描⾏、列端⼝是否都为低电平就可以确定是哪个键被按下。本计算器是以80C51单⽚机为核⼼构成的简易计算器系统。该系统通过单⽚机控制,实现对4*4键盘扫描进⾏实时的按键检测,并把检测数据和计算结果存储下来,显⽰在LED数码管上,并可实现清零。整个系统主要可分为四个主要功能模块:功能模块⼀:实时键盘扫描;功能模块⼆:数据存储和计算;功能模块三:LED数码管显⽰;功能模块四:清零整个计算器系统的⼯作过程为:⾸先初始化参数,送LED低位显⽰“0”,功能键位不显⽰。然后扫描键盘看是否有键输⼊,若有,读取键码。判断键码是数字键、清零键还是“+” 、“—” 、“*” “/” ,是数值键则送LED显⽰并保存数值,是清零键则做清零处理,是功能键则⼜判断是“=”、清零、还是运算键,若是“=”则计算最后结果并送LED显⽰,若是运算键则保存相对运算程序的⾸地址,若是清零键则跳转回初始化阶段使所有值清零。⼆、主程序流程图程序的主要思想是:将按键抽象为字符,然后就是对字符的处理。将操作数分别转化为字符串存储,操作符存储为字符形式。然后调⽤compute()函数进⾏计算并返回结果。具体程序及看注释还有流程图。三:键盘扫描程序流程图四:显⽰程序流程图五:程序源码#include#include#include /* isdigit()函数 */#include /* atoi()函数 */#define uchar unsigned char#define uint unsigned intuchar operand1[9], operand2[9]; /* 操作数 */uchar operator; /* 操作符 */void delay(uint);uchar keyscan();void disp(void);void buf(uint value);uint compute(uint va1,uint va2,uchar optor);uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; /* 字符码表 */uchar dbuf[8] = {10,10,10,10,10,10,10,10}; /* 显⽰缓存 *//* 延时函数 */void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/******************************************* 键盘扫描程序 将按键转化为字符并作为输出

'$','#'分别表⽰清零键和没有键按下 *******************************************/uchar keyscan(){uchar skey; /* 按键值标记变量 *//*********************** 扫描键盘第1⾏

************************/P1 = 0xfe;while((P1 & 0xf0) != 0xf0) /* 有按键按下 */{delay(3); /* 去抖动延时 */while((P1 & 0xf0) != 0xf0) /* 仍有键按下 */{switch(P1) /* 识别按键并赋值 */{case 0xee: skey = '7'; break;case 0xde: skey = '8'; break;case 0xbe: skey = '9'; break;case 0x7e: skey = '/'; break;default: skey = '#';}while((P1 & 0xf0) != 0xf0) /* 等待按键松开 */;}}/*********************** 扫描键盘第2⾏

************************/P1 = 0xfd;while((P1 & 0xf0) != 0xf0){delay(3);while((P1 & 0xf0) != 0xf0){switch(P1){case 0xed: skey = '4'; break;case 0xdd: skey = '5'; break;case 0xbd: skey = '6'; break;case 0x7d: skey = '*'; break;default: skey = '#';}while((P1 & 0xf0) != 0xf0);}}/*********************** 扫描键盘第3⾏

************************/P1 = 0xfb;while((P1 & 0xf0) != 0xf0){delay(3);while((P1 & 0xf0) != 0xf0){switch(P1){case 0xeb: skey = '1'; break;case 0xdb: skey = '2'; break;case 0xbb: skey = '3'; break;case 0x7b: skey = '-'; break;default: skey = '#';}while((P1 & 0xf0) != 0xf0);}}/*********************** 扫描键盘第4⾏

************************/P1 = 0xf7;while((P1 & 0xf0) != 0xf0){delay(3);while((P1 & 0xf0) != 0xf0){switch(P1){case 0xe7: skey = '$'; break;case 0xd7: skey = '0'; break;case 0xb7: skey = '='; break;case 0x77: skey = '+'; break;default: skey = '#';}while((P1 & 0xf0) != 0xf0);}}return skey;}void main(){uint value1, value2, value; /* 数值1,数值2,结果 */uchar ckey, cut1 = 0, cut2 = 0; /* ckey键盘输⼊字符 */uchar operator; /* 运算符 */uchar i, bool = 0;init: /* goto语句定位标签 */buf(0); /* 初始化 */disp();value = 0;cut1 = cut2 = 0;bool = 0;for(i = 0;i < 9;i++){operand1[i] = '0';operand2[i] = '0';} /* 初始化 */while(1){ckey = keyscan(); /* 读取键盘 */if(ckey != '#'){ /* isdigit函数,字符是阿拉伯数字返回⾮0值,否则返回0 */if(isdigit(ckey))

{switch(bool){case 0:operand1[cut1] = ckey;operand1[cut1+1] = '0';value1 = atoi(operand1); /* atoi函数,将字符串转化为,int整数 */cut1++;buf(value1);disp();break;case 1:operand2[cut2] = ckey;operand2[cut2+1] = '0';value2 = atoi(operand2);cut2++;buf(value2);disp();break;default: break;}}else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/'){bool = 1;operator = ckey;buf(0);dbuf[7] = 10;disp();}else if(ckey == '='){value = compute(value1,value2,operator);buf(value);disp();while(1) /* 计算结束等待清零键按下 */{ckey = keyscan();if(ckey == '$') /* 如果有清零键按下跳转到开始 */goto init;else{buf(value);disp();}}}else if(ckey == '$')

{ goto init;}}disp();}}/****************************************** 运算函数 输⼊:操作数和操作符 输出:计算结果*******************************************/uint compute(uint va1,uint va2,uchar optor){uint value;switch(optor){case '+' : value = va1+va2; break;case '-' : value = va1-va2; break;case '*' : value = va1*va2; break;case '/' : value = va1/va2; break;default : break;}return value;}/******************************************* 更新显⽰缓存输⼊:⽆符号整数输出:将输⼊送⼊显⽰缓存*******************************************/void buf(uint val){uchar i;if(val == 0){dbuf[7] = 0;i = 6;}elsefor(i = 7; val > 0; i--){dbuf[i] = val % 10;val /= 10;}for( ; i > 0; i--)dbuf[i] = 10;}/******************************************* 显⽰函数

*******************************************/void disp(void){uchar bsel, n;bsel=0x01; for(n=0;n<8;n++) {

P2=bsel;P0=table[dbuf[n]];bsel=_crol_(bsel,1);delay(3);P0=0xff; }}

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687896333a54836.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信