c - 如何使用c和pic16f84a优化这段代码?

标签 c pic mikroc

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

相关文章:

c - 将指针传递给指针数组作为参数

c - c 中的矩阵和对角线任务

c - PIC 中的去抖动按钮

c - MikroC,绘制线图

c - 在 MikroC 上将存储体数量设置为 8

c - 从开发人员命令提示符或 C 语言中的 MVS 编译 DLL 库之间的区别

c - 是否应该使用 C 中的文字初始化具有指定大小的静态声明的字符数组?

c - 七段显示滚动

c++ - 将数据从 PC 发送到微 Controller

c - PIC16F1937 和 UART : keep led ON while receiving