单片机做的8位计算器

发布者:technology1最新更新时间:2015-05-21 来源: 51hei关键字:单片机  8位计算器 手机看文章 扫描二维码
随时随地手机看文章
局部图:




 



效果图


完整的源码下载地址 http://www.51hei.com/f/jsjzz.rar[page]
CODE:

#include
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar LA[8];
uchar code wetable[]={
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe};
uchar code dutable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//段选0~9
long int num1,num2,num;
uchar temp;//按键需要的中间变量
uchar flag;//标记是否为数字键
uchar ch;//保存当前按下的符号标记按键的次数,按下“+-*/”
uchar date,count;//date保存按键得到的数字,count标记是第几个数字
uchar p;//p为指针,为了消除数字之前多余的0
uchar mark;
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
 {
  for(y=0;y<=112;y++)
  {
  }
 }
}
void init()
{
 count=0;
 flag=0;
 mark=0;
 num1=0;
 num2=0;
 num=0;
}
uchar keyscan()//判断按下那个键
{
 P1=0xfe;
 temp=P1;
 temp=temp&0xf0;
 if(temp!=0xf0)
 {
  delay(5);//消除抖动
  temp=P1;
  temp=temp&0xf0;
  while(temp!=0xf0)//证明有键按下,while语句是为了让键盘松开
  {
   temp=P1;
   switch(temp)
   {
    case 0xee:flag=1;date=7;
     break;
    case 0xde:flag=1;date=8;
     break;
    case 0xbe:flag=1;date=9;
     break;
    case 0x7e:flag=2;ch='/';
     break;
   }
   if(temp!=0xf0)
   {
    delay(5);
    temp=P1;
    temp=temp&0xf0;
    while(temp!=0xf0)//等待按键松开
    { 
     temp=P1;
     temp=temp&0xf0;
    }
   } 
  }
 } 
 P1=0xfd;
 temp=P1;
 temp=temp&0xf0;
 if(temp!=0xf0)
 {
  delay(5);//消除抖动
  temp=P1;
  temp=temp&0xf0;
  while(temp!=0xf0)//证明有键按下,while语句是为了让键盘松开
  {
   temp=P1;
   switch(temp)
   {
    case 0xed:flag=1;date=4;
     break;
    case 0xdd:flag=1;date=5;
     break;
    case 0xbd:flag=1;date=6;
     break;
    case 0x7d:flag=2;ch='*';
     break;
   }
   if(temp!=0xf0)
   {
    delay(5);
    temp=P1;
    temp=temp&0xf0;
    while(temp!=0xf0)//等待按键松开
    { 
     temp=P1;
     temp=temp&0xf0;
    }
   } 
  }
 } 
 P1=0xfb;
 temp=P1;
 temp=temp&0xf0;
 if(temp!=0xf0)
 {
  delay(5);//消除抖动
  temp=P1;
  temp=temp&0xf0;
  while(temp!=0xf0)//证明有键按下,while语句是为了让键盘松开
  {
   temp=P1;
   switch(temp)
   {
    case 0xeb:flag=1;date=1;
     break;
    case 0xdb:flag=1;date=2;
     break;
    case 0xbb:flag=1;date=3;
     break;
    case 0x7b:flag=2;ch='-';
     break;
   }
   if(temp!=0xf0)
   {
    delay(5);
    temp=P1;
    temp=temp&0xf0;
    while(temp!=0xf0)//等待按键松开
    { 
     temp=P1;
     temp=temp&0xf0;
    }
   } 
  }
 }
 
 P1=0xf7;
 temp=P1;
 temp=temp&0xf0;
 if(temp!=0xf0)
 {
  delay(5);//消除抖动
  temp=P1;
  temp=temp&0xf0;
  while(temp!=0xf0)//证明有键按下,while语句是为了让键盘松开
  {
   temp=P1;
   switch(temp)
   {
    case 0xe7:flag=4;ch='C';
     break;
    case 0xd7:flag=1;date=0;
     break;
    case 0xb7:flag=3;//ch='=';
     break;
    case 0x77:flag=2;ch='+';
     break;
   }
   if(temp!=0xf0)
   {
    delay(5);
    temp=P1;
    temp=temp&0xf0;
    while(temp!=0xf0)//等待按键松开
    { 
     temp=P1;
     temp=temp&0xf0;
    }
   } 
  }
 }[page]
 return date;  
}
void display(long int num)
{
 char i;
 LA[7]=num%100000000/10000000;
 LA[6]=num%10000000/1000000;
 LA[5]=num%1000000/100000;
 LA[4]=num%100000/10000;
 LA[3]=num%10000/1000;
 LA[2]=num%1000/100;
 LA[1]=num%100/10;
 LA[0]=num%10;
 if(num==0)
 {
  wela=1;
  P0=wetable[0];
  wela=0;
  dula=1;
  P0=dutable[0];
  dula=0;
  P0=0xff;
  delay(2);
 }
 else
 {
  for(i=7;i>=0;i--)
  {
   if(LA[i]!=0)
   {
    p=i;
    break;
   }
  }
  for(i=0;i<=p;i++)
  {
   wela=1;
   P0=wetable[i];
   wela=0;
 
   dula=1;
   P0=dutable[LA[i]];
   dula=0;
   P0=0xff;//消影
   delay(2);
  }
 }
}
void calc(uchar date)
{
 if(flag==1)
 {
  if(count==0)//得到的第一个完整数字
  {
   num1=num1*10+date;
   flag=0;
   num=num1;
  }
  if(count==1)//得到的第二个完整数字
  {
   num2=num2*10+date;
   flag=0;
   num=num2; 
  }
 }
 if(count>1&&mark==1)
 {
  num1=num;
  flag=0;
  count=1;//讲num2置为第二个数
 }
 display(num);
 if(flag==2)//如果得到符号位
 {
  count++;
  flag=0;
 }
 if(flag==3)
 {
  switch(ch)
  {
   case '+':num=num1+num2;
    break;
   case '-':num=num1-num2;
    break;
   case '*':num=num1*num2;
    break;
   case '/':num=num1/num2;
    break;
  }
  num1=0;
  num2=0;
  flag=0;
  mark=1;//here is a bug
 }
 display(num);
 if(flag==4)
 {
  num1=0;
  num2=0;
  num=0;
  count=0;
  flag=0;
  mark=0;
 }
}
void main()
{
 init();
 while(1)
 {
  calc(keyscan());
 } 
}

