学习日志

简易计算器与计时器设计

今日学习任务:

编写,设计一个简易计算器

 

今日任务完成情况:不仅完成计算器,秒表和始终都完成了

代码如下

jisuanqi

 

#include <reg51.h>


int key = 0, num1 = 0, num2 = 0,comput_flag = 0,count_flag=0,i=0,flag=0;

//共阴数码管表
unsigned char code table[] = {0x3f, 0x06 , 
        0x5b , 0x4f , 0x66 , 0x6d, 0x7d , 
        0x07 , 0x7f  , 0x6f };


/*void delay()
{
    int x = 50, i;

    while (x--)
    {
        for (i = 0; i < 15; i++);
    }
}*/ 

void KeyScan()
{
    P1 = 0xf0;     //判断哪一列被按下
    if(P1 != 0xf0)
    {
        switch(P1)
        {
            case 0xe0:    key = 0;    break;
            case 0xd0:    key = 1;    break;
            case 0xb0:    key = 2;    break;
            case 0x70:    key = 3;    break;
        }
        P1 = 0x0f;//判断哪一行被按下
        switch(P1)
        {
            case 0x0e:    key += 1;    break;
            case 0x0d:    key += 5;    break;
            case 0x0b:    key += 9;    break;
            case 0x07:    key += 13;    break;
        }
        while (P1 != 0x0f);
    }
}

void display(int n)
{
        if(flag%11==0)
        {
        P2 = 0xfe;
        P0 = table[n / 100000];
        //delay();
        }
        if(flag%13==0)
        {
        P2 = ~(1 << 1);
        P0 = table[(n / 10000)%10];
        //delay();
        }
        if(flag%12==0)
        {
        P2 = ~(1 << 2);
        P0 = table[(n / 1000)%10];
        //delay();
        }
        if(flag%8==0)
        {
        P2 = ~(1 << 3);
        P0 = table[(n / 100)%10];
        //delay();
        }
        if(flag%9==0)
        {
        P2 = ~(1 << 4);
        P0 = table[(n / 10)%10];
        //delay();
        }
        if(flag%10==0)
        {
        P2 = ~(1 << 5);
        P0 = table[(n / 1)%10];
       // delay();
        }    
}

void Switched()
{     
         switch(key)
        {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
                num1 = num1 * 10 + key;
                break;
            case 10:
                num1 = num1 * 10 + 0;
                break;
            case 11:  //+
                comput_flag = 1;
                break;
            case 12: 
                comput_flag = 2;
                break; //-
            case 13: 
                comput_flag = 3;
                break;//*
            case 14:
             comput_flag = 4;
                break; // /
            case 15:
            count_flag=1;//=
                break;
                case 16:comput_flag=16;break;
        }
}


void alg()
{
       if (1 == count_flag)
        {
             switch(i)
           {
           case 0:break;
           case 1:num1=num2+num1;break;
           case 2:num1=num2-num1;break;
           case 3:num1=num2*num1;break;
           case 4:num1=num2/num1;break;
            }
             count_flag=0;
        }
        switch(comput_flag)
        {
           case 0:break;
           case 1:
           case 2:
           case 3:
           case 4:num2=num1,num1=0,i=comput_flag,comput_flag=0;break;
           case 16:num2=0,num1=0,comput_flag=0,i=0,comput_flag=0;break;
        }
}

int main()
{
   EA=1;
   ET0=1;

   TMOD=0X01;

   TH0=(65535-1000)/256;
   TL0=(65535-1000)%256;

   TR0=1;
    while (1)
    {
        key = 0;
        KeyScan();     //检测按键
        Switched();        //
        display(num1);
        alg();
    }
    return 0;
}
void time_0() interrupt 1
 {
       TH0=(65535-1000)/256;
       TL0=(65535-1000)%256;
       flag++;
 }

秒表

#include<reg51.h>

unsigned char code table[] = {0x3f, 0x06 , 
        0x5b , 0x4f , 0x66 , 0x6d, 0x7d , 
        0x07 , 0x7f  , 0x6f };
int num=0,miao=0,fen=0,flag=0,key=0,flag_1=1,disflag=0;
void KeyScan()
{
    P1 = 0xf0;     //判断哪一列被按下
    if(P1 != 0xf0)
    {
        switch(P1)
        {
            case 0xe0:    key = 0;    break;
            case 0xd0:    key = 1;    break;
            case 0xb0:    key = 2;    break;
            case 0x70:    key = 3;    break;
        }
        P1 = 0x0f;//判断哪一行被按下
        switch(P1)
        {
            case 0x0e:    key += 1;    break;
            case 0x0d:    key += 5;    break;
            case 0x0b:    key += 9;    break;
            case 0x07:    key += 13;    break;
        }
        while (P1 != 0x0f);
    }
}    

