Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Atmel C引脚操作宏_C_Macros_Atmel - Fatal编程技术网

Atmel C引脚操作宏

Atmel C引脚操作宏,c,macros,atmel,C,Macros,Atmel,我已经用Atmel C编程了一段时间,我已经习惯了所有的C位操作,所以现在我想隐藏它。我想隐藏位操作,不仅是为了让代码更具可读性,还为了在硬件发生变化或制造新硬件时更易于维护和修改 所以我想问你什么是Atmel C用于基本引脚操作的最佳宏 我正在寻找的功能包括: 将引脚设置为输入或输出 将输出引脚设置为高或低 读取输入引脚的值 因此,我找到了一些我可以使用的宏,但没有一个真正符合我的要求 链接: (每个引脚仍必须保留多个定义) (不编译,AVR Studio 6.2) (最佳答案,在“/*LCD

我已经用Atmel C编程了一段时间,我已经习惯了所有的C位操作,所以现在我想隐藏它。我想隐藏位操作,不仅是为了让代码更具可读性,还为了在硬件发生变化或制造新硬件时更易于维护和修改

所以我想问你什么是Atmel C用于基本引脚操作的最佳宏

我正在寻找的功能包括:

  • 将引脚设置为输入或输出
  • 将输出引脚设置为高或低
  • 读取输入引脚的值
  • 因此,我找到了一些我可以使用的宏,但没有一个真正符合我的要求

    链接:

    (每个引脚仍必须保留多个定义)

    (不编译,AVR Studio 6.2)

    (最佳答案,在“/*LCD定义*/”下的问题顶部附近)

    我真正想要的是这样的:

    #define LED1      PA1
    #define BUTTON1   PB0
    
    
    
    set_output(LED1);
    output_high(LED1);
    delay_ms(100);
    output_low(LED1);
    
    
    set_input(BUTTON1);
    uint8_t tmpVal = get_input(BUTTON1);
    if( tmpVal == 1 )
    {
        // assuming button IS pressed here
    }
    else
    {
        // assuming button IS NOT pressed here
    }
    
    有没有关于最干净的方法的想法

    我可以为每个pin多定义几个定义,但我觉得不需要这样做。PA1和PB0不应该告诉我们所有的事情吗?或者它们是被定义为一个值吗

    编辑:在Windows上使用Atmel Studio 6.2

    谢谢,
    Rob R.

    别担心这会编译

    //用于ATMEL GCC-AVR的易于管脚处理的宏
    //这些宏被其他宏间接使用,主要用于字符串压缩
    #定义_集合(类型、名称、位)类型##名称|=_BV(位)
    #定义_CLEAR(类型、名称、位)类型##名称&=~_BV(位)
    #定义_切换(类型、名称、位)类型##名称^=_BV(位)
    #定义_GET(类型、名称、位)((类型##名称>>位)&1)
    
    #定义(类型,名称,位,值)类型##名称=(类型###名称&(~u BV(位)))|((1&(无符号字符)值)有人能给出一个在代码中使用"PUT宏的例子吗?
    // MACROS FOR EASY PIN HANDLING FOR ATMEL GCC-AVR
    //these macros are used indirectly by other macros , mainly for string concatination
    #define _SET(type,name,bit)          type ## name  |= _BV(bit)    
    #define _CLEAR(type,name,bit)        type ## name  &= ~ _BV(bit)        
    #define _TOGGLE(type,name,bit)       type ## name  ^= _BV(bit)    
    #define _GET(type,name,bit)          ((type ## name >> bit) &  1)
    #define _PUT(type,name,bit,value)    type ## name = ( type ## name & ( ~ _BV(bit)) ) | ( ( 1 & (unsigned char)value ) << bit )
    
    //these macros are used by end user
    #define OUTPUT(pin)         _SET(DDR,pin)    
    #define INPUT(pin)          _CLEAR(DDR,pin)    
    #define HIGH(pin)           _SET(PORT,pin)
    #define LOW(pin)            _CLEAR(PORT,pin)    
    #define TOGGLE(pin)         _TOGGLE(PORT,pin)    
    #define READ(pin)           _GET(PIN,pin)
    
    /*
        BASIC STAMPS STYLE COMMANDS FOR ATMEL GCC-AVR
    
        Usage Example:
        ———————————————–
        #define pinLed B,5  //define pins like this
    
        OUTPUT(pinLed);       //typo fixed
        //OUTPUT(pinLED);     //compiles as DDRB |= (1<<5);
        HIGH(pinLed);         //compiles as PORTB |= (1<<5);
        ———————————————–
    */