题
我正在使用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
的比特顺序。
不隶属于 StackOverflow