Как подключить светодиодный дисплей shd0032?

stumpy
Offline
Зарегистрирован: 31.01.2015

Есть четырехразрядный дисплей SHD0032 - http://www.smartmodule.ru/0032.html

Обычно в сети рассказывают о том, что нужно просто подавать питание на каждый светодиод дисплея, но здесь все как то подругому.

Нигде в сети не могу найти информацию как правильно его подключить и вывести какие-нибудь данные.

stumpy
Offline
Зарегистрирован: 31.01.2015

использую arduino uno

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

По вашей же ссылке

"Контроллер дисплея представляет собой 32-разрядный сдвиговый регистр"

И временная диаграмма есть. Почитайте про подключение сдвиговых регистров, 74hc595 обычно подключают к ардуине. 

stumpy
Offline
Зарегистрирован: 31.01.2015

да, я уже понял, что это так называется. К сожалению я не очень хорошо умею программировать и первый раз сталкиваюсь с подобным.

Я уже понял как правильно подключить экран, однако выводить осмысленную информацию пока не получается.

Скорее всего я разберусь и смогу сделать по образцу, если кто-нибудь подскажет что здесь не так и что поправить для вывода, например, числа 1000.

Я использую вот этот код:

#define DATAOUT 11 //MOSI
#define DATAIN 12 //MISO
#define SPICLOCK 13 //sck
#define SLAVESELECT 10 //ss

char spi_transfer(volatile char data)
{
SPDR = data;                    // Start the transmission
while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
{
};
return SPDR;                    // return the received byte
}

void setup()
{
byte clr;
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK, OUTPUT);
pinMode(SLAVESELECT, OUTPUT);
digitalWrite(SLAVESELECT, HIGH); //disable device

//interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
//sample on leading edge of clk,system clock/64 
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);
clr=SPSR;
clr=SPDR;
delay(10);
write_led_numbers(0x78,0x78,0x78,0x78); //Blank display
write_led_decimals(0x00); // All decimal points off
}

void write_led_decimals(int value)
{
  digitalWrite(SLAVESELECT, LOW);
  delay(10);
  spi_transfer(0x77);     // Decimal Point OpCode
  spi_transfer(value);    // Decimal Point Values
  digitalWrite(SLAVESELECT, HIGH); //release chip, signal end transfer
}
void write_led_numbers(int digit1, int digit2, int digit3, int digit4)
{
  digitalWrite(SLAVESELECT, LOW);
  delay(10);
  spi_transfer(digit1);    // Thousands Digit
  spi_transfer(digit2);    // Hundreds Digit
  spi_transfer(digit3);    // Tens Digit
  spi_transfer(digit4);    // Ones Digit
  digitalWrite(SLAVESELECT, HIGH); //release chip, signal end transfer
}
void write_led(unsigned short num, unsigned short base, unsigned short pad)
{
   unsigned short digit[4] = { 0, ' ', ' ', ' ' };
   unsigned short place = 0;

   if ( (base<2) || (base>16) || (num>(base*base*base*base-1)) ) {
       write_led_numbers(' ', 0x00, 0x0f, ' ');  // indicate overflow
   } else {
       while ( (num || pad) && (place<4) ) {
           if ( (num>0)  || pad )
               digit[place++] = num % base;
           num /= base;
       }
       write_led_numbers(digit[3], digit[2], digit[1], digit[0]);
   }
}

void loop()
{
//for (int i = 0; i < 9999; i++) { 
    write_led (1000,10,0);
    delay(1);
//  }

}