【问题标题】:How to declare a matrix that is stored in PROGMEM如何声明存储在 PROGMEM 中的矩阵
【发布时间】:2019-04-20 14:59:39
【问题描述】:

我正在尝试编写一个可以驱动 LED 矩阵的头文件,但我遇到了无法解决的语法错误

我已经在我认为有必要的地方添加了“;”并检查了https://www.nongnu.org/avr-libc/user-manual/pgmspace.html

#ifndef max7219_H_
#define max7219_H_

#include <io.h>
#include <pgmspace.h>
#include <delay.h>
#include <stdint.h>

#define SLAVE_SELECT PORTB &= ~( 1<<PB4 );     
#define SLAVE_DESELECT PORTB |= ~( 1<<PB4 ); 

char characters[96][5] PROGMEM = 
{ 
   {
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000 
    }  
};

错误是: 错误: max7219.h(15), #included from: p2.c: ';'预计

第 15 行是 char 字符[96][5] PROGMEM = ...

【问题讨论】:

  • 你能把0b00000000改成0试试吗?
  • char characters[96][5] PROGMEM 无效。为什么要添加PROGMEM
  • @PaulOgilvie 你知道 AVR gcc 端口吗?
  • 我看到 &lt;avr/pgmspace.h&gt; 正在被使用
  • 顺便说一句,前面的宏可能不应该有尾随;,否则if不带大括号很容易出错...

标签: c avr atmega16 codevisionavr


【解决方案1】:
const PROGMEM uint8_t characters[96][5] = {
    {
      0b00000000,
      0b00000000,
      0b00000000,
      0b00000000,
      0b00000000 
   },
    ... // 95 more symbols
 };

注意,如果一个数组声明了维度,它应该包含初始化器中的所有数据,即所有 96 个符号。

UPD: 错误可能是由pc2.c#include "max7219.h" 之前的代码引起的 如果您有多个“包含”,请检查前一个。即:

#include "a.h"
#include "b.h"
#include "max7219.h"

错误可能在b.h的末尾

【讨论】:

    【解决方案2】:

    您需要将其声明为 const 才能放入 flash。另外我猜你需要制作两个数组。

    试试:

         const char c1[] PROGMEM = "1";
         const char c2[] PROGMEM = "2";
    
         const char * const strings[] PROGMEM = {c1, c2};
    

    【讨论】:

    • 那个也不起作用,我认为 CodeVison AVR 有一些特别之处......经过更多的摆弄后,我摆脱了错误,答案是在声明开始时移动 PROGMEM像这样:PROGMEM char characters[96][5]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多