Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Arduino uno i programowanie wyświetlacza.. Pytanie odnośnie transferu danych

kosiner 25 Mar 2020 16:01 330 6
  • #1
    kosiner
    Level 8  
    Witam,

    mam problem z moim wyświetlaczem od radia. Otóż problem polega na tym, że muszę za każdym razem wysyłać na nową cała instrukcję do rysowania mojego wyświetlacza. Wyświetlacz jest oparty o protokół SPI(?). Jest to wyświetlacz wyjęty z radia samochodowego i jest on oparty o scalak SC6523. Znalazłem jego notę katalogową http://www.stanson.ch/files/AutomotivePC/Front_panel/LCD-driver-156segs-PT6523.pdf

    Mój kod: [Zapożyczony]
    Code:

    /*Begining of Auto generated code by Atmel studio */
    // VFD_in 7
    // VFD_clk 8 /
    // VFD_stb 9
    #include <WString.h>
    //*************************************************/


    #define LCD_in 7  // This is the pin number 7 on Arduino UNO
    #define LCD_clk 8 // This is the pin number 8 on Arduino UNO
    #define LCD_stb 9 // This is the pin number 9 on Arduino UNO



    //*************************************************//
    void setup() {
      pinMode(LCD_clk, OUTPUT);
      pinMode(LCD_in, OUTPUT);
      pinMode(LCD_stb, OUTPUT);
     
      pinMode(13, OUTPUT);
     
      Serial.begin(9600);
     
      digitalWrite(LCD_stb, LOW);
      delayMicroseconds(5);
      digitalWrite(13, LOW);
      delay(500);
      digitalWrite(13, HIGH);
      delay(500);
      digitalWrite(13, LOW);
      delay(500);
      digitalWrite(13, HIGH);
      delay(500);




    }

    void send_char_without(unsigned char a)
    {
    unsigned char data = 170; //value to transmit, binary 10101010
    unsigned char mask = 1; //our bitmask
      data=a;
      for (mask = 00000001; mask>0; mask <<= 1) {
      digitalWrite(LCD_clk, LOW);
      delayMicroseconds(5);
        if (data & mask){
          digitalWrite(LCD_in, HIGH);
        }
        else{
          digitalWrite(LCD_in, LOW);
        }
       
        digitalWrite(LCD_clk,HIGH);
        delayMicroseconds(5);
      }
     
    }
    void send_char_8bit_stb(unsigned char a)
    {
    //
    unsigned char transmit = 15; //define our transmit pin
    unsigned char data = 170; //value to transmit, binary 10101010
    unsigned char mask = 1; //our bitmask
    int i = -1;
      data=a;
      // This lines is because the clk have one advance in data, see datasheet of sn74HC595
      // case don't have this signal instead of "." will se "g"
      for (mask = 00000001; mask>0; mask <<= 1) { //iterate through bit mask
       i++;
       digitalWrite(LCD_clk, LOW);
      delayMicroseconds(5);
        if (data & mask){ // if bitwise AND resolves to true
          digitalWrite(LCD_in, HIGH);
          //Serial.print(1);
        }
        else{ //if bitwise and resolves to false
          digitalWrite(LCD_in, LOW);
          //Serial.print(0);
        }
        digitalWrite(LCD_clk,HIGH);// need invert the signal to allow 8 bits is is low only send 7 bits
        delayMicroseconds(1);
        if (i==7){
        digitalWrite(LCD_stb, HIGH);
        delayMicroseconds(2);
        }
        //Serial.println(" ");
       
      }
    }

    void patternLCD(){
    //send total of 156 bits, the 4 last bits belongs to DR, SC, BU, X;
    digitalWrite(LCD_stb, LOW); //
    delayMicroseconds(2);
    send_char_8bit_stb(0B01000001); // firts 8 bits is address, every fixed as (0B010000001), see if clk finish LOW or HIGH Very important!

    send_char_without(0B11111111);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000); 
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);

    delayMicroseconds(2);
    digitalWrite(LCD_stb, LOW); //
    delayMicroseconds(2);
    }

    void loop() {
     
      patternLCD();
      delay(5000);
    }


    Efekt na wyświetlaczu: Arduino uno i programowanie wyświetlacza.. Pytanie odnośnie transferu danych
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    ArturAVS
    Moderator of HydePark/Cars
    kosiner wrote:
    Otóż problem polega na tym, że muszę za każdym razem wysyłać na nową cała instrukcję do rysowania mojego wyświetlacza.

    Po wysłaniu "screena", aby odświeżyć/zmienić zawartość wyświetlacza wysyłaj tylko to co w międzyczasie się zmieniło. Robisz w programie flagę, która sygnalizuje że wartość zmiennych się zmieniła i należy odświeżyć zawartość lcd. Po odświeżeniu, kasujesz flagę i program sprawdza czy nie jest ponownie ustawiona. Nie ma sensu w sposób ciągły rysować całego lcd, zajmie to większość czasu procka.
  • #3
    kosiner
    Level 8  
    @ArturAVS Właśnie chodzi o to że nie mam pojęcia jak to zrobić. Również w Datasheet nie ma nic o tym, aby zmienić tylko to co się chce w danej chwili.

    Ale chyba chodzi Ci o to, że wysyłam pierwszy raz aby coś się narysowało a później jak coś chce narysować wysyła kolejną ramkę z tymi zmienionymi danymi.
  • #5
    kosiner
    Level 8  
    @ArturAVS Miałbyś jakiś pomysł aby literki zakodować? W sensie wiadomo, definiujemy raz daną literkę i przesuwamy się jakimś wskaźnikiem gdzie chcemy włożyć tą literkę, u mnie jeden segment zajmuje 13 bitów. Czyli ramka u mnie wygląda tak:
    [Jakiś znak na wyświetlaczu, jakiś znak na wyświetlaczu] [13 bitowy segment: [0][0][0][0][0][0][0][0][0][0][0][0][0] ]
    [Jakiś znak na wyświetlaczu][Jakiś znak na wyświetlaczu] [13 bitowy segment: [0][0][0][0][0][0][0][0][0][0][0][0][0] ]
    [Napis MUTE][Napis INT] [13 bitowy segment: [0][0][0][0][0][0][0][0][0][0][0][0][0] ]

    Ale kompletnie nie wiem jak zakodować te literki i je wyświetlać w danym miejscu
  • #6
    ArturAVS
    Moderator of HydePark/Cars
    Dawno w programowanie się nie bawiłem, zresztą to było w Bascom. Idea stosowana niezależnie od języka programowania, musisz zdefiniować tablicę znaków(fontów). A najlepiej własną bibliotekę do obsługi napisać z fontami. Wtedy wyświetlanie mogłoby wyglądać tak; wywołanie procedury, pozycja, znak. Nie musiałbyś za każdym razem definiować tablicy znaków do wysłania. Oczywiście musiałbyś uwzględnić znaki specjalne na wyświetlaczu, bo dla samego sterownika to "wsio rawno".
  • #7
    kosiner
    Level 8  
    @ArturAVS Dzięki :D