智能计算器-数码管.zip

  • s1_258059
    了解作者
  • 669.1KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-27 04:56
    上传日期
基于51单片机的智能计算器-数码管,用数码管显示的计算机功能
智能计算器-数码管.zip
  • 智能计算器-数码管
  • 计算器-数码管.hex
    6.5KB
  • 计算器-数码管.plg
    774B
  • 计算器-数码管
    11.6KB
  • 计算器-数码管_uvproj.bak
    0B
  • 计算器-数码管.LST
    747B
  • 计算器-数码管.uvproj
    13KB
  • 计算器-数码管.lnp
    58B
  • G{S5~L57V%R43LX6)_WA[B3.jpg
    648.5KB
  • 计算器-数码管.c
    4.7KB
  • 计算器-数码管.uvopt
    54KB
  • 计算器-数码管.OBJ
    14.8KB
  • 计算器-数码管.M51
    16KB
内容介绍
#include<reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit a=P2^2; sbit b=P2^3; sbit c=P2^4; uint8 smg[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; uint8 sum[8]; uint8 m,button; uint8 fuhao=0,clear=0,equal=0; uint8 flag=0;//总符号标志位 uint16 qian=0,hou=0; long dat=0; uint8 jia=0,jian=0,cheng=0,chu=0; void delay(uint16 i) //10ms { uint8 j,k; for(;i>0;i--) for(j=38;j>0;j--) for(k=130;k>0;k--); } void delay1(uint8 i) //1.3ms { uint8 j,k; for(;i>0;i--) for(j=10;j>0;j--) for(k=130;k>0;k--); } void keyscan() { uint8 value,h,l; P1=0x0f; h=P1&0x0f; if(h!=0x0f) { delay(1); if(h!=0x0f) { l=P1|0xf0; P1=l; l=P1&0xf0; h=P1&0x0f; value=h+l; button=1; //有按键按下 delay(50); //如果不加这条语句的话,其按键按下一下会显示多个相同数字 switch(value) { case 0xee: m=0;break; case 0xde: m=1;break; case 0xbe: m=2;break; case 0x7e: m=3;break; case 0xed: m=4;break; case 0xdd: m=5;break; case 0xbd: m=6;break; case 0x7d: m=7;break; case 0xeb: m=8;break; case 0xdb: m=9;break; case 0xbb: clear=1;break; //清零 s11 case 0x7b: equal=1;break; //等于 s12 case 0xe7: fuhao=1;break; //加 s13 case 0xd7: fuhao=2;break; //减 s14 case 0xb7: fuhao=3;break; //乘 s15 case 0x77: fuhao=4;break; //除 s16 default : break; } } } } void datapros() { uint8 i; if(button==1&&flag==0) { qian=qian*10+m; for(i=7;i>0;i--) { sum[i]=sum[i-1]; } sum[0]=smg[m]; button=0; m=0; } if(button==1&&flag==1) { hou=hou*10+m; for(i=7;i>0;i--) { sum[i]=sum[i-1]; } sum[0]=smg[m]; button=0; m=0; } if(fuhao==1) //按下加号 如果按下加号后数码管熄灭,等待按下加数 { flag=1; fuhao=0; sum[0]=0; sum[1]=0; sum[2]=0; sum[3]=0; sum[4]=0; sum[5]=0; sum[6]=0; sum[7]=0; jia=1; } else if(fuhao==2) // 按下减号 如果按下减号后数码管熄灭,等待按下减数 { flag=1; fuhao=0; sum[0]=0; sum[1]=0; sum[2]=0; sum[3]=0; sum[4]=0; sum[5]=0; sum[6]=0; sum[7]=0; jian=1; } else if(fuhao==3) // 按下乘号 如果按下乘号后数码管熄灭,等待按下乘数 { flag=1; fuhao=0; sum[0]=0; sum[1]=0; sum[2]=0; sum[3]=0; sum[4]=0; sum[5]=0; sum[6]=0; sum[7]=0; cheng=1; } else if(fuhao==4) // 按下除号 如果按下除号后数码管熄灭,等待按下除数 { flag=1; fuhao=0; sum[0]=0; sum[1]=0; sum[2]=0; sum[3]=0; sum[4]=0; sum[5]=0; sum[6]=0; sum[7]=0; chu=1; } if(equal==1) //按下等于号 { if(jia==1) //加法运算 { flag=0; equal=0; jia=0; dat=qian+hou; hou=0; qian=0; m=0; sum[0]=smg[dat%10000%1000%100/10]; sum[1]=smg[dat%10000%1000/100]; sum[2]=smg[dat%10000/1000]; sum[3]=smg[dat/10000]; sum[4]=0x00; sum[5]=0x00; sum[6]=0x00; sum[7]=0x00; } if(jian==1) //减法运算 { flag=0; equal=0; jian=0; if(qian>=hou) dat=qian-hou; else dat=hou-qian; hou=0; qian=0; m=0; sum[0]=smg[dat%10000%1000%100/10]; sum[1]=smg[dat%10000%1000/100]; sum[2]=smg[dat%10000/1000]; sum[3]=smg[dat/10000]; sum[4]=0x00; sum[5]=0x00; sum[6]=0x00; sum[7]=0x00; } if(cheng==1) //乘法运算 { flag=0; equal=0; cheng=0; dat=qian*hou; // if(dat>=100000) dat=0; hou=0; qian=0; m=0; sum[0]=smg[dat%100000%10000%1000/100]; sum[1]=smg[dat%100000%10000/1000]; sum[2]=smg[dat%100000/10000]; sum[3]=smg[dat/100000]; sum[4]=0x00; sum[5]=0x00; sum[6]=0x00; sum[7]=0x00; } if(chu==1) //除法运算 { flag=0; equal=0; chu=0; dat=qian/hou; hou=0; qian=0; m=0; sum[0]=smg[dat%1000%100%10]; sum[1]=smg[dat%1000%100/10]; sum[2]=smg[dat%1000/100]; sum[3]=smg[dat/1000]; sum[4]=0x00; sum[5]=0x00; sum[6]=0x00; sum[7]=0x00; } } if(clear==1) //清零 { clear=0; qian=0; hou=0; dat=0; sum[0]=0x3f; sum[1]=0; sum[2]=0; sum[3]=0; sum[4]=0; sum[5]=0; sum[6]=0; sum[7]=0; } } void display() //按键使数字向左移动 { uint8 i; for(i=0;i<8;i++) { switch(i) { case 0: a=1,b=1,c=1;break; case 1: a=0,b=1,c=1;break; case 2: a=1,b=0,c=1;break; case 3: a=0,b=0,c=1;break; case 4: a=1,b=1,c=0;break; case 5: a=0,b=1,c=0;break; case 6: a=1,b=0,c=0;break; case 7: a=0,b=0,c=0;break; } P0=sum[i];; delay1(1); P0=0x00; } } void main() { button=0; while(1) { keyscan(); datapros(); display(); } }
评论
    相关推荐
    • 51单片机
      51单片机
    • 51单片机教程
      来自平凡单片机网站(word)
    • 51单片机程序
      LED流水灯实验是能较好的引导单片机爱好者入门学习,该程序实现了LED间隔10ms循环点亮
    • 51单片机程序
      包含51单片机的基础程序,以及综合程序。供初学者学习,及编写一定模块程序
    • 51单片机万年历
      该资源为51单片机资源,采用DS1302为时钟源,用LCD1602进行显示,压缩包里面还有protuse的仿真图,从程序到仿真齐全。
    • 51单片机WIFI
      利用wifi对51单片机进行控制,内附原理图及PCB板制作
    • 51单片机相关
      哈哈很经典的单片机开发仿真,对于学单片机不想花很多钱的同学来说是一个不错的选择。
    • 51单片机学习
      适合想学习51单片机的新人,能够快速学习,里面有多种实例可以方便学习。另外有很多视频,如果想要的话可以发邮件到:www.gaoju1024@qq.com
    • 51单片机教程
      51单片机的初级教程,里面包含单片机的各个模块的详细介绍,以及各个模块的验证程序,能够学会单片机的操作
    • 单片机课件 51单片机
      课件 51单片机 C程序设计