单片机成长之路(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 // value 数据大于最大显示,显示 FFFF
  8 // ---------------------------------------------------------------------------------------------------------------
  9 # include "bsp.h"                    // 板卡的gpio宏定义,定义内容如下
 10 // ---------------------------------------------------------------------------------------------------------------
 11 //// lcd 数码管
 12 //sfr    LED_Digital_all   = 0x80;
 13 //sbit LED_Digital_A = P0^0;
 14 //sbit LED_Digital_B = P0^1;
 15 //sbit LED_Digital_C = P0^2;
 16 //sbit LED_Digital_D = P0^3;
 17 //sbit LED_Digital_E = P0^4;
 18 //sbit LED_Digital_F = P0^5;
 19 //sbit LED_Digital_G = P0^6;
 20 //sbit LED_Digital_DP = P0^7;
 21 
 22 //sbit LED_Digital_1 = P2^4;
 23 //sbit LED_Digital_2 = P2^5;
 24 //sbit LED_Digital_3 = P2^6;
 25 //sbit LED_Digital_4 = P2^7;
 26 
 27 
 28 void LED_Digital_delay_bps(int count){
 29     while(count--);
 30 }
 31 #define LED_Digital_delay()    LED_Digital_delay_bps(400)
 32 // ---------------------------------------------------------------------------------------------------------------
 33 // gpio 有效电平
 34 #define Low_level     0        // 低电平有效
 35 #define High_level    1        // 高电平有效
 36 #define led_data_Effective_level        High_level        // 配置数码管字符有效电平(我的板卡是高电平有效,配置为:High_level)
 37 #define led_position_Effective_level    High_level        // 配置数码管位选有效电平(我的板卡是高电平有效,配置为:High_level)
 38 // ---------------------------------------------------------------------------------------------------------------
 39 // 选中
 40 #define Selecteds_position_1    LED_Digital_1 = led_position_Effective_level
 41 #define Selecteds_position_2    LED_Digital_2 = led_position_Effective_level
 42 #define Selecteds_position_3    LED_Digital_3 = led_position_Effective_level
 43 #define Selecteds_position_4    LED_Digital_4 = led_position_Effective_level
 44 #define Selecteds_position_all     Selecteds_position_1;Selecteds_position_2;Selecteds_position_3;Selecteds_position_4
 45 // 放弃
 46 #define Abandon_position_1        LED_Digital_1 = (!led_position_Effective_level)
 47 #define Abandon_position_2        LED_Digital_2 = (!led_position_Effective_level)
 48 #define Abandon_position_3        LED_Digital_3 = (!led_position_Effective_level)
 49 #define Abandon_position_4        LED_Digital_4 = (!led_position_Effective_level)
 50 #define Abandon_position_all     Abandon_position_1;Abandon_position_2;Abandon_position_3;Abandon_position_4
 51 // ---------------------------------------------------------------------------------------------------------------
 52 // 借鉴 #include "led_device.h" 方法一: gpio 物理上连续 pin Program
 53 void led_Digital_Tube_all_gpio_status_group(uchar collection,char status){
 54     // 配置 LED GPIO
 55     int status_value;
 56     led_data_Effective_level? (status_value = LED_Digital_all):(status_value = ~LED_Digital_all);
 57     status?(status_value = status_value & (~collection)):(status_value = status_value | collection);
 58     led_data_Effective_level?(LED_Digital_all=status_value):(LED_Digital_all=~status_value);
 59 }
 60 // group
 61 #define set_led_Digital_Tube_all_gpio_status_group(collection)                 led_Digital_Tube_all_gpio_status_group(collection,1)
 62 #define clean_led_Digital_Tube_all_gpio_status_group(collection)             led_Digital_Tube_all_gpio_status_group(collection,0)
 63 // 消影
 64 #define led_Digital_Tube_all_Eliminate_shadow()            Selecteds_position_all;clean_led_Digital_Tube_all_gpio_status_group(0xff);Abandon_position_all
 65 // ---------------------------------------------------------------------------------------------------------------
 66 code uchar Digital_Tube_coding[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x08};    
 67 code char Digital_Tube_Decimal_point = 0x80;
 68 // ---------------------------------------------------------------------------------------------------------------
 69 #define Calculation_int     0
 70 #define Calculation_float    1
 71 #define Calculation_status    Calculation_int
 72 // ---------------------------------------------------------------------------------------------------------------
 73 // 获取编码
 74 uchar git_Digital_Tube_value_coding(char Serial_number,char sign){
 75     uchar coding_value;
 76     if((0x00 <= Serial_number)&(Serial_number<0x10))coding_value = Digital_Tube_coding[Serial_number];
 77     else {
 78         switch(Serial_number){
 79             case ' ':{coding_value = Digital_Tube_coding[16];}break;
 80             case '-':coding_value = Digital_Tube_coding[17];break;
 81             case '_':coding_value = Digital_Tube_coding[18];break;
 82         }
 83     }
 84     if(sign)coding_value |=  Digital_Tube_Decimal_point;
 85     led_data_Effective_level?(coding_value = ~coding_value):(coding_value = coding_value);
 86     return coding_value;
 87 }
 88 // 静态输出字符
 89 void led_Digital_Tube_Positioning_Static_display_data(char Positioning,char value,char Decimal_point_status){
 90     led_Digital_Tube_all_Eliminate_shadow();
 91     switch(Positioning){
 92         case 0x00:{set_led_Digital_Tube_all_gpio_status_group(git_Digital_Tube_value_coding(value,Decimal_point_status));Selecteds_position_all;};break;
 93         case 0x01:{set_led_Digital_Tube_all_gpio_status_group(git_Digital_Tube_value_coding(value,Decimal_point_status));Selecteds_position_1;};break;
 94         case 0x02:{set_led_Digital_Tube_all_gpio_status_group(git_Digital_Tube_value_coding(value,Decimal_point_status));Selecteds_position_2;};break;
 95         case 0x03:{set_led_Digital_Tube_all_gpio_status_group(git_Digital_Tube_value_coding(value,Decimal_point_status));Selecteds_position_3;};break;
 96         case 0x04:{set_led_Digital_Tube_all_gpio_status_group(git_Digital_Tube_value_coding(value,Decimal_point_status));Selecteds_position_4;};break;
 97     }
 98 }
 99 #define led_Digital_Tube_Positioning_Static_display_data_int(Positioning,value) led_Digital_Tube_Positioning_Static_display_data(Positioning,value,0)
100 #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)
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 led_Digital_Tube_Positioning_dynamic_display_data_process(int value,char Reserved_digits){
118     char count;
119     for(count = 0;count <4;count++){
120         if(count == (display_data_Digits_MAX - 1)){
121             if(value < 0)led_Digital_Tube_Positioning_Static_display_data((count+1),'-',0);
122             else led_Digital_Tube_Positioning_Static_display_data((count+1),(abs(value)/((int)git_Decimal_bit_data(count))%10),(count?(count == Reserved_digits):count));
123         }
124         else led_Digital_Tube_Positioning_Static_display_data((count+1),(((value<0)?(128+value):value)/((int)git_Decimal_bit_data(count))%10),(count?(count == Reserved_digits):count)); 
125     }
126 }
127 #define led_Digital_Tube_Positioning_dynamic_display_data_error()    led_Digital_Tube_Positioning_Static_display_data(0x00,0x0f,0)
128 
129 // 动态输出整数(正负)
130 void led_Digital_Tube_Positioning_dynamic_display_data_value(int value,char Reserved_digits){
131     if(value > (git_Decimal_bit_data(display_data_Digits_MAX-1) - 1))led_Digital_Tube_Positioning_dynamic_display_data_error();
132     else led_Digital_Tube_Positioning_dynamic_display_data_process(value,Reserved_digits);
133     LED_Digital_delay();
134 }
135 
136 #define led_Digital_Tube_Positioning_dynamic_display_data_int(value)                             led_Digital_Tube_Positioning_dynamic_display_data_value(value,0)
137 #define led_Digital_Tube_Positioning_dynamic_display_data_float(value,Decimal_point_status)     led_Digital_Tube_Positioning_dynamic_display_data_value(((int)(value*git_Decimal_bit_data(Decimal_point_status))),Decimal_point_status)
138 
139  

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

默认stc51单片机举例,浮点支持不是很好,

本代码默认支持4位的八段数码管,需要扩位的自行修改代码。

创作不易,转载说明出处,谢谢!

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

 

posted @ 2020-09-09 00:26  极客先锋  阅读(612)  评论(0编辑  收藏  举报