我正在尝试使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在右行亮起。
答案 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);
}
}
现在可行了