新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于單片機的數碼管按鍵計算器程序

        基于單片機的數碼管按鍵計算器程序

        作者: 時間:2016-11-30 來源:網絡 收藏

        /*
        *制作數碼管浮點數據
        */
        void make_led_fnumber(float f_num)
        {
        bit s_flag=0;
        int32 num;
        int16 sit;
        int8 i, decimal, dot_sit=0;

        本文引用地址:http://www.104case.com/article/201611/324029.htm

        if (f_num < 0)
        {
        s_flag = 1;
        f_num = -f_num;
        }

        num = (int32)(f_num*10000+0.5);
        for (decimal=4; decimal>0; decimal--)
        {
        if (num % 10 != 0)
        break;
        num /= 10;
        }

        dot_sit = decimal;
        if (f_num >= 10000)
        dot_sit = 0;
        else if (f_num >= 1000)
        if (decimal >= 1)
        dot_sit = 1;
        else if (f_num >= 100)
        if (decimal >= 2)
        dot_sit = 2;
        else if (f_num >= 10)
        if (decimal >= 3)
        dot_sit = 3;
        for (i=0; i f_num *= 10;
        num = (int32)(f_num+0.5);
        ET0 = 0;
        for (i=4, sit=10000; i>=1; i--, sit/=10)
        {
        if (num >= sit)
        break;
        if (i == dot_sit)
        break;
        Led_buf[i] = Ledcode[10];
        num -= num/sit*sit;
        }
        for (;i>=1; i--, sit/=10)
        {
        Led_buf[i] = Ledcode[num/sit];
        num -= num/sit*sit;
        }
        Led_buf[0] = Ledcode[num];
        Led_buf[dot_sit] &= 0x7F;
        if (s_flag)
        Led_buf[5] = Ledcode[11];
        else
        Led_buf[5] = Ledcode[10];
        ET0 = 1;
        }
        /*
        *數碼管顯示
        */
        void show_num(uint8 *buf)
        {
        ENLED = 1;
        switch(Led_n)
        {
        case 0:
        ADDR0 = 0;
        ADDR1 = 0;
        ADDR2 = 0;
        P0 = buf[0];
        break;
        case 1:
        ADDR0 = 1;
        ADDR1 = 0;
        ADDR2 = 0;
        P0 = buf[1];
        break;
        case 2:
        ADDR0 = 0;
        ADDR1 = 1;
        ADDR2 = 0;
        P0 = buf[2];
        break;
        case 3:
        ADDR0 = 1;
        ADDR1 = 1;
        ADDR2 = 0;
        P0 = buf[3];
        break;
        case 4:
        ADDR0 = 0;
        ADDR1 = 0;
        ADDR2 = 1;
        P0 = buf[4];
        break;
        case 5:
        ADDR0 = 1;
        ADDR1 = 0;
        ADDR2 = 1;
        P0 = buf[5];
        break;
        }
        ENLED = 0;
        if (Led_n >= 5)
        Led_n = 0;
        else
        Led_n++;
        }
        /*
        * 計算程序
        */
        void calculate(int8 key_val)
        {
        float ans;
        bit err=0;
        if ((key_val >= FADD) && (key_val <= FDIV))
        {
        C_flag = key_val;
        }
        else if (key_val == FEQU)
        {
        switch(C_flag)
        {
        case FADD: ans = Tmp1+Tmp2; break;
        case FSUB: ans = Tmp1-Tmp2; break;
        case FMUL: ans = Tmp1*Tmp2; break;
        case FDIV: if (Tmp2 == 0)
        {
        err = 1;
        break;
        }
        else
        {
        ans = Tmp1/Tmp2;
        break;
        }
        }
        if (check_num(ans))
        err = 1;
        if (err)
        make_led_error();
        else
        make_led_fnumber(ans);
        C_flag = 0;
        Tmp1 = 0;
        Tmp2 = 0;
        }
        else if (key_val == FRES)
        {
        make_led_fnumber(0);
        C_flag = 0;
        Tmp1 = 0;
        Tmp2 = 0;
        }
        else
        {
        if (C_flag == 0)
        {
        ans = Tmp1;
        ans *= 10;
        ans += key_val;
        if (check_num(ans))
        return;
        else
        Tmp1 = ans;
        make_led_inumber(Tmp1);
        }
        else
        {
        ans = Tmp2;
        ans *= 10;
        ans += key_val;
        if (check_num(ans))
        return;
        else
        Tmp2 = ans;
        make_led_inumber(Tmp2);
        }
        }
        }

        main()
        {
        int8 key_val;
        ADDR3 = 1;
        ENLED = 0;
        make_led_inumber(0);
        TMOD = 0x01;
        TH0 = 0xF8;
        TL0 = 0xCC;
        TR0 = 1;
        ET0 = 1;
        EA = 1;
        while (1)
        {
        key_val = scan_key();
        if (key_val == -1)
        continue;
        calculate(key_val);
        }
        }

        void time0() interrupt 1
        {
        TR0 = 0;
        TH0 = 0xF8;
        TL0 = 0xCC;
        show_num(Led_buf);
        TR0 = 1;
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 普格县| 连城县| 子长县| 山丹县| 西畴县| 彭山县| 紫金县| 靖边县| 建平县| 滁州市| 封开县| 若羌县| 涟水县| 巢湖市| 常熟市| 万载县| 偏关县| 阿鲁科尔沁旗| 海城市| 佛学| 冀州市| 如东县| 康乐县| 禄丰县| 登封市| 淮南市| 棋牌| 汕头市| 赤峰市| 民勤县| 阜阳市| 礼泉县| 额济纳旗| 彩票| 繁昌县| 鹤壁市| 济源市| 故城县| 泰州市| 建瓯市| 安福县|