Det 8 knappers KLAVER, er nu tilføjet et 4 x 20 karakters LCD-display

Formålet med dette eksperiment er, at lære hvordan man tilslutter et LCD-display, samt hvordan man styrer CURSOR-placering og udskriver på det.

På tegningen ser opstillingen således ud:

Desværre kunne jeg ikke finde et modul til et 4 linjers display, men da det jo er samme benforbindelse, er skaden meget begrænset.
Displayet er her tegnet på hovedet, og d.v.s., at ben-forbindelserne begynder fra højre med nr. 1 mod venstre ben16. Jeg har ikke forbundet ben 15 og ben 16, da det jo er baggrundslys, og sikkert kræve mere strøm en jeg ønsker at give det via en USB-forbindelse.

"READ/WRITE" forbindelsen på LCD-ben 5 er, som i de fleste tilfælde, hvor man ikke skal læse fra displayet, men bare skrive til det, forbundet til stel.
"Register Select" på LCD-ben 4 er forbundet til ARDUINO UNE' DIGITAL pin8, og LCD's "enable" er forbundet til DIGITAL pin9.
DATA-pindende "D4 til D7" er forbundet i rækkefølge på ARDUINO UNO til DIGITAL pin 4 til 7, så der er kronologi i det. Hvis man har fulgt med i ARDUINO-forums på nettet, vil man have lagt mærke til, at det er disse forbindelser, de fleste har problemer med at få lagt rigtigt på plads, samt defineret, i deres programmer.

DEMO-videoen ses her: https://plus.google.com/111931115004210443802/videos?hl=da&pid=6122335140437938530&oid=111931115004210443802

På diagrammet ser det således ud:

Her vil jeg ikke kommentere så meget, men gå videre til programmet til styring af displayet.
Den opmærksomme læser vil se, at der er meget "grønt" i denne kode, og det er fordi jeg gør mig en hel del umage for at dokumentere, hvad der skal til for at forstå programmet.

Af dette program ses, hvorledes LCD-displayet defineres i ARDUINO UNO. Der vises en række af de almindelige lcd-kommandoer - der er et eksempel på brugen af SETUP, og LOOP kalder under-routiner, der vises også hvorledes programmet stoppes i sit løb, ved at trykke på bare een af de 8 knapper knapper, ligegyldig hvilken.

//*****************************************************************
//** HALLO WORLD med LCD-display.                                **
//** Hvordan styrer man display på linje, og cursor-possition ?  **
//** de OZ6YM, Palle, maarts 2015                                **
//**                                                             **
//** I dette program ser vi på, hvordan man tilslutter et        **
//** LCD-display, hvordan man styrer, linjer og kolonner, samt   **
//** udskriver tekst på displayet.                               **
//*****************************************************************
// include the library code:
//**************************
#include <LiquidCrystal.h>
// initialize biblioteket til LCD-DISPLAYET
//*****************************************************************
//** Vælg de pinde på LCD der skal bruges                        **
//*****************************************************************
// LiquidCrystal lcd(RS, E, D4, D5, D6, D7)                      **
//*****************************************************************
LiquidCrystal lcd(8,9,4,5,6,7);        // standard for OZ6YM, Palle
// LCD-definitionen følger ArduinoUno-pinnr på de digitale ben   **
// LDC's RS forbindes til UNO's ben 8,
// LCD's E  forbindes til UNO's ben 9,
// LCD's D4,D5,D6,D7 forbindes til UNO's ben 4,5,6 og 7
//*****************************************************************

