單片機成長之路(51基礎篇) - 028 八段數碼管驅動文件

 

 

寫了一個方便的頭文件:

  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位的八段數碼管,需要擴位的自行修改代碼。

創作不易,轉載說明出處,謝謝!

 // --------------------------------------------------------------------------------------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章