寫了一個方便的頭文件:
1 // 作者博客:https://www.cnblogs.com/jikexianfeng/ 2 // --------------------------------------------------------------------------------------------------------------- 3 // 頭文件功能簡介:編寫了一個驅動八段4位數碼管的頭文件: 4 // 所有函數都是按位操作的: 5 // led_Digital_Tube_Positioning_dynamic_display_data_int(value) // 顯示整形 value 的值(帶符號) 6 // led_Digital_Tube_Positioning_dynamic_display_data_float(value) // 顯示浮點 value 的值(無符號) 7 // --------------------------------------------------------------------------------------------------------------- 8 # include "bsp.h" // 板卡的gpio宏定義,定義內容如下 9 // --------------------------------------------------------------------------------------------------------------- 10 //// lcd 數碼管 11 //sfr LED_Digital_all = 0x80; 12 //sbit LED_Digital_A = P0^0; 13 //sbit LED_Digital_B = P0^1; 14 //sbit LED_Digital_C = P0^2; 15 //sbit LED_Digital_D = P0^3; 16 //sbit LED_Digital_E = P0^4; 17 //sbit LED_Digital_F = P0^5; 18 //sbit LED_Digital_G = P0^6; 19 //sbit LED_Digital_DP = P0^7; 20 21 //sbit LED_Digital_1 = P2^4; 22 //sbit LED_Digital_2 = P2^5; 23 //sbit LED_Digital_3 = P2^6; 24 //sbit LED_Digital_4 = P2^7; 25 26 27 void LED_Digital_delay_bps(int count){ 28 while(count--); 29 } 30 #define LED_Digital_delay() LED_Digital_delay_bps(100) 31 // --------------------------------------------------------------------------------------------------------------- 32 // gpio 有效電平 33 #define Low_level 0 // 低電平有效 34 #define High_level 1 // 高電平有效 35 #define led_data_Effective_level High_level // 配置數碼管字符有效電平(我的板卡是高電平有效,配置爲:High_level) 36 #define led_position_Effective_level High_level // 配置數碼管位選有效電平(我的板卡是高電平有效,配置爲:High_level) 37 // --------------------------------------------------------------------------------------------------------------- 38 // 選中 39 #define Selecteds_position_1 LED_Digital_1 = led_position_Effective_level 40 #define Selecteds_position_2 LED_Digital_2 = led_position_Effective_level 41 #define Selecteds_position_3 LED_Digital_3 = led_position_Effective_level 42 #define Selecteds_position_4 LED_Digital_4 = led_position_Effective_level 43 #define Selecteds_position_all Selecteds_position_1;Selecteds_position_2;Selecteds_position_3;Selecteds_position_4 44 // 放棄 45 #define Abandon_position_1 LED_Digital_1 = (!led_position_Effective_level) 46 #define Abandon_position_2 LED_Digital_2 = (!led_position_Effective_level) 47 #define Abandon_position_3 LED_Digital_3 = (!led_position_Effective_level) 48 #define Abandon_position_4 LED_Digital_4 = (!led_position_Effective_level) 49 #define Abandon_position_all Abandon_position_1;Abandon_position_2;Abandon_position_3;Abandon_position_4 50 // --------------------------------------------------------------------------------------------------------------- 51 // 借鑑 #include "led_device.h" 方法一: gpio 物理上連續 pin Program 52 void led_Digital_Tube_all_gpio_status_group(uchar collection,char status){ 53 // 配置 LED GPIO 54 int status_value; 55 led_data_Effective_level? (status_value = LED_Digital_all):(status_value = ~LED_Digital_all); 56 status?(status_value = status_value & (~collection)):(status_value = status_value | collection); 57 led_data_Effective_level?(LED_Digital_all=status_value):(LED_Digital_all=~status_value); 58 } 59 // group 60 #define set_led_Digital_Tube_all_gpio_status_group(collection) led_Digital_Tube_all_gpio_status_group(collection,1) 61 #define clean_led_Digital_Tube_all_gpio_status_group(collection) led_Digital_Tube_all_gpio_status_group(collection,0) 62 // 消影 63 #define led_Digital_Tube_all_Eliminate_shadow() Selecteds_position_all;clean_led_Digital_Tube_all_gpio_status_group(0xff);Abandon_position_all 64 // --------------------------------------------------------------------------------------------------------------- 65 code uchar Digital_Tube_coding[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x08}; 66 code char Digital_Tube_Decimal_point = 0x80; 67 // --------------------------------------------------------------------------------------------------------------- 68 #define Calculation_int 0 69 #define Calculation_float 1 70 #define Calculation_status Calculation_int 71 // --------------------------------------------------------------------------------------------------------------- 72 // 獲取編碼 73 uchar git_Digital_Tube_value_coding(char Serial_number,char sign){ 74 uchar coding_value; 75 if((0x00 <= Serial_number)&(Serial_number<0x10))coding_value = Digital_Tube_coding[Serial_number]; 76 else { 77 switch(Serial_number){ 78 case ' ':{coding_value = Digital_Tube_coding[16];}break; 79 case '-':coding_value = Digital_Tube_coding[17];break; 80 case '_':coding_value = Digital_Tube_coding[18];break; 81 } 82 } 83 if(sign)coding_value |= Digital_Tube_Decimal_point; 84 led_data_Effective_level?(coding_value = ~coding_value):(coding_value = coding_value); 85 return coding_value; 86 } 87 // 靜態輸出字符 88 void led_Digital_Tube_Positioning_Static_display_data(char Positioning,char value,char Decimal_point_status){ 89 led_Digital_Tube_all_Eliminate_shadow(); 90 switch(Positioning){ 91 case 0x00:{set_led_Digital_Tube_all_gpio_status_group(git_Digital_Tube_value_coding(value,Decimal_point_status));Selecteds_position_all;};break; 92 case 0x01:{set_led_Digital_Tube_all_gpio_status_group(git_Digital_Tube_value_coding(value,Decimal_point_status));Selecteds_position_1;};break; 93 case 0x02:{set_led_Digital_Tube_all_gpio_status_group(git_Digital_Tube_value_coding(value,Decimal_point_status));Selecteds_position_2;};break; 94 case 0x03:{set_led_Digital_Tube_all_gpio_status_group(git_Digital_Tube_value_coding(value,Decimal_point_status));Selecteds_position_3;};break; 95 case 0x04:{set_led_Digital_Tube_all_gpio_status_group(git_Digital_Tube_value_coding(value,Decimal_point_status));Selecteds_position_4;};break; 96 } 97 } 98 #define led_Digital_Tube_Positioning_Static_display_data_int(Positioning,value) led_Digital_Tube_Positioning_Static_display_data(Positioning,value,0) 99 #define led_Digital_Tube_Positioning_Static_display_data_float(Positioning,value,Decimal_point_status) led_Digital_Tube_Positioning_Static_display_data(Positioning,value,Decimal_point_status) 100 101 // --------------------------------------------------------------------------------------------------------------- 102 #include <math.h> 103 #define git_bit_data(position) (0x01<<position) // bit位獲取 104 #define git_Decimal_bit_data(p) pow(10,p) 105 // --------------------------------------------------------------------------------------------------------------- 106 #define display_data_Digits_MAX 4 107 char git_display_data_Digits(int value); 108 char git_display_data_Digits(int value){ 109 int count = 0; 110 if(value <= 0)return count = 0; 111 else { 112 count = git_display_data_Digits((value/10)) + 1; 113 } 114 return count; 115 } 116 117 118 // 動態輸出整數(正負) 119 void led_Digital_Tube_Positioning_dynamic_display_data_int(char value){ 120 char count; 121 for(count = 0;count <4;count++){ 122 if(count == (display_data_Digits_MAX - 1)){ 123 if(value < 0)led_Digital_Tube_Positioning_Static_display_data_int((count+1),'-'); 124 else led_Digital_Tube_Positioning_Static_display_data_int((count+1),(abs(value)/((int)git_Decimal_bit_data(count))%10)); 125 } 126 else led_Digital_Tube_Positioning_Static_display_data_int((count+1),(((value<0)?(128+value):value)/((int)git_Decimal_bit_data(count))%10)); 127 LED_Digital_delay(); 128 } 129 } 130 // 動態輸出浮點(暫不支持負數) 131 void led_Digital_Tube_Positioning_dynamic_display_data_float(float value){ 132 char count_len; 133 char count; 134 int data_value; 135 data_value = (int)value; 136 count_len = git_display_data_Digits(data_value); 137 138 if(count_len >= display_data_Digits_MAX)led_Digital_Tube_Positioning_dynamic_display_data_int(data_value); 139 else { 140 data_value = (int)(value*git_Decimal_bit_data((display_data_Digits_MAX - count_len))); 141 for(count = 0;count <4;count++){ 142 led_Digital_Tube_Positioning_Static_display_data_float((count+1),((data_value/((int)git_Decimal_bit_data(count)))%10),((display_data_Digits_MAX - count_len) == (count)));LED_Digital_delay(); 143 } 144 } 145 }
// --------------------------------------------------------------------------------------------------------
默認stc51單片機舉例,浮點支持不是很好,
本代碼默認支持4位的八段數碼管,需要擴位的自行修改代碼。
// --------------------------------------------------------------------------------------------------------