注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小明砸乱弹琴

一个工程师的日常

 
 
 

日志

 
 
关于我

喜欢哲学、几何学、心理学、物理学、音乐、简单的文字及一切有趣的事物。热爱幻想,追求思想和学术自由,热衷简单平凡的生活和发现美好的事物。

网易考拉推荐
 
 

单片机设计的带余数的简易计算器  

2011-05-04 07:38:43|  分类: 单片微机 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

原理图:

单片机设计的带余数的简易计算器 - 赵明 - Alexander
单片机设计的带余数的简易计算器 - 赵明 - Alexander
 
单片机设计的带余数的简易计算器 - 赵明 - Alexander
 


程序设计:

#include<reg52.h>

        #include <intrins.h>

              #include <math.h>

          #define uchar unsigned char

              #define uint  unsigned int

 

sbit BEEP = P3^6;                  //蜂鸣器驱动线

 unsigned char code disp_code[]={

              0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

              0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//数码管显示

 

uchar  key;    //键盘值

uchar num;      //扫描位数

int temp1=0;   //结果整数部分

uint temp2=0;  //结果余数部分

int m=0;    //

uchar ss[8];   //

uchar flag;       //运算标志位

bit c_flag=0;  //辅助标志位

unsigned char code key_code[]={

              0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,

              0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 }; //键盘编码

 

unsigned char code num_code[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //显示位数

/**********************************************************

 

  延时子函数

 

**********************************************************/

void delayms(uint ms)

{

   uchar t;

   while(ms--)

   {

     for(t = 0; t < 120; t++);

   }

}

 

/**********************************************************

 

  x*0.14MS 延时子函数

 

**********************************************************/

void delay0(uchar x)   

{

   uchar i;

   while(x--)

   {

     for (i = 0; i<13; i++);

   }

}

/**********************************************************

 

  蜂鸣器驱动子函数

 

**********************************************************/

void beep()

{

  uchar i;

  for (i=0;i<180;i++)

  {

    delay0(5);

    BEEP=!BEEP;       //BEEP取反

  }

   BEEP=1;            //关闭蜂鸣器

   delayms(250);      //延时    

}

 

 

 

/**********************************************************

 

键盘扫描子函数

 

**********************************************************/

uchar  keyscan()

{

   uchar  scan1,scan2,keycode,j;

 

   P1=0xf0;

   scan1=P1;

   if((scan1&0xf0)!=0xf0)           //判键是否按下

   {

     delayms(10);                   //延时30ms

     scan1=P1;

     if((scan1&0xf0)!=0xf0)         //二次判键是否按下

     {

        P1=0x0f;

        scan2=P1;

        keycode=scan1|scan2;         //组合成键编码

 

        for(j=0;j<=15;j++)

        {

           if(keycode== key_code[j])  //查表得键值

           {

              key=j;

                      

              return(key);

           }

        }

     }

   }

   else  P1=0xff;

 

   return (16);

}

/***************************************************** 

 

显示数据子程序

 

********************************************************/

  void display(int xx,uint yy)

  {  uchar   tt=0;

        uint x1;

        uint y1=yy;

               while(yy!=0)             //显示余数

         {ss[tt]=yy%10;

           yy=yy/10;

           tt++ ;

              num=tt;

         }

         if(y1!=0)                        //显示——

           {ss[tt]=16;

             tt++;

                ss[tt]=16;

             tt++;

      

                }

     x1=abs(xx);                 //显示整数

           while(x1!=0)

         {ss[tt]=x1%10;

           x1=x1/10;

           tt++ ;

              num=tt;

         }

         if(xx<0)                          //显示符号

        { ss[tt]=16;

             tt++;

              num=tt;}

        

      

 

 

           

  

         for(tt=0;tt<num;tt++)

       {

           P0=disp_code[ss[tt]];

         delayms(5);  

               if(P2==num_code[num-1])

               P2=      0x7f;

       else P2=_cror_(P2,1);

        

      

       }     

        

 

  }

 

/**********************************************************

 

  判键是否按下子函数

 

**********************************************************/

void  keydown()

{       

   uchar tt=0;

   P1=0xf0;

   if((P1&0xf0)!=0xf0)

   {

     keyscan();

         beep();

         if(key>9&&c_flag==0)

   {switch(key)

        {case 10:flag=1;temp1=m;c_flag=1;m=0;break;

         case 11:flag=2;temp1=m;c_flag=1;m=0;break;

         case 12:flag=3;temp1=m;c_flag=1;m=0;break;

         case 13:flag=4;temp1=m;c_flag=1;m=0;break;

         case 14:m=-m;break;

         case 15:break;

          }

    }

       if(key==14&&c_flag==1)

           m=-m;

       if(key<=9)

       {if(m>=0) m=m*10+key;

         if(m<0) m=m*10-key; }

       if(key<=9&&flag==5)

       {

       flag=0;

       c_flag=0;

       temp1=temp2=0;

        } 

 

        

        }

   

         if(key==15)

         {switch(flag)

        {case 1:temp1=temp1+m;break;

         case 2:temp1=temp1-m;break;

         case 3:temp1=temp1*m;break;

         case 4:temp2=abs(temp1)%m;temp1=temp1/m;break;

         default:;

         }

         flag=5;

         m=0;

         }

        

 

}

 

 

 

void main()

{

     P0 = 0xc0;

     P2 = 0x7f;            //数码管显示"0"

     P1 = 0xff;

        while(1)

   {

     keydown();

        if(flag==5)

        display(temp1,temp2);

        else display(m,0);

 

   }

}

实物照片:

单片机设计的带余数的简易计算器 - 赵明 - Alexander
  评论这张
 
阅读(909)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017