资讯详情

基于单片机的数码管按键计算器程序

这是一个51hei论坛版主测试成功的程序。用的是stc单片机,电路比较简单就不画出来了按键接在P2口 的位选口是: sbit A0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; 数码管的段选口是P0 还有一个led灯p1.4 一个喇叭P1.6 /* * Easy calculator * * K4:+ K8:- K12:* K16:/ K14:Clear K15:= *数码管按键计算器程序 */ #include <reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32; typedef char int8; typedef int int16; typedef long int32; sbit KeyIn1 = P2^4; sbit KeyIn2 = P2^5; sbit KeyIn3 = P2^6; sbit KeyIn4 = P2^7; sbit KeyOut1 = P2^3; sbit KeyOut2 = P2^2; sbit KeyOut3 = P2^1; sbit KeyOut4 = P2^0; sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; sbit BUZZ = P1^6; #define FADD 10 #define FSUB 11 #define FMUL 12 #define FDIV 13 #define FRES 14 #define FEQU 15 #define KEY_DELAY 300 #define BUZ_DELAY 80 code uint8 Ledcode[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x86}; uint8 Led_n=0; uint8 Led_buf[6]; float Tmp1=0, Tmp2=0; int8 C_flag=0; /* * 延时 */ void delay(uint16 n) { while (n--); } /* * 发声 */ void buzzer_sound(void) { uint16 i; for (i=0; i<BUZ_DELAY; i++) { BUZZ = ~BUZZ; delay(100); } BUZZ = 1; } /* * 按键扫描 */ int8 scan_key(void) { int8 val=-1; KeyOut1 = 0; KeyOut2 = 1; KeyOut3 = 1; KeyOut4 = 1; if (KeyIn1 == 0) { delay(KEY_DELAY); if (KeyIn1 == 0) val = 1; } if (KeyIn2 == 0) { delay(KEY_DELAY); if (KeyIn2 == 0) val = 2; } if (KeyIn3 == 0) { delay(KEY_DELAY); if (KeyIn3 == 0) val = 3; } if (KeyIn4 == 0) { delay(KEY_DELAY); if (KeyIn4 == 0) val = FADD; } while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0)); KeyOut1 = 1; KeyOut2 = 0; KeyOut3 = 1; KeyOut4 = 1; if (KeyIn1 == 0) { delay(KEY_DELAY); if (KeyIn1 == 0) val = 4; } if (KeyIn2 == 0) { delay(KEY_DELAY); if (KeyIn2 == 0) val = 5; } if (KeyIn3 == 0) { delay(KEY_DELAY); if (KeyIn3 == 0) val = 6; } if (KeyIn4 == 0) { delay(KEY_DELAY); if (KeyIn4 == 0) val = FSUB; } while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0)); KeyOut1 = 1; KeyOut2 = 1; KeyOut3 = 0; KeyOut4 = 1; if (KeyIn1 == 0) { delay(KEY_DELAY); if (KeyIn1 == 0) val = 7; } if (KeyIn2 == 0) { delay(KEY_DELAY); if (KeyIn2 == 0) val = 8; } if (KeyIn3 == 0) { delay(KEY_DELAY); if (KeyIn3 == 0) val = 9; } if (KeyIn4 == 0) { delay(KEY_DELAY); if (KeyIn4 == 0) val = FMUL; } while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0)); KeyOut1 = 1; KeyOut2 = 1; KeyOut3 = 1; KeyOut4 = 0; if (KeyIn1 == 0) { delay(KEY_DELAY); if (KeyIn1 == 0) val = 0; } if (KeyIn2 == 0) { delay(KEY_DELAY); if (KeyIn2 == 0) val = FRES; } if (KeyIn3 == 0) { delay(KEY_DELAY); if (KeyIn3 == 0) val = FEQU; } if (KeyIn4 == 0) { delay(KEY_DELAY); if (KeyIn4 == 0) val = FDIV; } while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0)); if (val > 0) buzzer_sound(); return val; } /* * 验证数据有效性 */ bit check_num(float f_num) { if (f_num >= 100000) return 1; return 0; } /* * 制作数码管错误标志 */ void make_led_error(void) { int8 i; for (i=0; i<5; i++) Led_buf[i] = Ledcode[10]; Led_buf[5] = Ledcode[12]; } /* * 制作数码管整数数据 */ void make_led_inumber(int32 i_num) { bit s_flag=0; int16 sit; int8 i; if (i_num < 0) { s_flag = 1; i_num = -i_num; } ET0 = 0; for (i=4, sit=10000; i>=1; i--, sit/=10) { if (i_num >= sit) break; Led_buf[i] = Ledcode[10]; i_num -= i_num/sit*sit; } for (;i>=1; i--, sit/=10) { Led_buf[i] = Ledcode[i_num/sit]; i_num -= i_num/sit*sit; } Led_buf[0] = Ledcode[i_num] & 0x7F; if (s_flag) Led_buf[5] = Ledcode[11]; else Led_buf[5] = Ledcode[10]; ET0 = 1; } /* * 制作数码管浮点数据 */ void make_led_fnumber(float f_num) { bit s_flag=0; int32 num; int16 sit; int8 i, decimal, dot_sit=0;

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<dot_sit; 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) {

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台