const int colums = 20;          // 16 eller 20 karakterer pr. linje
const int rows = 4;                             // 2 eller 4 linjer
//*****************************************************************
//************ tællere der benyttes i programmet ******************
//*****************************************************************
int x;                                              // linje-tæller
int y;            // gennemløbs-tæller, tæller til 10 og nulstilles
int z = 1;                    // antal gange de 4 linjer er skrevet
int analogPin = A0;                     // port der læser knapperne
//*****************************************************************
void setup()
{
//*****************************************************************
 
Serial.begin(9600); // aktiveres hvis man skal DEBUGGE program
//*****************************************************************
//****    Initialicer LCD med antal collonner og linjer      ******
//*****************************************************************
//** setup() bruges i begyndelse af et program til at initialicere
//** ting der kun skal gøres een gang i programmet

lcd.begin(colums, rows);
lcd.setCursor(0,0);
lcd.print("Hello World de OZ6YM"); // Print
lcd.setCursor(1,1); lcd.print("Nu er vi der igen!!");
lcd.setCursor(2,2);
lcd.print("LCD-DISPLAY-TEST ");
lcd.setCursor(7,3);
lcd.print("VER.1.0");
delay(5000);
                    // vis meddelelse i 5 sekunder
lcd.clear();                                //--> CLEAR diaplay

}
//******************************************************************
//**            HOVED LOOP, HER HVOR ALTING STYRES FRA            **
//** LOOP-routinen skal være så kort som muligt, for at holde et  **
//** godt overblik over, hvad der sker i programmet               **
//******************************************************************
void loop()
{
  if ( x == 4 ) x = 0;    // x holder styr på hvilken linje vi er på

 
for ( int i = 0 ; i <= colums - 1; i++    //linje 0 - 3 = 4 linjer
      {                // Herefter overtager "i" cursor-poss på linjen
       lcd.setCursor( i, x ); lcd.print( x + 1 );
      
// Serial.print(x+1);Serial.print("-");
          delay (15);  //hold kort pause, så vi kan følge med på display
      }
   x = x + 1;                              // forøg linje-tæller med 1
 
//**   Når alle 4 linjer ef fyldt med karakterer, da clear LCD   **
  //*****************************************************************
 
if ( x == 4 ){ y = y + 1; lcd.clear();}
  hvortit();                               //kald procedure hvortit()
  Checkstop();                       // kald af procedure Checkstop()

}  
//*******************************************************************
//**                  END af HOVED LOOP                            **
//*******************************************************************

//** Herefter defineres andre rutiner der skal benyttes i programmet
//*******************************************************************
//**    Skriv en ny meddelelse efter hver 10'ende gennemløb        **
//**Denne rutine tæller antal af de gange displayet er blevet fyldt**
//*******************************************************************
void hvortit()
{
 
if ( y == 10)                  // her testes for antal af gennemløb
   {
       lcd.clear();
     lcd.setCursor(0,0);
lcd.print("Det var 10 omgange ");
     lcd.setCursor(0,1);
lcd.print("af ialt ");
//************************************************************
//** Tælleren ved hvor næste karakter skal printes,         **
//** så denne kommando: lcd.setCursor(9,1); er overflødig   **
//************************************************************
     lcd.print(z);
     lcd.setCursor(0,2);
lcd.print("Nu kommer der flere ");
     delay(5000);
   //hold 5 sekunders pause så man kan nå at læse
    
z = z + 1;
    
y = 0;
     }
}
//**********************************************************************
//** END af hvortit() **
//**********************************************************************

//**********************************************************************
//** Check om der er trykket på een af knapperne, for at stoppe       **
//** hele programmet                                                  **
//**********************************************************************
void Checkstop()
{

//**********************************************************************
// Den analoge port kan antage tal mellem 0 og 1023.                  **
// tag det læste tal, divider med 10, og smid decimaldelen væk        **
// hvis der ikke er trykket på en knap, vil dette tal være 102        **
//**********************************************************************
if ( int(analogRead(analogPin)/10) == 102 )       // Læs analog-port
  {
                                      // serial.print bruges under DEBUG
      // Serial.print(int(analogRead(analogPin)/10)); Serial.print(" ");
       return;
  }
else
  {
                           // der er trykket på en knap, stop programmet
     lcd.clear();
   lcd.setCursor(1,2);
lcd.print("Her stopper vi!!");
  
for (;;)                          //gå ind i en uendelig lykke
     {}
  }
}
//**********************************************************************
//**                    END af Checkstop()                            **
//**********************************************************************

//**********************************************************************
//**                     END of PROGRAM                               **
//**********************************************************************