关键字:单片机  8位计算器 引用地址:单片机做的8位计算器

上一篇:单片机的定时器中断0
下一篇:DS1302控制代码

推荐阅读最新更新时间:2024-03-16 14:03

基于51单片机设计的TFT液晶显示
   0 引言   51单片机作为一种常见的通用单片机, 虽然其内部资源, 处理速度等都无法与新型高速单片机相提并论, 但其低廉的价格, 极低的入门难度以及适用于简单场合应用等特点, 依然是开发者的常用选择之一。   用51单片机驱动液晶模块通常都使用1602和12864等极为简单的液晶模块, 这里介绍用51单片机驱动QVGA分辨率的TFT液晶模块, 以实现彩色和更为复杂的内容显示的方法。同时, 本文还将使用DS1302芯片和DS18B20芯片来实现在液晶屏上显示实时时钟和温度。    1 硬件设计   本系统硬件电路的设计主要包括单片机最小系统电路, TFT液晶显示电路, 时钟电路, 设置电路以及温度采集电路。其系统工作
[单片机]
基于51<font color='red'>单片机</font>设计的TFT液晶显示
烧录单片机的步骤
  1,把单片机当做一个 ROM 芯片,早期的单片机都是如此。将单片机放在通用编程上编程时,就像给28C256这样的ROM中写程序的过程一样。只是不同的单片机使用的端口,编程用的时序不一样。 把单片机当做一个ROM 芯片 ,早期的单片机都是如此。将单片机放在通用编程上编程时,就像给28C256这样的ROM中写程序的过程一样。只是不同的单片机使用的端口,编程用的时序不一样。   2,像AT89S52或AVR单片机一样,在单片机上有 SPI 接口,这时用专用的下载线将程序烧写到单片机中。这时不同的是,单片机的CPU除了执行单片机本身的指令之外,还能执行对ROM进行操作的特殊指令,如ROM擦除、烧写和校验指令。在编程ROM时,下载线先通
