2014-09-22 62 views
1

所以我一直在Atmel C編程一段時間,我已經習慣了所有的C位操作,所以現在我想隱藏它。我想隱藏位操作,不僅使我的代碼更具可讀性,而且使我們的硬件更改或新硬件更易於維護和修改。Atmel C引腳操作宏

所以我在問你,Atmel C的基本引腳操作最好的宏是什麼。

我要找的特點是:

  1. 設置PIN是輸入或輸出
  2. 設置輸出引腳高電平或低電平
  3. 讀取輸入引腳的值

所以我發現了一些我可以使用的宏,但沒有一個真正適合我的賬單。

鏈接:

http://www.piconomic.co.za/fwlib/group___a_v_r___p_i_o.html(仍然要保持每針數倍定義)

http://www.starlino.com/port_macro.html(不編譯,AVR Studio的6.2)

Changing a global variable in C(最好的一個,附近的頂部問題在「/ * LCD DEFINES * /」

我真的很喜歡這樣的事情:

#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 
} 

關於最乾淨的方法做到這一點的任何想法?

我可以處理保持每針額外幾個定義,但我覺得這不應該需要。 PA1和PB0不應該能夠告訴我們一切,或者它們是否被定義爲一個單一的值?

編輯:在Windows上使用愛特梅爾Studio的6.2

感謝, 羅布河

回答

2

算了這樣做編譯

http://www.starlino.com/port_macro.html

// 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); 
    ———————————————– 
*/ 

只是有一個錯字這我已經修好了