2017-07-07 140 views
0

我試圖讓沒有庫的64x64 LED矩陣工作。開始用STM32F103C8T6芯片驅動它找出問題並嘗試使用ATmega328,但沒有任何改變。LED矩陣(HUB-75型)

問題是,當我試圖點亮指定地址上的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

好像矩陣需要時鐘整行後設置的地址

#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); 
    } 
} 

現在,它的工作原理

+0

的順序應該是:1)時鐘出了第2行)領帶OE到Vcc 3)集地址4)鎖存選通5)將OE綁定到gnd – Questdoino