我正在使用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;
.

我可以从标题文件中使用这些值,使循环中的函数几行代码?

有帮助吗?

解决方案

假设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位可能不值得它对端口内的位的位置。虽然,请务必仔细检查汇编器输出。汇编程序的操作码很简单,确认它会很快。

其他提示

阅读A&B端口或LAT寄存器的当前值。如果该PIC有Port&Lat,那么了解差异很重要,所以我建议您做一些研究如果您不确定使用哪种研究。

然后,执行所需的移位和屏蔽,以确保只更改适当的引脚,只需两个写入操作,一个到端口A和P端口B.

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

所以例如:

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

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

我认为它实际上将从代码所做的情况下给你相反的比特顺序,因此您可能需要在使用该代码之前“反转”比特操纵,或者在使用该代码之前替代地翻转d的比特顺序。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top