ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单片机成长之路(51基础篇) - 027 数码管驱动文件

2020-09-08 02:02:34  阅读:217  来源: 互联网

标签:status git LED 数码管 xxx 51 value 单片机 gpio


写了一个方法比较全面的头文件:

  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排灯,需要扩列的自行修改代码。

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

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

标签:status,git,LED,数码管,xxx,51,value,单片机,gpio
来源: https://www.cnblogs.com/jikexianfeng/p/13630171.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有