51单片机数码管计算器(代码详解)

您所在的位置:网站首页 单片机计算器程序代码是多少 51单片机数码管计算器(代码详解)

51单片机数码管计算器(代码详解)

2024-07-10 18:01| 来源: 网络整理| 查看: 265

/****************************************************************** 按键说明 S6--S15 数字0--9的输入 S16 清零 S17 等于 S18--S21加减乘除 程序功能: 本程序为简易计算器。可以算整数且正数类型的运算。 但是暂时没有实现其连算功能,故在每次运算之后,请按下清零键。 ******************************************************************/ #include #define uchar unsigned char uchar a0=16,b0=16,c0=16,d0=16,e0=16,f0=16,wei,temp,key,i,j,k; uchar jia,jian,cheng,chu,dengyu,jia0,jian0,cheng0,chu0,qingling; uchar s0,s1,s2,s3,s4,s5; //参加运算的各个位 unsigned long qian,hou;//定义参于运算的第一个数和第二个数。 sbit dula=P2^6;//数码管段选(段选锁存器) sbit wela=P2^7;//数码管位选(位选锁存器) sbit beep=P2^3;//蜂鸣器 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//数码管0~9 void delay(uchar i)//延时函数 { for(j=i;j>0;j--) for(k=125;k>0;k--); } /*------------------------------------ 函数功能:数码管显示函数 参数说明:a,b,c,d,e,f都是传入数码管要显示的数据,即段选数据 通过定义的数组table传入 -------------------------------------*/ void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f) { dula=0; P0=table[a]; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5); P0=table[b]; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); P0=table[c]; dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(5); P0=table[d]; dula=1; dula=0; P0=0xf7; wela=1; wela=0; delay(5); P0=table[e]; dula=1; dula=0; P0=0xef; wela=1; wela=0; delay(5); P0=table[f]; dula=1; dula=0; P0=0xdf; wela=1; wela=0; delay(5); } /*-------------------------------- 函数功能:按键控制函数,通过按键来实现数据的输入, 及举矩阵键盘的扫描函数 ---------------------------------*/ void keyscan() { { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=0; wei++; break; case 0xde: key=1; wei++; break; case 0xbe: key=2; wei++; break; case 0x7e: key=3; wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: key=4; wei++; break; case 0xdd: key=5; wei++; break; case 0xbd: key=6; wei++; break; case 0x7d: key=7; wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: key=8; wei++; break; case 0xdb: key=9; wei++; break; case 0xbb: qingling=1; //key=10; //wei++; break; case 0x7b: dengyu=1; //key=11; //wei++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: jia=1; //key=12; // wei++; break; case 0xd7: jian=1; break; case 0xb7: cheng=1; //乘运算 break; case 0x77: chu=1; //除运算 break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; } } } } /*----------------------------------- 函数功能:显示函数 控制数码管希纳是的位数,以及运算过程中按键的命令 ------------------------------------*/ void display0() { if(key!=20) { switch(wei) { case 1: a0=key; b0=16; c0=16; d0=16; e0=16; f0=16; break; case 2: b0=key; c0=16; d0=16; e0=16; f0=16; break; case 3: c0=key; d0=16; e0=16; f0=16; break; case 4: d0=key; e0=16; f0=16; break; case 5: e0=key; f0=16; break; case 6: f0=key; //wei=0; break; } key=20; } display(a0,b0,c0,d0,e0,f0);//调用起初定义的数码管显示函数 if(a0!=16) s5=a0; if(b0!=16) s4=b0; if(c0!=16) s3=c0; if(d0!=16) s2=d0; if(e0!=16) s1=e0; if(f0!=16) s0=f0; } /*------------------------------------- 函数功能:主函数 --------------------------------------*/ void main() { uchar gongneng,yunsuan; while(1) { keyscan(); gongneng=jia|jian|cheng|chu|dengyu|qingling;//判断执行的功能键,加减乘除 if(gongneng==0) { display0(); //调用功能显示函数 } /*------------------------------ 下面的代码是一些运算的处理,读者可 以自行理解 ------------------------------*/ else { yunsuan=jia|jian|cheng|chu; if(yunsuan) { a0=16; b0=16; c0=16; d0=16; e0=16; f0=16; //wei=0; if(jia) {jia=0; jia0=1;jian0=0;cheng0=0;chu0=0;} if(jian) {jian=0;jia0=0;jian0=1;cheng0=0;chu0=0;} if(cheng) {cheng=0;jia0=0;jian0=0;cheng0=1;chu0=0;} if(chu) {chu=0; jia0=0;jian0=0;cheng0=0;chu0=1;} switch(wei) { case 6: qian=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break; case 5: qian=s5*10000+s4*1000+s3*100+s2*10+s1;break; case 4: qian=s5*1000+s4*100+s3*10+s2;break; case 3: qian=s5*100+s4*10+s3;break; case 2: qian=s5*10+s4;break; case 1: qian=s5;break; } wei=0; s0=0;s1=0;s2=0;s3=0;s4=0;s5=0; display(a0,b0,c0,d0,e0,f0); //P1=0x55; } if(dengyu)//等于键 { dengyu=0; //display(16,16,16,16,16,16); switch(wei) { case 6: hou=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break; case 5: hou=s5*10000+s4*1000+s3*100+s2*10+s1;break; case 4: hou=s5*1000+s4*100+s3*10+s2;break; case 3: hou=s5*100+s4*10+s3;break; case 2: hou=s5*10+s4;break; case 1: hou=s5;break; } wei=0; s0=0;s1=0;s2=0;s3=0;s4=0;s5=0; if(jia0) {jia0=0; hou=qian+hou;} if(jian0) {jian0=0; hou=qian-hou;} if(cheng0) {cheng0=0; hou=qian*hou;} if(chu0) {chu0=0; hou=qian/hou;} if(hou


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3