我正在使用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 位进行或操作可能不值得对端口内的位位置进行操作。但可以肯定的是,请务必仔细检查汇编器输出。您的汇编器的操作码非常简单,可以很快确认。
关于c - 如何使用c和pic16f84a优化这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10710087/