2016-12-06 5 views
0

У меня есть проблема с отображением 40 значений, отображаемых на 7 сегменте (40 компонентов 74HC595 каскада ссылка enter image description hereСПИ 74HC595 каскадные ATmega64

я реализую свою программу на Arduino и она хорошо работает Вот мой код:.

static const byte Pattern[] = { 
    B00010100, // 0 
    B00111111, // 1 
    B10011000, // 2 
    B00011010, // 3 
    B00110011, // 4 
    B01010010, // 5  
    B01010000, // 6 
    B00011111, // 7 
    B00010000, // 8 
    B00010010, // 9 
    B00010000}; // BLANK 


byte HC595_DS_POS = 2;  //Data pin (DS) pin location 

byte HC595_SH_CP_POS = 3; //Shift Clock (SH_CP) pin location 
byte HC595_ST_CP_POS = 4; //Store Clock (ST_CP) pin location 



void IE74595_Out(uint8_t *p, unsigned char n) 
{ 
    unsigned char i, j; 
    uint8_t b; 


    digitalWrite(HC595_ST_CP_POS,0); 
    digitalWrite(HC595_SH_CP_POS,0); 


    for(j=0;j<n;j++) 
    { 
    b = Pattern[*(p+n-j-1)]; // Lay byte cao nhat truoc 

    for(i=0;i<8;i++) 
    { 

     digitalWrite(HC595_SH_CP_POS,0); 

     if(b & 0b00000001) 
     { 

     digitalWrite(HC595_DS_POS,1); 

     } 
     else 
     { 

     digitalWrite(HC595_DS_POS,0); 

     } 

     digitalWrite(HC595_SH_CP_POS,1); 

     b=b>>1; //Now bring next bit at MSB position 

    } 
    } 


digitalWrite(HC595_ST_CP_POS,1); 

} 



void setup() 
{ 
    // put your setup code here, to run once: 
    pinMode(HC595_ST_CP_POS, OUTPUT); 
    pinMode(HC595_SH_CP_POS, OUTPUT); 
    pinMode(HC595_DS_POS, OUTPUT); 

} 

void loop() { 

    uint8_t Data[40]={2,5,1,3,2,1,3,6,1,9,4,8,1,7,0,5,1,2,5,6,5,4,1,4,1,8,1,3,1,9,5,6,4,5,6,2,6,1,0,2}; 


      IE74595_Out(Data,40); 


} 

а потом я переделал другую программу на Atmel студии, и я загрузить его через Extrem горелки и USBasp в моей карточке Вот мой код:

#define F_CPU 8000000UL 
#include <avr/io.h> 
#include <util/delay.h> 

static const uint8_t Pattern[] = { 
    0b00010100, // 0 
    0b00111111, // 1 
    0b10011000, // 2 
    0b00011010, // 3 
    0b00110011, // 4 
    0b01010010, // 5 
    0b01010000, // 6 
    0b00011111, // 7 
    0b00010000, // 8 
    0b00010010, // 9 
     0b00010000}; // BLANK 

#define output_low(port,pin) port &= ~(1<<pin) 
#define output_high(port,pin) port |= (1<<pin) 
#define set_input(portdir,pin) portdir &= ~(1<<pin) 
#define set_output(portdir,pin) portdir |= (1<<pin) 

#define HC595_DS_POS PC4 //Data pin (DS) pin location 
#define HC595_SH_CP_POS PC5 //Shift Clock (SH_CP) pin location 
#define HC595_ST_CP_POS PC6 //Store Clock (ST_CP) pin location 



#define HC595_PORT PORTC 
#define HC595_DDR DDRC 


void IE74595_Out(uint8_t *p, unsigned char n) 
{ 
    unsigned char i, j; 
    uint8_t b; 

    output_low(HC595_PORT,HC595_ST_CP_POS); 
    output_low(HC595_PORT,HC595_SH_CP_POS); 


    for(j=0;j<n;j++) 
    { 
     b = Pattern[*(p+n-j-1)];// Lay byte cao nhat truoc 


     for(i=0;i<8;i++) 
     { 
      output_low(HC595_PORT,HC595_SH_CP_POS); 

      if(b & 0b00000001) 
      { 

       output_high(HC595_PORT,HC595_DS_POS); 

      } 
      else 
      { 

       output_low(HC595_PORT,HC595_DS_POS); 

      } 

      output_high(HC595_PORT,HC595_SH_CP_POS); 
      b=b>>1; 

     } 
    } 


    output_high(HC595_PORT,HC595_ST_CP_POS); 
} 

int main(void) 
{ 
    set_output(DDRC,HC595_DS_POS); 
    set_output(DDRC,HC595_SH_CP_POS); 
    set_output(DDRC,HC595_ST_CP_POS); 

    uint8_t Data[40]={5,9,1,6,1,1,0,9,1,7,1,5,4,2,6,2,8,7,0,7,1,2,3,5,1,5,4,2,1,7,5,9,1,9,4,8,1,5,2,9}; 


while (1) 
{ 


    IE74595_Out(Data,40); 
     return 1; 


} 


} 

Вот моя карточка enter image description here

Дисплей не так в Arduino я только последнее значение отображается

Я разработал свою электронную карту в Китае.

Является ли проблема материала ???

Единственное различие между этими двумя программами является: DigitalWrite() на Arduino И Output_High() или output_low на Atmel

ли реализация DigitalWrite == Output_high() или output_low() ????

Должен ли я написать последнюю инструкцию Return 1; после этого ????

Спасибо-х

+0

ли вы правильный разделительный конденсатор для каждого сдвига зарегистрироваться? Кроме того, 'digitalWrite' примерно в 80 раз медленнее, чем' sbi'/'cbi' инструкции, поэтому отсутствие развязки может быть проблемой. Особенно для таких токов (половина всех сегментов On @ 20mA => 3.2A и всех сегментов On => 6.4A). – KIIV

+0

Нет, я использую электронную карту, которую я разработал в Китае – khaloud1980

+0

Я нахожу решение – khaloud1980

ответ

-1

10К выпадающий резистор на SS (Slave Select) предназначена для поддержания регистров с тактовой частотой в битах, а главный процессор загружается, а линия SS может быть «плавающей» и в неопределенное состояние.

Здесь the date sheet of 74hc595

Вызов SPI.transfer() посылает байт в регистр (бит за один раз), а затем в результате чего Защелка (иначе известный как SS или ST) высоковольтной линии вызывает данные для передачи из внутренней памяти регистра на выходные выводы.

штыревые соединения

соединения контактов для Uno и аналогичные: