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

寫了一個方法比較全面的頭文件:

  1 // 作者博客:https://www.cnblogs.com/jikexianfeng/
  2 // ---------------------------------------------------------------------------------------------------------------
  3 // 頭文件功能簡介:編寫了一個驅動led燈的頭文件:
  4 // 所有函數都是按位操作的:
  5 // set_xxx_xxx_xxxx_xxxx_xxx(collection)        // 設置選中位爲有效狀態
  6 //    set_xxx_xxx_xxxx_xxxx_xxx(0x05)                    // 設置gpio 0,3 引腳爲有效狀態
  7 // clean_xxx_xxx_xxxx_xxxx_xxx(collection)        // 清除選中位爲有效狀態
  8 //     clean_xxx_xxx_xxxx_xxxx_xxx(0x05)                // 清除gpio 0,3 引腳爲有效狀態
  9 // ---------------------------------------------------------------------------------------------------------------
 10 # include <intrins.h>                // 左右移位頭文件
 11 # include "bsp.h"                    // 板卡的gpio宏定義,定義內容如下
 12 // ---------------------------------------------------------------------------------------------------------------
 13 //sfr    LED_all   = 0x90;
 14 //sbit LED_0 = P1^0;
 15 //sbit LED_1 = P1^1;
 16 //sbit LED_2 = P1^2;
 17 //sbit LED_3 = P1^3;
 18 //sbit LED_4 = P1^4;
 19 //sbit LED_5 = P1^5;
 20 //sbit LED_6 = P1^6;
 21 //sbit LED_7 = P1^7;
 22 // ---------------------------------------------------------------------------------------------------------------
 23 // 真值表
 24 // led_Effective_level    status     result
 25 //     0                    0        1
 26 //    0                    1        0
 27 //    1                    0        0
 28 //    1                    1        1
 29 // 公式:result=(led_Effective_level == status)
 30 // ---------------------------------------------------------------------------------------------------------------
 31 #define git_bit_data(position) (0x01<<position)                // bit位獲取
 32 // ---------------------------------------------------------------------------------------------------------------
 33 // gpio 有效電平
 34 #define Low_level     0        // 低電平有效
 35 #define High_level    1        // 高電平有效
 36 #define led_Effective_level    Low_level        // 配置板卡有效電平(我的板卡是低電平有效,配置爲:Low_level)
 37 // ---------------------------------------------------------------------------------------------------------------
 38 // gpio 物理上連續 pin Program
 39 void led_all_gpio_status_group(uchar collection,char status){
 40     // 配置 LED GPIO
 41     int status_value;
 42     led_Effective_level? (status_value = LED_all):(status_value = ~LED_all);
 43     status?(status_value = status_value | collection):(status_value = status_value & (~collection));
 44     led_Effective_level?(LED_all=status_value):(LED_all=~status_value);
 45 }
 46 // gpio 物理上不連續 直接 com IO 方法
 47 void led_all_gpio_status_IO(uchar collection,char status){
 48     int i;
 49     for(i=0;i<8;i++){
 50         switch((collection&git_bit_data(i))){
 51             case 0x00:{;}break;
 52             case 0x01:{(led_Effective_level==status) ? (LED_0 |= (led_Effective_level==status)):(LED_0 &= (led_Effective_level==status));}break;
 53             case 0x02:{(led_Effective_level==status) ? (LED_1 |= (led_Effective_level==status)):(LED_1 &= (led_Effective_level==status));}break;
 54             case 0x04:{(led_Effective_level==status) ? (LED_2 |= (led_Effective_level==status)):(LED_2 &= (led_Effective_level==status));}break;
 55             case 0x08:{(led_Effective_level==status) ? (LED_3 |= (led_Effective_level==status)):(LED_3 &= (led_Effective_level==status));}break;
 56             case 0x10:{(led_Effective_level==status) ? (LED_4 |= (led_Effective_level==status)):(LED_4 &= (led_Effective_level==status));}break;
 57             case 0x20:{(led_Effective_level==status) ? (LED_5 |= (led_Effective_level==status)):(LED_5 &= (led_Effective_level==status));}break;
 58             case 0x40:{(led_Effective_level==status) ? (LED_6 |= (led_Effective_level==status)):(LED_6 &= (led_Effective_level==status));}break;
 59             case 0x80:{(led_Effective_level==status) ? (LED_7 |= (led_Effective_level==status)):(LED_7 &= (led_Effective_level==status));}break;
 60             default:{;};break;
 61         }
 62     }
 63 }
 64 // gpio 物理上不連續,通過結構體進行連續
 65 struct gpio_Physical_continuity_Splicing{
 66     uchar gpio_0:1;
 67     uchar gpio_1:1;
 68     uchar gpio_2:1;
 69     uchar gpio_3:1;
 70     uchar gpio_4:1;
 71     uchar gpio_5:1;
 72     uchar gpio_6:1;
 73     uchar gpio_7:1;
 74 };
 75 // 獲取gpio虛擬組值
 76 uchar git_Discontinuous_gpio_group(void){
 77     struct gpio_Physical_continuity_Splicing lcd_gpio_Splicing;
 78     uchar * ptr = (uchar *)(&lcd_gpio_Splicing);
 79     lcd_gpio_Splicing.gpio_0 = LED_0;
 80     lcd_gpio_Splicing.gpio_1 = LED_1;
 81     lcd_gpio_Splicing.gpio_2 = LED_2;
 82     lcd_gpio_Splicing.gpio_3 = LED_3;
 83     lcd_gpio_Splicing.gpio_4 = LED_4;
 84     lcd_gpio_Splicing.gpio_5 = LED_5;
 85     lcd_gpio_Splicing.gpio_6 = LED_6;
 86     lcd_gpio_Splicing.gpio_7 = LED_7;
 87     return *ptr;
 88 }
 89 // 虛擬組設置 gpio 狀態值
 90 void set_Discontinuous_gpio_group(uchar gpio_status_value){
 91     struct gpio_Physical_continuity_Splicing * lcd_gpio_Splicing = &gpio_status_value;
 92     LED_0 = lcd_gpio_Splicing->gpio_0;
 93     LED_1 = lcd_gpio_Splicing->gpio_1;
 94     LED_2 = lcd_gpio_Splicing->gpio_2;
 95     LED_3 = lcd_gpio_Splicing->gpio_3;
 96     LED_4 = lcd_gpio_Splicing->gpio_4;
 97     LED_5 = lcd_gpio_Splicing->gpio_5;
 98     LED_6 = lcd_gpio_Splicing->gpio_6;
 99     LED_7 = lcd_gpio_Splicing->gpio_7;
100 }
101 // gpio虛擬組 group 方法
102 void led_Discontinuous_gpio_group_group(uchar collection,char status){
103     uchar status_value;
104     uchar git_gpio_status_value = git_Discontinuous_gpio_group();
105     led_Effective_level? (status_value = git_gpio_status_value):(status_value = ~git_gpio_status_value);
106     status?(status_value = status_value | collection):(status_value = status_value & (~collection));
107     led_Effective_level?(git_gpio_status_value=status_value):(git_gpio_status_value=~status_value);
108     set_Discontinuous_gpio_group(git_gpio_status_value);
109 }
110 // gpio虛擬組 IO 方法
111 void led_Discontinuous_gpio_group_IO(uchar collection,char status){
112     int i;
113     uchar LED_status = git_Discontinuous_gpio_group();
114     for(i=0;i<8;i++){
115         if(collection&git_bit_data(i)){
116             (led_Effective_level==status) ? (LED_status |= git_bit_data(i)):(LED_status &= (~git_bit_data(i)));
117         }
118     }
119     set_Discontinuous_gpio_group(LED_status);
120 }
121 // ---------------------------------------------------------------------------------------------------------------
122 // group
123 #define set_led_all_gpio_status_group(collection)         led_all_gpio_status_group(collection,1)
124 #define clean_led_all_gpio_status_group(collection)     led_all_gpio_status_group(collection,0)
125 // IO
126 #define set_led_all_gpio_status_IO(collection)            led_all_gpio_status_IO(collection,1)
127 #define clean_led_all_gpio_status_IO(collection)        led_all_gpio_status_IO(collection,0)
128 // gpio虛擬組 group 方法
129 #define set_led_Discontinuous_gpio_group_group(collection)        led_Discontinuous_gpio_group_group(collection,1)
130 #define clean_led_Discontinuous_gpio_group_group(collection)    led_Discontinuous_gpio_group_group(collection,0)
131 // gpio虛擬組 IO 方法
132 #define set_led_Discontinuous_gpio_group_IO(collection)            led_Discontinuous_gpio_group_IO(collection,1)
133 #define clean_led_Discontinuous_gpio_group_IO(collection)        led_Discontinuous_gpio_group_IO(collection,0)

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

默認stc51單片機舉例,代碼方法比較全面,選擇適合的自己的就行。

本代碼默認支持8位的lcd排燈,需要擴列的自行修改代碼。

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

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

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