2012-08-12 65 views
2

在微芯片C30編譯我可以設置銷的i /使用LAT O值以這種方式寄存器:[ANSI C]通行證bitifield作爲參考

LATBbits.LATB10=1; 

LATBbits定義爲:

typedef struct tagLATBBITS { 
    unsigned LATB0:1; 
    unsigned LATB1:1; 
    unsigned LATB2:1; 
    unsigned LATB3:1; 
    unsigned LATB4:1; 
    unsigned LATB5:1; 
    unsigned LATB6:1; 
    unsigned LATB7:1; 
    unsigned LATB8:1; 
    unsigned LATB9:1; 
    unsigned LATB10:1; 
    unsigned LATB11:1; 
    unsigned LATB12:1; 
    unsigned LATB13:1; 
    unsigned LATB14:1; 
    unsigned LATB15:1; 
} LATBBITS; 
extern volatile LATBBITS LATBbits __attribute__((__sfr__)); 

我目標是寫可以使用LAT寄存器作爲參數設定的I/O值的函數,在僞代碼:

void setPin(unsigned int* latReg, unsigned int value){ 
    (*latReg)=value; 
} 

setPin(&LATBbits.LATB10, 1); 

不幸的是此代碼不會編譯是因爲「無法獲取位域'LATB10'的地址」。

我需要它,因爲我想實現一個可以處理端口擴展器的simil類庫。每個端口擴展器可以有不同的引腳,所以我需要配置它,我認爲做這樣的事情:

typedef struct sPortExpander{ 
    unsigned int* CS; 
    unsigned int* SPBUFF; 
    ecc... 
} PortExpander 

void PortExpander_setOutput(PortExpander p, unsigned char value){ 
    (*p.CS)=0; 
    // Send SPI data 
    (*p.CS=1); 
} 

這樣,我可以管理多個端口擴展。

那麼,有一種方法可以做我想做的事情嗎?

謝謝。

+0

爲什麼不能使用宏? – ouah 2012-08-12 12:45:48

+0

@ouah:我已更新我的問題。 – blow 2012-08-12 13:00:53

回答

1

聲明結構爲__attribute__((packed)),然後使用:

void function setPin(struct LATBBITS *reg, unsigned int fieldno, unsigned int value){ 
    if (value) 
     *(uint16_t *)reg |= (1 << fieldno); 
    else 
     *(uint16_t *)reg &= ~(1 << fieldno); 
} 
+0

這個作品謝謝你。 – blow 2012-08-12 13:23:30

+0

@blow沒問題:) – 2012-08-12 13:28:06