LED矩阵(HUB-75型)

时间:2017-07-07 14:43:38

标签: arduino led

我正在尝试使64x64 LED矩阵在没有库的情况下工作。用STM32F103C8T6芯片开始驱动它想出了问题并尝试了ATmega328,但没有任何改变。

问题在于,当我试图点亮指定地址的LED时,它实际亮起的亮度几乎为0,但正下方的LED(在下一个地址上)以全亮度点亮。

我将代码减少到最低限度。

#define CLK 0
#define LAT 1
#define R1 2

uint16_t data [64][4];

void shiftOutLed (void);

int main () {
 data [0][0] = 0x0001;
 data [0][2] = 0x1800;
 DDRC |= 0x0F; //pin 0 - A, pin 1 - B, pin 2 - C, pin3 - D
 DDRB |= 0x03; // pin 0 - CLK, pin 1 - LAT
 DDRD |= 0x04; // pin 2 - R1

 while (1){
  shiftOutLed ();     
 }
}

 void shiftOutLed (void){
  for (uint8_t _addr = 0; _addr < 16; _addr++){
   PORTC &= 0xF0;
   PORTC |= _addr;
   for (uint8_t _byte = 0; _byte < 4; _byte++){
    for (uint8_t _bit = 0; _bit < 16; _bit++){
     if (data[_addr][_byte] & (1 << _bit)) PORTD |= (1 << R1);
     else PORTD &= ~(1 << R1);
     PORTB |= (1 << CLK);
     PORTB &= ~(1 << CLK);
    }
   }
   PORTB |= (1 << LAT);
   PORTB &= ~(1 << LAT);
   PORTD &= ~(1 << R1);
  }
}

当我修改代码时,在时钟和锁存时引入延迟,每一位LED在右行亮起。

1 个答案:

答案 0 :(得分:0)

似乎矩阵需要在计时整行后设置地址

#define CLK 0
#define LAT 1
#define R1 2

uint16_t data [64][4];

void shiftOutLed (void);

int main () {
 data [0][0] = 0x0001;
 data [0][2] = 0x1800;
 DDRC |= 0x0F; //pin 0 - A, pin 1 - B, pin 2 - C, pin3 - D
 DDRB |= 0x03; // pin 0 - CLK, pin 1 - LAT
 DDRD |= 0x04; // pin 2 - R1

 while (1){
  shiftOutLed ();     
 }
}

 void shiftOutLed (void){
  for (uint8_t _addr = 0; _addr < 16; _addr++){
   PORTC &= 0xF0;
   for (uint8_t _byte = 0; _byte < 4; _byte++){
    for (uint8_t _bit = 0; _bit < 16; _bit++){
     if (data[_addr][_byte] & (1 << _bit)) PORTD |= (1 << R1);
     else PORTD &= ~(1 << R1);
     PORTB |= (1 << CLK);
     PORTB &= ~(1 << CLK);
    }
   }
   PORTC |= _addr;
   PORTB |= (1 << LAT);
   PORTB &= ~(1 << LAT);
   PORTD &= ~(1 << R1);
  }
}

现在可行了