zoukankan      html  css  js  c++  java
  • 单片机成长之路(51基础篇)

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

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

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

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

  • 相关阅读:
    NanoProfiler
    NanoProfiler
    Open Source Cassandra Gitbook for Developer
    Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
    Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
    Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
    Android Fragment使用(一) 基础篇 温故知新
    Set up Github Pages with Hexo, migrating from Jekyll
    EventBus源码解析 源码阅读记录
    Android M Permission 运行时权限 学习笔记
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/13630171.html
Copyright © 2011-2022 走看看