PIC18在跨端口分割时读/写数据

时间:2011-03-31 21:42:33

标签: c pic18

由于设计限制,我有一个内存控制器的地址线分为3个不同的PIC18F4550端口。 映射:

#define A0 PORTBbits.RB2
#define A1 PORTBbits.RB3
#define A2 PORTBbits.RB4
#define A3 PORTBbits.RB5
#define A4 PORTAbits.RA0
#define A5 PORTAbits.RÄ1
#define A6 PORTAbits.RÄ2
#define A7 PORTAbits.RÄ3
#define A8 PORTAbits.RÄ4
#define A9 PORTAbits.RÄ5
#define A10 PORTEbits.RE0
#define A11 PORTEbits.RE1
#define A12 PORTEbits.RE2

我想将此作为单个变量ADDRESS访问,并尝试使用联合来执行此操作,但只是通过以下方式获取“语法错误”:

union
{
        struct
        {
            A0 :1;
            A1 :1;
            A2 :1;
            A3 :1;
            A4 :1;
            A5 :1;
            A6 :1;
            A7 :1;
            A8 :1;
            A9 :1;
            A10 :1;
            A11 :1;
            A12 :1;
        };
} ADDRESS;

我该怎么做?

1 个答案:

答案 0 :(得分:0)

如果您使用的I / O被散列到多个端口,这将不是很容易。

您可以做的唯一简化是将内存管理为由三个不同地址块访问的页面:

lowAddr will be RB2:RB5
midAddr will be RA0:RA5
highAdd will be RE0:RE2

最好将较大的块用于低地址部分,以便内存页面可以更大。这里只有16个字节的页面。

因此,您可以定义一个位域结构,将您的内存管理为一个变量。

struct {
   uint16 lowAddr : 4;
   uint16 midAddr : 6;
   uint16 highAddr : 3;
   uint16 : 3;
} memoryAddr;

通过这种方式,您可以更有效地处理端口更新,例如portB:

LATB &= 0xFF ^ (3 << 2);
LATB |= memoryAddr.lowAddr << 2;