void display()
{
    if (flag%7==1)
    {
        P2 = ~(0x01);
        P0 = table[fen/10];
    }
    else if (flag%7==2)
    {
        P2 = ~((0x01)<<1);
        P0=table[fen%10];    
    }
    else if(flag%7==3)
    {
    P2 = ~((0x01)<<2);
    P0=table[miao/10];
    }
    else if(flag%7==4)
    {
    P2 = ~((0x01)<<3);
    P0=table[miao%10];
    }
    else if(flag%7==5)
    {
    P2 = ~((0x01)<<4);
    P0=table[num/10];
    }
    else if(flag%7==6)
    {
    P2 = ~((0x01)<<5);
    P0=table[num%10];
    }
}
 void KeySwitch()
 {
        switch(key)
        {
            case 1:
            TR0=~TR0;
            break;
            case 2:
            TR0=~TR0;
            flag=0;
            TR1=~TR1;
            disflag=0;
            break;
            case 3:
            num=0;
            miao=0;
            fen=0;
            disflag=0;
            break;
            case 4:
            break;
        }
 }
 void flagSwitch()
 {
      if(disflag==13)
   {
       num++;
      if(num>100)
       {
        num=0;
        miao++;
       }
      if(miao>59)
       {
         fen++;
         miao=0;
         num=0;
       }
      if(fen>59)
      {
         fen=0;
         miao=0;
         num=0;
      }
      disflag=0;
      flag=0;
   } 
 }

int main()
{
   EA=1;  //打开总中断
   ET0=1;        //     打开定时器中断
   TMOD=0x01;                    //用定时器0中断
   TH0=(65535-5000)/256;         //高八位
   TL0=(65535-5000)%256;        //低八位
   ET1=1;        //     打开定时器中断
   TMOD=0x10;                    //用定时器0中断
   TH1=(65535-5000)/256;         //高八位
   TL1=(65535-5000)%256;
   TR1=0;
   TR0=0;
          
   while(1)
   {
        key = 0;
        KeyScan();     //检测按键
        KeySwitch();
         flagSwitch();
        display();
        
   }    
   return 0;
}

void timer_0()interrupt 1
{
  TH0=(65535-4960)/256;
  TL0=(65535-4960)%256;
  flag++;
  disflag++;
}
 void timer_1()interrupt 3
{
  TH1=(65535-5000)/256;
  TL1=(65535-5000)%256;
  flag++;
}

时钟

#include<reg51.h>

unsigned char code table[] = {0x3f, 0x06 , 
        0x5b , 0x4f , 0x66 , 0x6d, 0x7d , 
        0x07 , 0x7f  , 0x6f };
int num=0,miao=0,fen=0,flag=0,key=0,flag_1=1,disflag=0;
void KeyScan()
{
    P1 = 0xf0;     //判断哪一列被按下
    if(P1 != 0xf0)
    {
        switch(P1)
        {
            case 0xe0:    key = 0;    break;
            case 0xd0:    key = 1;    break;
            case 0xb0:    key = 2;    break;
            case 0x70:    key = 3;    break;
        }
        P1 = 0x0f;//判断哪一行被按下
        switch(P1)
        {
            case 0x0e:    key += 1;    break;
            case 0x0d:    key += 5;    break;
            case 0x0b:    key += 9;    break;
            case 0x07:    key += 13;    break;
        }
        while (P1 != 0x0f);
    }
}    

void display()
{
    if (flag%7==1)
    {
        P2 = ~(0x01);
        P0 = table[num/10];
    }
    else if (flag%7==2)
    {
        P2 = ~((0x01)<<1);
        P0=table[num%10];    
    }
    else if(flag%7==3)
    {
    P2 = ~((0x01)<<2);
    P0=table[fen/10];
    }
    else if(flag%7==4)
    {
    P2 = ~((0x01)<<3);
    P0=table[fen%10];
    }
    else if(flag%7==5)
    {
    P2 = ~((0x01)<<4);
    P0=table[miao/10];
    }
    else if(flag%7==6)
    {
    P2 = ~((0x01)<<5);
    P0=table[miao%10];
    }
}
 void KeySwitch()
 {
        switch(key)
        {
            case 1:
            TR0=~TR0; //开始键
            break;
            case 2:     //暂停,暂停继续,清零继续
            TR0=~TR0;
            flag=0;
            TR1=~TR1;
            disflag=0;
            break;
            case 3:    //清零键
            num=0;
            miao=0;
            fen=0;
            disflag=0;
            flag=0;
            TR0=~TR0;
            TR1=~TR1;
            break;
            case 4:    //进入调时间,出调时间
            TR0=~TR0;
            TR1=~TR1;
           break; //调时
           case 5:
           num++;
           break;
           case 6: //调分
           fen++;
           break;
           case 7: //调秒
           miao++;
           break;
              
        }
 }
 void flagSwitch()
 {
      if(disflag==200)
   {
       miao++;
      if(miao>59)
       {
        fen++;
        miao=0;
       }
      if(fen>59)
       {
         num++;
         miao=0;
       }
      if(num>23)
      {
         fen=0;
         miao=0;
         num=0;
      }
      disflag=0;
      flag=0;
   } 
 }

int main()
{
   EA=1;  //打开总中断
   ET0=1;        //     打开定时器中断
   TMOD=0x01;                    //用定时器0中断
   TH0=(65535-50000)/256;         //高八位
   TL0=(65535-50000)%256;        //低八位
   ET1=1;        //     打开定时器中断
   TMOD=0x10;                    //用定时器0中断
   TH1=(65535-50000)/256;         //高八位
   TL1=(65535-50000)%256;
   TR1=0;
   TR0=0;
          
   while(1)
   {
        key = 0;
        KeyScan();     //检测按键
        KeySwitch();
         flagSwitch();
        display();
        
   }    
   return 0;
}

void timer_0()interrupt 1
{
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;
  flag++;
  disflag++;
}
 void timer_1()interrupt 3
{
  TH1=(65535-50000)/256;
  TL1=(65535-50000)%256;
  flag++;
}
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值