• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
IO22D08 sterowanie oraz biblioteka
#8
Zbudowałem sobie taki LCD na dwóch modułach HC595, ja akurat mam tylko wspólną anodę. Przykładowy kod wygląda tak:
Kod:
#include <SPI.h>
uint8_t bajt1=0b11110000, bajt2=0b11111111;
const uint8_t latch=10;
//const uint8_t data=11;
//const uint8_t clock=13;
void setup() {
  // put your setup code here, to run once:
pinMode(latch,OUTPUT);
//pinMode(data,OUTPUT);
//pinMode(clock,OUTPUT);
SPI.begin();
SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(latch, LOW);
bajt2++;
bajt1--;

//uint8_t bajttemp1=0, bajttemp2=0;
//uint8_t maska1= 0b01010101;
//bajttemp1=bajt1 & maska1;
//bajttemp2=bajt2 & (~maska1);
//bajttemp1=bajttemp1 | bajttemp2 ;
//uint32_t start1=micros();
//  SPI.transfer(bajttemp1);
//  SPI.transfer(bajttemp2);
  SPI.transfer(bajt2);
  SPI.transfer(bajt1);
// delay(20);
//     shiftOut(data, clock, MSBFIRST, bajt1++);
//     shiftOut(data, clock, MSBFIRST, bajt2++);
digitalWrite(latch, HIGH);
  uint32_t stop1=micros();
//Serial.println((uint32_t)stop1-start1);
delay(100);


}
Chodziło tylko o odpalenie led, żadnego sensu lingwistycznego tu nie ma, sprawdziłem tylko, że shiftOut trwa około 200us, wysłanie sprzętowym SPI około 12us. Od biedy takie programowe daje radę, uC coś tam jeszcze zrobi oprócz wyświetlania. Lepiej wykorzystać SPI.
Co do przeniesienia bitów, to takie najprostsze, czyli bierzemy 5 bitów z jednego bajtu i 3 z drugiego, maskujemy sklejamy i wysyłamy zadziała tylko wtedy, gdy bity są na swoim miejscu, a tylko w różnych HC. Może być tak, że bit jest A i B jest na bicie 1 w różnych HC, wtedy trzeba go po pobrać, przesunąć i skleić, potem tak kolejne. Ilość operacji rośnie. Dodatkowe bity mogą być wymieszane również wewnątrz danego HC, wtedy nie zadziałają gotowe zestawy bitów poukładane w ładne tablice do użycia na typowych ekranach. Prościej napisać nowe układy znaków dla tej pomieszanej konfiguracji niż za każdym razem je sortować. Jak jest wspólna katoda to jest gotowy zestaw dla 16 znaków HEX + kropka do doklejenia:
uint8_t digit[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0b10000000};
A ja w swoim układzie po prostu wysyłam odwrotność takiego bajtu, bo moje świecą zwarte do GND.
I demo wyświetlenia wszystkich cyfr, bez wysyłania w przerwaniu:
Kod:
#include <SPI.h>
uint8_t bajt1=0b11110000, bajt2=0b11111111;
const uint8_t latch=10;

uint8_t digit[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0b10000000};
void setup() {
  // put your setup code here, to run once:
pinMode(latch,OUTPUT);

SPI.begin();
SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));

}

void loop() {
  // put your main code here, to run repeatedly:
static int c=0;


bajt1++;

for (int i=0;i<50;i++) //na 1s
{
  bajt2=1;
  for (int j=0;j<4;j++)
  {
   
  digitalWrite(latch, LOW);
  SPI.transfer(bajt2);
  int d=(((c+j)>16)?(c):(c+j)) ;
  SPI.transfer(~(digit[d]|0b10000000));
 
  digitalWrite(latch, HIGH);
 
 
  bajt2=bajt2<<1;
   delay(5);
  }
}

if (c<15)c++; else c=0;


}
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Wiadomości w tym wątku
IO22D08 sterowanie oraz biblioteka - przez Nnew - 27-12-2020, 23:57
RE: IO22D08 sterowanie oraz biblioteka - przez Nnew - 30-12-2020, 05:15
RE: IO22D08 sterowanie oraz biblioteka - przez Nnew - 31-12-2020, 03:07
RE: IO22D08 sterowanie oraz biblioteka - przez Nnew - 31-12-2020, 03:11
RE: IO22D08 sterowanie oraz biblioteka - przez kaczakat - 04-01-2021, 08:52
RE: IO22D08 sterowanie oraz biblioteka - przez T0M3K - 27-02-2021, 18:55

Skocz do:


Przeglądający: 1 gości