用单片机做一个计算器

发布者:泉地水无痕最新更新时间:2016-11-24 来源: eefocus关键字:单片机  计算器 手机看文章 扫描二维码
随时随地手机看文章

硬件电路

用单片机做一个计算器 - 汪政伟 - 我的博客

程序

#include
#define  DIN P1_0
#define  CLK P1_2
#define  LOAD P1_1
unsigned char key_h,key_l,key_code;
unsigned char ADS,i,j,m,n;
unsigned char n_bit=0;
unsigned char flag=0;
unsigned char key_num[16]={7,8,9,'/',4,5,6,'*',1,2,3,'-','c',0,'=','+'};
unsigned char data1[6]={0};
unsigned char data2[6]={0};
unsigned int result;

void delay(unsigned int n)
{
 while(n--);
}

void send(unsigned char addr,unsigned char dat)
{
 LOAD=0;
 i=0;
 while(i<16)
 {
  if(i<8) ADS=addr;
  else
   ADS=dat;
  for(j=8;j>=1;j--)
  {
   DIN=ADS&0x80;
   ADS<<=1;
   CLK=1;
   CLK=0;
  }
  i+=8;
 }
 LOAD=1;
}


void clear()
{
 for(m=1;m<=5;m++)
  send(m,0xff);
 send(0x06,0);
 n_bit=6;
 
}


void calc()
{
 unsigned int temp1;
 unsigned int tmep2;
 unsigned char temp;
 temp1=data1[5]+data1[4]*10+data1[3]*100+data1[2]*1000+data1[1]*10000;
 tmep2=data2[5]+data2[4]*10+data2[3]*100+data2[2]*1000+data2[1]*10000;
 switch(flag)
 {
 case 1: result=temp1+tmep2; break;
 case 2: result=temp1-tmep2; break;
 case 3: result=temp1*tmep2; break;
 case 4: result=temp1/tmep2; break;
 }
 clear();
 for(n=6;n>1;n--)
 {
  temp=(unsigned char)result%10;
  if(temp) send(n,temp);
  result/=10;
  data2[n-1]=data1[n-1]=0;
 }
 flag=0; 
 while((P2&0xf0)!=0xf0);
}

void keyScan()   //键盘扫描程序
{
 
 if((P2&0xf0)!=0xf0)
  delay(20);
 if((P2&0xf0)!=0xf0)
 { 
  key_h=P2&0xf0;
  P2=0xf0|0x01;
  if((P2&0xf0)==0xf0) key_l=0;
  P2=0xf0|0x02;
  if((P2&0xf0)==0xf0) key_l=1;
  P2=0xf0|0x04;
  if((P2&0xf0)==0xf0) key_l=2;
  P2=0xf0|0x08;
  if((P2&0xf0)==0xf0) key_l=3;
  P2=0xf0;   
  switch((~P2)&0xf0)
  {
  case 0x10: key_h=0x0; break;
  case 0x20: key_h=0x1; break;  
  case 0x40: key_h=0x2; break;
  case 0x80: key_h=0x3; break;
  }
  key_code=key_l*4+key_h; 
  switch(key_code)
   
  {
  case 3:  flag=4;n_bit=7;break; //+
  case 7:  flag=3;n_bit=7;break; //-
  case 11: flag=2;n_bit=7;break; //*
  case 15: flag=1;n_bit=7;break; /// 
  case 14: calc();n_bit=7;return; //=
  case 12: clear();break; //C
  default:
   if(n_bit>1)
   {
    if(n_bit==7)
    {
     clear();
    }
    send(n_bit--,key_num[key_code]);
    if(!flag)
     data1[n_bit]=key_num[key_code];
    else
     data2[n_bit]=key_num[key_code];
   }
   
  }
  while((P2&0xf0)!=0xf0);
 }
}

void main(void)
{
 P2=0xf0;
 
 send(0x0c,0x01);
 send(0x0b,0x05);
 send(0x0a,0xf5);
 send(0x09,0xff);
 
 // 
 //  send(0x01,0x8f);
 //  send(0x02,0x82);
 //  send(0x03,0x83);
 //  send(0x04,0x84);
 //  send(0x05,0x85);
 //  send(0x06,0x86);
 //  send(0x07,0x87);
 //  send(0x08,0x08);
 clear();
 n_bit=6;
 while(1)
 {
  keyScan();
 }
}


关键字:单片机  计算器 引用地址:用单片机做一个计算器

上一篇:DS18B20温度显示演示程序(6位数码管显示)
下一篇:C51按键识别,等待释放

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