[单片机]
Power Architecture微控制器 工业市场【飞思卡尔】
2011年3月2日,德州奥斯汀讯-飞思卡尔半导体日前宣布在其广泛的工业微控制器(MCU)产品组合中增加Power Architecture® MCU新成员。 通过推出该产品,飞思卡尔将其Power Architecture技术在汽车和网络基础设施市场获得的成功经验进一步扩展到广泛的工业应用。 在广阔的多元化工业市场,对处理性能、安全和一体化的要求越来越高。 飞思卡尔PX系列MCU基于飞思卡尔e200 Power Architecture内核,旨在满足最复杂的工业控制应用的需求,包括引擎控制、发电、临床医疗、航空航天和国防、引擎驱动、可再生能源、机器人等。 飞思卡尔高级副总裁兼微控制器解决方案部总经理Reza Kaz
[单片机]
一款基于8098单片机的SPWM变频调速系统设计
目前,高性能的交流调速系统的研究和开发引起各国学者的高度重视,并得到越来越深入的研究。而所选用微处理器、功率器件及产生PWM波的方法是影响交流调整系统性能好坏的直接因素。本文研究了一种以 8098 单片机 为控制器、以智能功率模块IPM为开关器件的变频调速系统,此控制系统硬件电路的标准化程度高,制作成本低,且不受器件温度漂移的影响:其控制软件能够进行逻辑判断和复杂运算,可以实现不同于一般线性调节的最优化、自适应、非线性、智能化等控制规律,而且更改起来灵活方便。 正弦波脉宽调制(SPWM)技术 1、SPWM控制技术原理 由于PWM变换器具有功率因数高、可同时实现变频变压及抵制谐波的特点,因此在交流传动及其他能量变换系统中得到广泛
[电源管理]
一款基于8098<font color='red'>单片机</font>的SPWM变频调速系统设计
利用单片机系统可靠性设计
单论单片机硬件系统设计解决方案,一般从三个方面分析:优选设计方案、增加冗余和容错率、采用硬件抗干扰。本文详细的介绍了优化这三个方面对单片硬件可靠性带来的好处。 1、选优设计 在系统硬件设计和加工时,应该选用质量好的接插件,设计好工艺结构;选用合格的元器件,进行严格的测试、筛选和老化;设计时技术参数(如负载)要留有一定的余量或降额使用元器件;提高印制板和组装的质量。 2、采用硬件抗干扰措施 来自供电系统以及通过导线传输、电磁耦合等产生的电磁干扰信号,是单片机系统工作不稳定的重要因素,在系统硬件设计时必须采取有效的干扰抑制措施。单片机应用系统中还常使用系统监视电路检测系统发生的错误或故障,自动报警或使系统自动恢
[单片机]
利用<font color='red'>单片机</font>系统可靠性设计
基于AVR单片机多任务嵌入式Internet系统设计
1 引言 目前,嵌入式系统已经广泛渗透到人们的工作、生活中。从家用电器、信息终端、手持通信设备到仪器仪表、制造工业、过程控制等领域,嵌入式设备已随处可见。另一方面,近几年来Internet技术的飞速发展给嵌入式应用带来了新的契机,在未来嵌入式系统中应用Internet技术具有很大的优势。 目前嵌入式Internet技术的实现主要有下面三种方式 : 第一种方式是EMIT技术,采用支持TCP/IP协议的高性能服务器作为网关(emGateway), 嵌入式设备通过RS-232、RS-485或者CAN总线等与网关服务器连接,间接通过服务器网关连接Internet。经过多年的发展EMIT技术已经在工业设备的网络化中得到了广泛
[应用]
基于AT89C51单片机的恒温控制系统设计
一.系统概述 系统使用的模块有AT89C51单片机+LCD1602显示+DS18B20测温+蜂鸣器报警+按键+风扇降温+小灯。 系统内使用AT89C51单片机作为主控,使用LCD1602显示采集到的温度数据和温度阈值,通过按键可以设定阈值,当检测到环境温度大于设定阈值时蜂鸣器就会进行报警,并且会通过风扇进行降温,当检测到环境温度低于设定阈值时加热小灯就会亮起。 二.仿真概述 1.LCD1602显示检测到的温度和温度阈值。 2.通过DS18B20温度传感器检测环境温度。 3.当温度低于阈值则通过加热小灯进行加热。 4.当温度高于阈值则通过蜂鸣器报警,并利用风扇进行降温。 三.程序设计 使用Keil 51进行
[单片机]
基于AT89C51<font color='red'>单片机</font>的恒温控制系统设计
意法推出STM32WBA5系列微控制器:强化物联网连接与安全
意法半导体(ST)近日宣布推出全新的STM32WBA5系列微控制器,该系列不仅继承了STM32家族在性能、能效及易用性方面的优良传统,更在无线连接与安全性方面进行了显著的提升,以满足日益增长的物联网设备需求。 STM32WBA5系列微控制器内置了Arm Cortex-M33内核,运行频率高达100MHz,配备了丰富的外设接口和高达1MB的闪存、128kB的静态RAM(SRAM)。此外,该系列还支持Arm TrustZone安全隔离架构,为物联网设备提供了硬件级别的安全保障。 在无线连接方面,STM32WBA5系列整合了蓝牙5.4低功耗(BLE)、Zigbee、Thread和Matter等多种网络协议,实现了与各类物联网设备
[物联网]
意法推出STM32WBA5系列<font color='red'>微控制器</font>:强化物联网连接与安全
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved