![]() | |
Oikea painike oikosuljettu |
Tuossa
LCD-aliohjelmassa on useita tekstejä ja muita tulosteita. Ne joutuu
luonnollisesti sovittamaan halutun toteutuksen mukaan. Tämä on siis
vain runko.
Kutsuttaessa
pääohjelmasta, pitää siinä olla seuraavat parametrit:
start =
viittaus seklvenssin suoritusaskeleeseen
rivi =
LCD-näytön rivi 0 = yläriv, 1 = alarivi
paikka =
ensimmäisen merkin paikka rivillä ( 0 .. 19)
data =
numerotieto (int tai muutettava tarpeen mukaan)
LCD-aliohjemaa
varten pitää alun määrittelyosassa antaa kirjastomoduuli
(#include <LiquidCrystal.h>) sekä määritellä
LCD-näytön pinnit (LiquidCrystal lcd(3, 2, 7,6,5,4);. Olen
tähän sovellukseen vaihtanut (yleensä esimerkeissä esiintyvät)
Arduinon pinnit voidakseni käyttää yhtä liitintä näytön ja
mikrokontrollerin välillä. Niiden paikka ei ole tärkeä, mutta
järjestys on oleellinen.
Asetuksissa
täytyy määritellä näytön ominaisuudet; montako riviä ja
montako merkkipaikkaa. Tässä tapauksessa kaksi (2) riviä ja 20
paikkaa (lcd.begin(20,2);.
Pääohjelmaa
varten on neljä (4) määrittelyä: IO-aliohjelmasta palautuva
painikkeen tilatieto (Bol_Painike). Painikkeen ”nouseva
reuna” (Diu_Painike), minkä avulla huolehditaan siitä,
että ohjaustoimenpiteet (tässä painamisten lukumäärä)
suoritetaan vain kerran, eikä jokaisella ohjelmakierroksella.
Lisäksi molemmille painikkeille on laskurit ( Int_OikLkm
ja Int_VasLkm).
Tämä
ohjelma toimii siten, että ylärivin keskellä on pysyvästi teksti
YLÄOTSIKKO ja alariville ilmestyy Vasen / Oikea lkm kertaa!
Jos mitään ei paineta, on alarivi tyhjä. Painettaessa, vastaava
painike näkyy rivillä, sekä painikkeen painamisten lukumäärä,
joka kasvaa yhdellä aina painettaessa.
Tässä
ohjemassa on se puute, että painikkeita ei voi painaa
samanaikaisesti. Se olisi korjattavissa määrittelemällä
molemmille painikkeille omat tilamuuttujat (Bol_ ja Diu_). Tuo
ei ole kuitenkaan oleellista tässä yhteydessä. Toinen ”puute”
on se, että painamiskertojen ollessa alle 10, numerot tulostuvat
yhtä paikkaa liikaa vasemmalle. Tämä olisi korjattavissa
testaamalla, onko luku alle 10, ja JOS on, niin lisätään
paikkakutsuun yksi (+1).
Tuokaan
ei ole tässä yhteydessä kovin oleellista. Merkittävämpää on
se, että digitaali IO:t vähenevät kuudella (6) käytettäessä
LCD-näyttöä. Onneksi moniin ongelmiin löytyy ratkaisu. Niin
tähänkin tulevaisuuden sovelluksissa.
Painikkeiden
testaus on toteutettu while-komennolla (while(Bol_Painike =
Fun_IO(1,8,0)){). Kutsun parametrit: 1 = INPUT, 8 = I/O-pinni 8
ja 0 = ei tässä merkitse mitään. Se koskee ainoastaan OUTPUT-
timintoa. Niin kauan kun painike on painettuna, suoritetaan käskyyn
kuuluvat lauseet ja toiminnot. Kun painike päästetään, käskyryhmä
ohitetaan. Tämä on siis ehtokäky, kuten if, if .. else,
do .. while ja
mikseipä myöskin switch
.. case.
OHJELMA
34
/***************************************
*
Ohjelma 34
*
17.01.2017
*
LCD-näyttö ja painikeFunktio
**************************************/
//
Kirjastomoduulit
#include
<LiquidCrystal.h>
LiquidCrystal
lcd(3, 2, 7,6,5,4);
//
MÄÄRITTELYT:
boolean
Bol_Painike = false;
boolean
Diu_Painike = false;
int
Int_OikLkm = 0;
int
Int_VasLkm = 0;
//
ALIOHJELMAT
//IO_Ali_v1
- IO_Ali_v1.No2Tam17
//
LCD_AliOhjelma_v1 LCD_Ali_v1.No3Tam17
/****************************************************
*
Kutsuparametrit:
*
1. start = käynnistää valintasekvenssin
*
halutulta riviltä
*
2. rivi = LCD-näytön rivi, 0 = ylä, 1 = ala
*
3. paikka = merkin paikka rivillä
*
4. data = numeroiden näyttö ( tässä int,
*
mutta tarvittaessa float
****************************************************/
//
LCD aliohjelman määrittelyt
void
Fun_LCD(int
start, int
rivi, int
paikka, int
data){
int
i = 0; // Ä(0) ja Ö(1) kirjainten kirjastoviittaus
const
byte api = B11100001; // ä-kirjain
const byte opi = B11101111; // ö-kirjain
const byte ast = B11011111; // aste
byte Api[8] = // Ä-kirjain
{B10001,B00100,B01010,B10001,
B11111,B10001,B10001,B00000};
byte Opi[8] = // Ö-kirjain
{B10001,B01110,B10001,B10001,
B10001,B10001,B01110,B00000};
lcd.createChar(0,Api); // Huom! int i
yllä!!
lcd.createChar(1,Opi);
//
Näytön valintasekvenssi
int
Seq_LCD = start;
switch
(Seq_LCD){
case
1:
lcd.setCursor(paikka, rivi);
lcd.print("YL");
i
= 0; lcd.write(i); // Ä - kirjain
lcd.print("OTSIKKO");
Seq_LCD
= 0;
break;
case
2:
lcd.setCursor(paikka, rivi);
lcd.print("Vasen:");
Seq_LCD
= 0;
break ;
case
3:
lcd.setCursor(paikka, rivi);
lcd.print("Oikea:");
Seq_LCD
= 0;
break ;
case
4:
lcd.setCursor(paikka, rivi);
lcd.print("kertaa!");
Seq_LCD
= 0;
break ;
case
5:
lcd.setCursor(paikka, rivi);
lcd.print(" ");
Seq_LCD
= 0;
break ;
case
11:
lcd.setCursor(paikka, rivi);
lcd.print(data);
Seq_LCD
= 0;
break ;
case
12:
lcd.setCursor(paikka, rivi);
lcd.print("kpl");
Seq_LCD
= 0;
break ;
case
13: // Koko rivin tyhjennys
lcd.setCursor(paikka, rivi);
lcd.print("
");
Seq_LCD
= 0;
break ;
}//
Valintasekvenssin loppu
}//
Funktion LCD loppu
//
ASETUKSET:
void
setup(){
Serial.begin(9600);
lcd.begin(20,2);
}//
Asetuksen loppu
//
PÄÄLOOPPI
void
loop(){
//
Tulostetaan yläteksti "YLÄOTSIKKO"
Fun_LCD(1,0,5,0);
while(Bol_Painike
= Fun_IO(1,8,0)){
if(Bol_Painike
== true && Diu_Painike == false){
Fun_LCD(2,1,0,0);
Fun_LCD(4,1,10,0);
Int_VasLkm++;
Fun_LCD(11,1,7,Int_VasLkm);
Diu_Painike
= true ; }}
while (Bol_Painike
= Fun_IO(1,9,0)){
if(Bol_Painike
== true && Diu_Painike == false){
Fun_LCD(3,1,0,0);
Fun_LCD(4,1,10,0);
Int_OikLkm++;
Fun_LCD(11,1,7,Int_OikLkm);
Diu_Painike
= true ; }}
//
Alarivin tyhjennys, kun kumpaakaan ei paineta
if(Bol_Painike
== false){
Fun_LCD(13,1,0,0);
Diu_Painike
= false;}
delay(1);
}
// Pääohjelma LOPPU
Ei kommentteja:
Lähetä kommentti