0

我不确定这个问题是否应该问电子学,但因为它是关于编程的,所以我在这里问了。

我正在使用由移位寄存器而不是 7 段显示器供电的 LED 制作数字时钟。无论如何,在使用CCS编译代码时,我收到以下错误:

***Error 71 "test.c" Line 195(0,1) Out of ROM, A segment or the program is too large  num
Seg 00004-007FF, 07DC left, need 07EA
Seg 00000-00003, 0000 left, need 07EA

到目前为止,这是我的代码:

#include <16f628a.h>
#use delay (crystal=32768)

//to display a number on the LEDs using the 74164 shift register accordingly
void num(int rnum, char out, char clk) {
   
//start clear shift register   
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
//end clear shift register
   
   switch(rnum) {
      case 0:
         output_high(out);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_low(out);
         output_high(clk);
         output_low(clk);
         output_high(out);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_low(out);
         
         break;
      case 1:
         output_low(out);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_high(out);
         output_high(clk);
         output_low(clk);
         output_low(out);
         output_high(clk);
         output_low(clk);
         output_high(out);
         output_high(clk);
         output_low(clk);
         output_low(out);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         break;
      case 2:
         output_high(out);//7
         output_high(clk);
         output_low(clk);
         output_low(out);//6
         output_high(clk);
         output_low(clk);
         output_high(out);//5
         output_high(clk);
         output_low(clk);
         output_high(clk);//4
         output_low(clk);
         output_high(clk);//3
         output_low(clk);
         output_low(out);//2
         output_high(clk);
         output_low(clk);
         output_high(out);
         output_high(clk);
         output_low(clk);
         output_low(out);
         output_high(clk);
         output_low(clk);
      break;
      case 3:
         output_high(out);//7
         output_high(clk);
         output_low(clk);
         output_high(clk);//6
         output_low(clk);
         output_high(clk);//5
         output_low(clk);
         output_low(out);//4
         output_high(clk);
         output_low(clk);
         output_high(out);//3
         output_high(clk);
         output_low(clk);
         output_low(out);//2
         output_high(clk);
         output_low(clk);
         output_high(out);//1
         output_high(clk);
         output_low(clk);
         output_low(out);
         output_high(clk);
         output_low(clk);
      break;
      case 4:
         output_high(out);//7
         output_high(clk);
         output_low(clk);
         output_high(out);//6
         output_high(clk);
         output_low(clk);
         output_low(out);//5
         output_high(clk);
         output_low(clk);
         output_low(out);//4
         output_high(clk);
         output_low(clk);
         output_high(out);//3
         output_high(clk);
         output_low(clk);
         output_high(out);//2
         output_high(clk);
         output_low(clk);
         output_low(out);//1
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
      break;
      case 5:
         output_low(out);//7
         output_high(clk);
         output_low(clk);
         output_high(out);//6
         output_high(clk);
         output_low(clk);
         output_high(out);//5
         output_high(clk);
         output_low(clk);
         output_low(out);//4
         output_high(clk);
         output_low(clk);
         output_high(out);//3
         output_high(clk);
         output_low(clk);
         output_high(out);//2
         output_high(clk);
         output_low(clk);
         output_high(out);//1
         output_high(clk);
         output_low(clk);
         output_low(out);//reset
         output_high(clk);
         output_low(clk);
      break;
   }
}

//==============================


void main() {
   while(true) {
      num(0, pin_a1, pin_a0);
      delay_ms(2000);
      num(1, pin_a1, pin_a0);
      delay_ms(2000);
      num(2, pin_a1, pin_a0);
      delay_ms(2000);
      num(3, pin_a1, pin_a0);
      delay_ms(2000);
      num(4, pin_a1, pin_a0);
      delay_ms(2000);
      num(5, pin_a1, pin_a0);
      delay_ms(2000);
   }
}

关于我是这个主题的新手,有人可以帮我解决这个问题吗?

4

2 回答 2

0

您的编译指示/编译器/链接器设置似乎表明您正在构建 XXk 大小的 ROM/EEPROM,但您的程序需要一个大于 XXk 大小的设备。查找设置目标设备大小的配置和/或头文件设置。

于 2012-03-11T19:16:04.530 回答
0

我不太确定您对这段代码的功能有何看法,但错误可能完全按照说明的原因(ROM 不足、A 段或程序太大)。

当您使用“output_high”时,会使用程序内存,这意味着所有这些“output_high() 和 output_low()”都会占用太多空间。PIC12F628 只有 2048 字程序存储器。

尝试使用“output_x ()”直接写入整个端口,在其中以十六进制输入整个端口的值。

例如,您将写信给

  1. 输出高(PIN_A0)
  2. 输出低(PIN_A1)
  3. 输出低(PIN_A2)
  4. 输出低(PIN_A3)
  5. 输出低(PIN_A4)
  6. 输出低(PIN_A5)
  7. 输出高(PIN_A6)
  8. 输出高(PIN_A7)

那么最好写'output_a(0xC1)。发生的情况完全相同,但是您使用的程序内存更少。

引脚分开有

  1. PIN_A0 (0x01) // 1
  2. PIN_A1 (0x02) // 2
  3. PIN_A2 (0x04) // 4
  4. PIN_A3 (0x08) // 8
  5. PIN_A4 (0x10) // 16
  6. PIN_A5 (0x20) // 32
  7. PIN_A6 (0x40) // 64
  8. PIN_A7 (0x80) // 128

但是当你合并它们时,你必须学习如何添加十六进制。

将门的所有引脚视为二进制数

 **Hex: Dec   Bin:**
  1. 0 0 0000 0000
  2. 1 1 0000 0001
  3. 2 2 0000 0010
  4. 3 3 0000 0011
  5. 4 4 0000 0100
  6. 5 5 0000 0101
  7. 6 6 0000 0110
  8. 7 7 0000 0111
  9. 8 8 0000 1000
  10. 9 9 0000 1001
  11. 10 0000 1010
  12. 乙 11 0000 1011
  13. C 12 0000 1100
  14. 13 0000 1101
  15. 14 0000 1110
  16. F 15 0000 1111

示例 1。

  1. 输出高(PIN_A0)
  2. 输出高(PIN_A1)
  3. 输出高(PIN_A2)
  4. 输出低(PIN_A3)
  5. 输出低(PIN_A4)
  6. 输出低(PIN_A5)
  7. 输出低(PIN_A6)
  8. 输出低(PIN_A7)

最好写 'output_a(0x07).

示例 2。

  1. 输出高(PIN_A0)
  2. 输出低(PIN_A1)
  3. 输出低(PIN_A2)
  4. 输出高(PIN_A3)
  5. 输出低(PIN_A4)
  6. 输出低(PIN_A5)
  7. 输出低(PIN_A6)
  8. 输出高(PIN_A7)

添加 PIN_A7 与 PIN_A3 和 PIN_A0:128+8+1=137 hex(0x89) bin(10001001)。

我认为这应该足以让您知道如何编写程序以节省程序内存。

最好的问候 // 汤米 Hjertezén

于 2021-03-10T16:42:42.820 回答