单片机典型案例开发(二)
一、宿舍智能报警系统设计方案   摘要:该系统以凌阳公司的16位单片机SPCE061A作为主控制器,通过烟雾传感器与人体热释电红外传感器分别感应烟雾与人体红外信号,通过单片机做出报警动作。本系统设计主要是满足宿舍自动报警的需要,设计的目标是要实现语音报警、时间设定和显示、灯光报警并实现网络报警等功能。   1 设计方案   1.1 主控制器的选择   采用凌阳公司的16位单片机SPCE061A作为主控制器。由于SPCE061A内置有2 KB的SRAM和32 KB的内存FLASH,能满足本系统存储密码及各类数据的要求,且CPU时钟频率高达49.152 MHz,能保证响应的快速性,内置的语音模块更提高了系统人机界面的友好性。
[模拟电子]
<font color='red'>单片机</font>典型案例开发(二)
从零开始51单片机教程 —— 13 单片机逻辑运算类指令
对单片机的累加器A的逻辑操作 : CLR A ;将A中的值清0,单周期单字节指令,与MOV A,#00H效果相同。 CPL A ;将A中的值按位取反 RL A ;将A中的值逻辑左移 RLC A ;将A中的值加上进位位进行逻辑左移 RR A ;将A中的值进行逻辑右移 RRC A ;将A中的值加上进位位进行逻辑右移 SWAP A ;将A中的值高、低4位交换。 例:(A)=73H,则执行CPL A,这样进行: 73H化为二进制为01110011, 逐位取反即为 10001100,也就是8CH。 RL A是将(A)中的值的第7位送到第0位,第0位送1位,依次类推。 例:A中的值为68H,执行RL A。68H化为二
[单片机]
基于单片机系统采用DMA块传输方式实现高速数据采集
   摘 要: 介绍一种基于单片机系统设计的DMA硬件电路,以字块传输方式与高速A/D接口。结合在数字式磁通表设计中的应用给出其硬件软件设计方案实例。     关键词: 单片机系统 直接存储器存取(DMA)方式 高速A/D     PC机中外设与内存储器之间数据直接传输的DMA功能以其高效、高速、CPU资源占用少等特点已被广泛应用,这一功能通过安装在主板上的专用DMA控制器芯片或集成在外围控制芯片来实现。单片机的应用领域也常常需要有高速数据传输或数据采集,虽然近些年单片机速度有所提高,仍然无法应付类似单脉冲信号捕获、周期信号频谱分析等需要采用高速A/D的场合。对于速率在100ksps以上的数据采集或传输一般的中断查
[应用]
STM32F103C8T6单片机IAP升级
关于IAP升级的方法和原理,网上已经有很多资料了,这块就不再说了,现在就将bootloader和app配置方法整理如下: APP程序就是一个简单的LED闪烁。 APP设置为从FLASH中启动: STM32F103C8T6单片机flash有64K,前20K空间留给bootloader,从20K之后开始存放APP程序。所以IROM1开始地址设置为 0x8005000,大小为20K。如果APP程序比较大的话,可以修改这个大小值。 然后在程序开始位置设置重新映射复位向量表。让程序从0x8005000位置开始执行。 APP设置为从SRAM中启动: APP要从SRAM中运行,那么就要重新映射SRAM中的复位向量表。 由于在
[单片机]
STM32F103C8T6<font color='red'>单片机</font>IAP升级
8051单片机I/O引脚工作原理
一、P0端口的结构及工作原理 P0端口8位中的一位结构图见下图: 由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成。 下面,我们先就组成P0口的每个单元部份跟大家介绍一下: 先看输入缓冲器:在P0口中,有两个三态的缓冲器,在学数字电路时,我们已知道,三态门有三个状态,即在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态),大家看上图,上面一个是读锁存器的缓冲器,也就是说,要读取D锁存器输出端Q的数据,那就得使读锁
[单片机]
8051<font color='red'>单片机</font>I/O引脚工作原理
爱特梅尔推出全新AVR® 微控制器系列
  爱特梅尔公司(Atmel® Corporation)宣布推出专为满足具有CAN和LIN连接能力的先进电机控制应用对高精度脉宽调制(PWM)的需求而开发的全新AVR® 微控制器系列ATmega16M1、ATmega32M1和ATmega64M1,瞄准工业控制市场。新器件系列具有16、32和64KB闪存、通用IO引脚、模数转换器、模拟比较器、功率级控制器,以及8位和16位定时器,是需要CAN和LIN连接能力之工业控制应用的理想选择。   ATmega16M1、ATmega32M1和ATmega64M1基于高性能AVR 8位RISC架构,集成了复杂电机控制算法所有必须的基础功能。这些器件提供了独特的功能组合,能够通过合适的驱动器和
[工业控制]
有关STC单片机发热、复位的问题
最近有个项目,需要一个继电器,接收到低电平就动作,用的STC15W104、使用的市面上的开关电源5V/3A. 本来看似简单到底的一个东西,却花费了将近3天的时间搞定。 1.现象一 产品是1U机箱 内部一个ARM主板,需要定时硬重启一次。暂且叫STC控制板,控制板在不带载的情况下,触发正常,与程序很符合,但是带载后,第一次触发正常,第二次单片机就开始发烫,能到80多度,然后直接冒烟,这个现象100%会出现,控制板的继电器没有使用隔离。 解决办法: 在5V电源处并了一个1000UF的大电容。曾尝试并5.1V稳压管,发现不顶用。 2.现象二 板子会误动作,尤其是周围有人,或者是工作一段时间,或者是开关963电
[单片机]
单片机与CPCI总线的脉冲信号检测系统的工作方法简述
引言 在工业控制领域,通常有大量的脉冲信号用于控制其他设备或部件的开关或者工作状态切换。这些脉冲信号除了常规计算机系统采用的+5 V接口电平外,还有+12 V、+30 V,乃至更高幅度的接口电平,通常为功率型电流驱动信号。本文提出了一种两级测试系统的设计思路,给出了在较宽的范围内兼容不同接口电平的脉冲信号检测系统的设计方案,采用标准CPCI总线接口设计,具有良好的兼容性和扩展性,适用于产品功能测试或系统集成测试。 1 测试系统架构 如图1所示,测试系统采用二级(主控机、下位机)结构设计,由主控计算机(即主控机)、测试客户机(即下位机)、局域网、电缆及运行于各设备中的测试软件共同构成。主控计算机属主控机一级,控制测试客户机,测
[单片机]
<font color='red'>单片机</font>与CPCI总线的脉冲信号检测系统的工作方法简述
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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