2

我正在使用 mikroC 对 pic16f84a 进行编程,并且我具有以下功能

volatile unsigned short d;  // global variable

void put_data(){
    RA3_bit = d & 1;
    d >>= 1;
    RA4_bit = d & 1;
    d >>= 1;
    PORTB.B0 = d & 1;
    d >>= 1;
    PORTB.B1 = d & 1;
    d >>= 1;
    PORTB.B2 = d & 1;
    d >>= 1;
    PORTB.B3 = d & 1;
    d >>= 1;
    PORTB.B4 = d & 1;
    d >>= 1;
    PORTB.B5 = d & 1;
}

此函数从 d(8 位)中取出每一位并将其输出到端口引脚 RA3、RA4、RB0、...、RB5。

我该如何优化这段代码,而内存是我最关心的问题。

更新::

来自 pic16f84a.h:

volatile unsigned char           PORTA               @ 0x005;
// bit and bitfield definitions
volatile bit RA0                 @ ((unsigned)&PORTA*8)+0;
volatile bit RA1                 @ ((unsigned)&PORTA*8)+1;
volatile bit RA2                 @ ((unsigned)&PORTA*8)+2;
volatile bit RA3                 @ ((unsigned)&PORTA*8)+3;
volatile bit RA4                 @ ((unsigned)&PORTA*8)+4;

volatile unsigned char           PORTB               @ 0x006;
// bit and bitfield definitions
volatile bit RB0                 @ ((unsigned)&PORTB*8)+0;
volatile bit RB1                 @ ((unsigned)&PORTB*8)+1;
volatile bit RB2                 @ ((unsigned)&PORTB*8)+2;
volatile bit RB3                 @ ((unsigned)&PORTB*8)+3;
volatile bit RB4                 @ ((unsigned)&PORTB*8)+4;
volatile bit RB5                 @ ((unsigned)&PORTB*8)+5;
volatile bit RB6                 @ ((unsigned)&PORTB*8)+6;
volatile bit RB7                 @ ((unsigned)&PORTB*8)+7;

我可以使用头文件中的这些值来使函数在循环中包含几行代码吗?

4

2 回答 2

3

假设 PORTB.B0 到 PORTB.B5 是输出端口的位,这样做可能会更快:


volatile unsigned short d;  // global variable

void put_data(){
    RA3_bit = d & 1;
    d >>= 1;
    RA4_bit = d & 1;
    d >>= 1;

    PORTB &= 0x3F; // Mask out the low 6 bits
    PORTB |= d & 0x3f;  // Or in the low 6 bits of d

    // Clean out the bits if needed in d
    d >>= 6;
}

我希望汇编程序的输出速度大约是您现在正在执行的速度的两倍,甚至可能更多。对前 2 条指令的第 3 位和第 4 位进行或运算可能不值得对端口内的位位置进行操作。不过可以肯定的是,请务必仔细检查汇编程序的输出。汇编器的操作码非常简单,可以很快确认。

于 2012-05-22T21:19:01.120 回答
1

读取 A 和 B 的 PORT 或 LAT 寄存器的当前值。如果该 PIC 同时具有 PORT 和 LAT,了解区别很重要,因此如果您不确定使用哪个,我建议您进行一些研究。

然后进行必要的移位和屏蔽,以确保只更改适当的引脚,并且只执行两次写入操作,一次写入端口 A,一次写入端口 B。

或者,如果端口 A 和 B 上的所有其他引脚都通过与每个端口关联的 TRIS 寄存器设置为输入,则跳过读取步骤。

例如:

tmp = PORTA;
tmp = (tmp & 0xFC) | (d & 0x3);
PORTA = tmp;

tmp = PORTB;
tmp = (tmp & 0xE0) | ((d >> 2) & 0x1F);
PORTB = tmp;

我认为这实际上会给你与你的代码相反的位顺序,所以你可能需要“反转”位操作,或者d在使用该代码之前翻转位顺序。

此外,我不能保证这实际上会产生更快的 PIC 代码。如果您真的需要绝对最快的方法,您可能需要编写几行汇​​编。

于 2012-05-22T21:23:10.590 回答