7.20 学习日志

简易计算器的程序

#include <reg51.h>


unsigned int key = 0, num1 = 0, num2 = 0;
unsigned int dispaly_flag = 0,flag = 0;


unsigned char code table[] = {0x3f, 0x06 , 
        0x5b , 0x4f , 0x66 , 0x6d, 0x7d , 
        0x07 , 0x7f  , 0x6f };

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(unsigned int n)
{

    if (n >= 0 && n <= 9)
    {
        P2 = 0xfe;
        P0 = table[n];
    }
    if (n >= 10 && n <= 99)
    {
        if(dispaly_flag%2 == 0)
        {
            P2 = 0xfe;
            P0 = table[n / 10];    
        }

        if(dispaly_flag%2 == 1)
        {
            P2 = ~(1 << 1);
            P0 = table[n % 10];            
        }
    
    }    
    if (n >= 100 && n <= 999)
    {
        if(dispaly_flag%3 == 0)
        {
            P2 = 0xfe;
            P0 = table[n / 100];            
        }

        if(dispaly_flag%3 == 1)
        {
            P2 = ~(1 << 1);
            P0 = table[(n % 100) / 10];
        }    

           if(dispaly_flag%3 == 2)
        {
            P2 = ~(1 << 2);
            P0 = table[(n % 10)];            
        }
    }


    if (n >= 1000 && n <= 9999)
    {
        if(dispaly_flag%4 == 0)
        {
            P2 = 0xfe;
            P0 = table[n / 1000];            
        }

        if(dispaly_flag%4 == 1)
        {
            P2 = ~(1 << 1);
            P0 = table[(n % 1000) / 100];
        }    

           if(dispaly_flag%4 == 2)
        {
            P2 = ~(1 << 2);
            P0 = table[((n % 100) / 10)];            
        }

        if(dispaly_flag%4 == 3)
        {
            P2 = ~(1 << 3);
            P0 = table[(n % 10)];            
        }

    }

    if (n >= 10000 && n <= 99999)
    {
        if(dispaly_flag%5 == 0)
        {
            P2 = 0xfe;
            P0 = table[n / 10000];            
        }

        if(dispaly_flag%5 == 1)
        {
            P2 = ~(1 << 1);
            P0 = table[(n % 10000) / 1000];
        }    

           if(dispaly_flag%5 == 2)
        {
            P2 = ~(1 << 2);
            P0 = table[((n % 1000) / 100)];            
        }

        if(dispaly_flag%5 == 3)
        {
            P2 = ~(1 << 3);
            P0 = table[((n % 100) / 10)];            
        }

        if(dispaly_flag%5 == 4)
        {
            P2 = ~(1 << 4);
            P0 = table[(n % 10)];            
        }

    }

    if (n >= 100000 && n <= 999999)
    {
        if(dispaly_flag%6 == 0)
        {
            P2 = 0xfe;
            P0 = table[n / 100000];            
        }

        if(dispaly_flag%6 == 1)
        {
            P2 = ~(1 << 1);
            P0 = table[(n % 100000) / 10000];
        }    

           if(dispaly_flag%6 == 2)
        {
            P2 = ~(1 << 2);
            P0 = table[((n % 10000) / 1000)];            
        }

        if(dispaly_flag%6 == 3)
        {
            P2 = ~(1 << 3);
            P0 = table[((n % 1000) / 100)];            
        }

        if(dispaly_flag%6 == 4)
        {
            P2 = ~(1 << 4);
            P0 = table[((n % 100) / 10)];            
        }

        if(dispaly_flag%6 == 5)
        {
            P2 = ~(1 << 5);
            P0 = table[(n % 10)];            
        }
    }

}

int main()
{
    unsigned int i, display_flag5 = 0,display_flag1 = 0;
    unsigned int display_flag2 = 0,display_flag3 = 0,display_flag4 = 0;
    unsigned int flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0;

    EA = 1;
    ET0 = 1;
    TMOD = 0x01;
    TH0 = (65535-10000)/256;    //高八位
    TL0 = (65535-10000)%256;     //低八位
    TR0 = 1;

    while (1)
    {
        key = 0;
        KeyScan();     //检测按键

        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:  //+
                display_flag1 = 1;
                flag1 = 1;
                break;
            case 12:  //-
                display_flag2 = 1;
                flag2 = 1;
                break;
            case 13:  //*
                display_flag3 = 1;
                flag3 = 1;
                break;
            case 14:  ///
                display_flag4 = 1;
                flag4 = 1;
                break;            
            case 15:  //=
                display_flag5 = 1;
                break;
            case 16:  //归零
                num1 = 0;
                num2 = 0;
                display_flag1 = 0;
                display_flag2 = 0;
                display_flag3 = 0;
                display_flag4 = 0;
                display_flag5 = 0;
                break;
        }
        if ((display_flag1 == 1)||(display_flag2 == 1)||(display_flag3 == 1)||(display_flag4 == 1))
        {
            display(num1);
            num2 = num1;
            num1 = 0;
            display_flag1 = 0;
            display_flag2 = 0;
            display_flag3 = 0;
            display_flag4 = 0;
        }

        if(display_flag5 == 0)
        {
            display(num2);                    
        }

        //显示加法的结果
        if((display_flag5 == 1)&&(flag1 == 1))
        {
            display(num1+num2);
        }

        //显示减法的结果
        if((display_flag5 == 1)&&(flag2 == 1))
        {
            display(num2-num1);
        }

        //显示乘法的结果
        if((display_flag5 == 1)&&(flag3 == 1))
        {
            display(num1*num2);
        }

        //显示除法的结果
        if((display_flag5 == 1)&&(flag4 == 1))
        {
            display(num2/num1);
        }

    }
    return 0;
}


void timer_0() interrupt 1
{
    //重装初值
    TH0 = (65535-10000)/256;    
    TL0 = (65535-10000)%256;  
    flag++;
    if(flag == 2)
    {
        dispaly_flag++;
        flag = 0;
        if(dispaly_flag == 10000)
        {
            dispaly_flag = 0;
        }    
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值