寫了一個方法比較全面的頭文件:
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排燈,需要擴列的自行修改代碼。
// --------------------------------------------------------------------------------------------------------