Operácie

MMP Cvičenie 3: Rozdiel medzi revíziami

Z SensorWiki

(Tlačítka modulu LCD Terminal AppMod)
 
(27 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
 +
__NOTOC__
 +
== Programovateľný LCD displej ==
 +
 +
 +
=== LCD Modul ===
 +
 +
[[Obrázok:ParallaxLCDAppMod.jpg|left]]
 +
'''Vlastnosti:'''
 +
 +
* 2x8 LCD Displej bez podsvetlenia
 +
* 4 Tlačítka
 +
* Trimer na zmenu kontrastu
 +
 +
'''Technické parametre:'''
 +
 +
* Napájanie: 5 V @ 15 mA
 +
* Pripojenie: 4-Bit parallel interface (Hitachi HD44780 compatible)
 +
* Rozmery:    60 x 50 x 20 mm
 +
* Pracovná teplota: 0 až +70 °C
  
== Programovateľný LCD displej ==
 
  
* [http://ap.urpi.fei.stuba.sk/mmp/cvic4.hex Toto] je skompilovaná ukážka možností práce s displejom.
 
  
Ďalej máte k dispozícii nachystaný vzorový projekt [download] v ktorom je pripravené makefile a knižnica pre prácu s LCD. Po nahratí všetko rozbaľte do jedného adresára a v PN si vytvorte nový projekt, ktorý bude obsahovať všetky rozbalené súbory.
+
[[Obrázok:Acrob_LCD_Schematic.png|center]]
  
Pripravené sú funkcie:
+
[[Obrázok:Acrob_LCD_Schema2.png|800px|center]]
  
void lcdInit4(void);                    // inicializácia displeja 4-bitovo
 
unsigned char lcdBusyWait(void); // čaká, kým LCD nie je pripravený na ďalší príkaz
 
                                                // ak vrati 1, OK
 
                                                // ak vrati 0, vyprsal timeout
 
  
void lcdControlWrite(unsigned char c_data); // zapíše príkaz do displeja
+
=== Úlohy ===
void lcdDataWrite(unsigned char w_data) ; // zapíše znak na LCD na aktuálnu pozíciu
 
  
void delay_ms(unsigned int ms);              // oneskorenie v milisekundách
+
Najprv sa snažte pochopiť, ako je vytvorený vzorový program, ako sa konfiguruje pripojenie LCD k portom, skontrolujte konfiguráciu. Potom s pomocou manuálu k displeju zobrazte na displeji nejaký text a zrealizujte nasledovné funkcie:
 +
# posun kurzora doprava / dolava
 +
# posun obsahu displeja doprava / dolava
 +
# napíšte funkciu '''void lcdGotoXY(riadok, stlpec)'''
 +
# clear displeja (a obnovenie povodneho obsahu displeja)
 +
# zadefinujte si vlastné znaky a zobrazte ich spolu s iným textom. Povinne aspoň jeden znak s diakritikou a znak stupeň, zobrazte teplotu.
  
Úlohy
 
  
Najprv sa snažte pochoopiť, ako je vytvorený vzorový program, kde sa konfiguruje pripojenie LCD k portom, skontrolujte konfiguráciu. Potom s pomocou manuálu k displeju zobrazte na displeji nejaký text a zrealizujte nasledovné funkcie:
+
==== Simulátor periférií ====
  
  1. posun kurzora doprava / dolava tlacitkami
+
Stiahnite a nainštalujte si Hapsim - simulátor periférií pre AVR Studio:
  2. posun obsahu displeja doprava / dolava tlacitkami
+
* http://www.helmix.at/hapsim/
  3. kurzor '_' a kurzor '||'
 
  4. napíšte funkciu funkcia void lcdGotoXY(riadok, stlpec)
 
  5. clear displeja (a obnovenie povodneho obsahu displeja)
 
  6. zobrazit znak BETA vo formate 5x10
 
* Nuts & Volts: [http://www.parallax.com/dl/docs/cols/nv/vol1/col/nv31.pdf Demystifying Character Based LCDs]
 
* [http://www.parallax.com/Portals/0/Downloads/docs/prod/audiovis/Hit44780.pdf Hitachi 44780 Driver]
 
* 2x16 Parallel LCD [http://www.parallax.com/Portals/0/Downloads/docs/prod/audiovis/lcd2x16par.pdf datasheet]
 
* Stamp Works - pp. 73 and more [http://www.parallax.com/Portals/0/Downloads/docs/books/sw/Web-SW-v2.1.pdf]
 
  
[[Obrázok:Acrob_LCD_Schematic.png|center]]
+
[[Obrázok:ScreenshotHapsim.png|center]]
  
Zdrojáky
 
  
* Knižnica pre prácu s LCD zapojeným podľa obrázku - [[AVR lcd.c|lcd.c]], [[AVR lcd.h|lcd.h]]
+
==== Software  ====
  
 +
K dispozícii máte:
 +
* [http://ap.urpi.fei.stuba.sk/mmp/cvic4.hex Demo] - skompilovanú ukážku možností práce s displejom.
 +
* Knižnicu ([[AVR lcd.c|lcd.c]], [[AVR lcd.h|lcd.h]]) s fungujúcou inicializáciou displeja a príkazmi na ovládanie.
 +
* Pripravené sú funkcie:
 
<source lang="c">
 
<source lang="c">
#include "lcd.h"
+
.
 +
    void lcdInit4(void);                      // inicializácia displeja 4-bitovo
 +
    void lcdDataWrite(unsigned char w_data) ;    // zapíše znak na aktuálnu pozíciu
 +
    void lcdControlWrite(unsigned char c_data);  // zapíše príkaz do displeja
 +
</source>
 +
* Demonštračný program využívajúci tieto funkcie
 +
<source lang="c">
 +
.
 +
    #include "lcd.h"
 +
 
 +
    int main(void)
 +
    {
 +
    unsigned char znak;
 +
 +
    lcdInit4();
 +
    lcdControlWrite(1<<LCD_CLR);
 +
 
 +
    for(znak='A';znak<'I';znak++)
 +
        lcdDataWrite(znak);
 +
 
 +
    lcdControlWrite(0x40+0x80);
 +
    for(znak='0';znak<'8';znak++)
 +
        lcdDataWrite(znak);
 +
 
 +
    for(;;);
 +
    return 0;
 +
    }
 +
</source>
 +
 
 +
=== Literatúra ===
 +
 
 +
* Katalógové listy
 +
** Radič Hitachi [http://ap.urpi.fei.stuba.sk/mmp/HD44780.pdf HD44780]
 +
** Displej 2x16 [http://ap.urpi.fei.stuba.sk/mmp/DEM16216SYH-LY.pdf DEM 16216 SYH-LY]
 +
** Displej 2x16 [http://ap.urpi.fei.stuba.sk/mmp/DEM20231SYH-PY.pdf DEM 20231 SYH-PY]
 +
** 2x16 Parallel LCD [http://www.parallax.com/Portals/0/Downloads/docs/prod/audiovis/lcd2x16par.pdf datasheet]
 +
** Podrobné manuály sú aj u [http://www.hantronix.com/page/index/products/character výrobcu Hantronix].
  
 +
* Peter Ouwehand: '''[http://home.iae.nl/users/pouweha/lcd/lcd.shtml How to control a HD44780-based Character-LCD]'''
 +
* Ian Harries: ''[http://www.doc.ic.ac.uk/%7Eih/doc/lcd/ HD44780-Based LCD Modules]'''
 +
* Tomáš Dresler: '''[http://www.hw.cz/ART632-Inteligentni-displeje-a-jejich-pripojeni-k-PC.html Inteligentní displeje a jejich připojení k PC]'''. [hw.cz]
 +
* Nuts & Volts: [http://www.parallax.com/dl/docs/cols/nv/vol1/col/nv31.pdf Demystifying Character Based LCDs]
 +
* Stamp Works - pp. 73 and more [http://www.parallax.com/Portals/0/Downloads/docs/books/sw/Web-SW-v2.1.pdf]
  
int main(void)
+
=== Arduino ===
{
 
  
  unsigned char znak;
+
* [http://www.arduino.cc/en/Tutorial/LCDLibrary LCD Library]
 +
<source lang="c">
 +
/*
 +
  LiquidCrystal Library - Hello World
 +
 +
Demonstrates the use a 8x2 LCD display.  
 
   
 
   
  lcdInit4();
+
  The circuit:
  lcdControlWrite(1<<LCD_CLR);
+
* LCD RS pin to digital pin 3
 +
  * LCD R/W pin to digital pin 2
 +
  * LCD Enable pin to digital pin 1
 +
* LCD D4 pin to digital pin 4
 +
* LCD D5 pin to digital pin 5
 +
* LCD D6 pin to digital pin 6
 +
* LCD D7 pin to digital pin 7                   
 +
*/
  
for(znak='A';znak<'E';znak++)
+
#include <LiquidCrystal.h>          // include the library
      lcdDataWrite(znak);
 
  
  lcdControlWrite(0x40+0x80);
+
// initialize the library with the numbers of the interface pins
for(znak='F';znak<'Q';znak++)
+
// LiquidCrystal(RS, RW, EN, D4, D5, D6, D7)  
      lcdDataWrite(znak);
+
LiquidCrystal lcd( 3,  2,  1,  4,  5,  6,  7);
  
while (1);
+
void setup() {
return 0;
+
  // set up the LCD's number of columns and rows:
 +
  lcd.begin(8, 2);
 +
  // Print a message to the LCD.
 +
  lcd.print("Ahoj!");
 
}
 
}
  
 +
void loop() {
 +
  // set the cursor to column 0, line 1
 +
  // (note: line 1 is the second row, since counting begins with 0):
 +
  lcd.setCursor(0, 1);
 +
  // print the number of seconds since reset:
 +
  lcd.print(millis()/1000);
 +
}
 
</source>
 
</source>
 
Arduino:
 
* [http://www.arduino.cc/en/Tutorial/LCDLibrary LCD Library]
 
  
 
Misc:
 
Misc:
 
* [http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html LCD Display Simulator]
 
* [http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html LCD Display Simulator]
 
* [http://www.geocities.com/dinceraydin/lcd/charcalc.htm Custom Character Calculator]
 
* [http://www.geocities.com/dinceraydin/lcd/charcalc.htm Custom Character Calculator]
 +
 +
 +
 +
== Tlačítka modulu LCD Terminal AppMod ==
 +
 +
Pre prístup k tlačítkam tohto modulu je v knižnici lcd.h k dispozícii funkcia
 +
<source lang="c">
 +
    unsigned char ReadButtons();
 +
</source>
 +
 +
Ak ju tam nemáte, tu je:
 +
<source lang="c">
 +
/* ------------------------------------------------------- */
 +
/*  Read and debounce the LCD AppMod buttons              */
 +
/*                                                        */
 +
/*  Returns 0 if nothing  is pressed                      */
 +
/*  Returns 1 if button A is pressed                      */
 +
/*  Returns 2 if button B is pressed                      */
 +
/*  Returns 4 if button C is pressed                      */
 +
/*  Returns 8 if button D is pressed                      */
 +
/*  Returns combination if more is pressed (e.g. 6 for B+C)*/
 +
/*                                                        */
 +
/* ------------------------------------------------------- */
 +
 +
unsigned char ReadButtons()
 +
{
 +
  DDRD  = 0b00001110;                // make LCD bus inputs
 +
  unsigned char state = 0xFF;          // assume nothing pressed
 +
 
 +
  for(int scan = 1; scan<=10; scan++)
 +
  {
 +
  state = state & ((PIND&0xF0)>>4); // make sure button held
 +
  _delay_ms(5);                    // debounce 10 x 5 ms
 +
  }
 +
 +
  DDRD  = 0b11111110; // return bus to outputs
 +
 
 +
  return(state);
 +
}
 +
 +
</source>
 +
 +
 +
Prečo je takto napísaná a ako vlastne funguje lepšie zistíte, keď si preštudujete schému zapojenia:
 +
 +
[[Obrázok:LCD_App_Mod_Schematic.png|center|450px]]
 +
 +
[[Monolitické_mikropočítače#Cvi.C4.8Denia|Návrat na zoznam cvičení...]]
 +
 +
[[Category:AVR]][[Category:MMP]][[Category:DVPS]]

Aktuálna revízia z 11:14, 26. október 2011

Programovateľný LCD displej

LCD Modul

ParallaxLCDAppMod.jpg

Vlastnosti:

  • 2x8 LCD Displej bez podsvetlenia
  • 4 Tlačítka
  • Trimer na zmenu kontrastu

Technické parametre:

  • Napájanie: 5 V @ 15 mA
  • Pripojenie: 4-Bit parallel interface (Hitachi HD44780 compatible)
  • Rozmery: 60 x 50 x 20 mm
  • Pracovná teplota: 0 až +70 °C


Acrob LCD Schematic.png
Acrob LCD Schema2.png


Úlohy

Najprv sa snažte pochopiť, ako je vytvorený vzorový program, ako sa konfiguruje pripojenie LCD k portom, skontrolujte konfiguráciu. Potom s pomocou manuálu k displeju zobrazte na displeji nejaký text a zrealizujte nasledovné funkcie:

  1. posun kurzora doprava / dolava
  2. posun obsahu displeja doprava / dolava
  3. napíšte funkciu void lcdGotoXY(riadok, stlpec)
  4. clear displeja (a obnovenie povodneho obsahu displeja)
  5. zadefinujte si vlastné znaky a zobrazte ich spolu s iným textom. Povinne aspoň jeden znak s diakritikou a znak stupeň, zobrazte teplotu.


Simulátor periférií

Stiahnite a nainštalujte si Hapsim - simulátor periférií pre AVR Studio:

ScreenshotHapsim.png


Software

K dispozícii máte:

  • Demo - skompilovanú ukážku možností práce s displejom.
  • Knižnicu (lcd.c, lcd.h) s fungujúcou inicializáciou displeja a príkazmi na ovládanie.
  • Pripravené sú funkcie:
.
     void lcdInit4(void);                     	   // inicializácia displeja 4-bitovo	
     void lcdDataWrite(unsigned char w_data) ;     // zapíše znak na aktuálnu pozíciu
     void lcdControlWrite(unsigned char c_data);   // zapíše príkaz do displeja
  • Demonštračný program využívajúci tieto funkcie
.
    #include "lcd.h"

    int main(void)
    {
     unsigned char znak;
 
     lcdInit4();
     lcdControlWrite(1<<LCD_CLR);

     for(znak='A';znak<'I';znak++)
        lcdDataWrite(znak);

     lcdControlWrite(0x40+0x80);
     for(znak='0';znak<'8';znak++)
        lcdDataWrite(znak);

     for(;;);
     return 0;
    }

Literatúra

Arduino

/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 8x2 LCD display.  
 
   The circuit:
 * LCD RS pin to digital pin 3
 * LCD R/W pin to digital pin 2
 * LCD Enable pin to digital pin 1
 * LCD D4 pin to digital pin 4
 * LCD D5 pin to digital pin 5
 * LCD D6 pin to digital pin 6
 * LCD D7 pin to digital pin 7                    
 */

#include <LiquidCrystal.h>           // include the library 

// initialize the library with the numbers of the interface pins
//  LiquidCrystal(RS, RW, EN, D4, D5, D6, D7) 
LiquidCrystal lcd( 3,  2,  1,  4,  5,  6,  7);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(8, 2);
  // Print a message to the LCD.
  lcd.print("Ahoj!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
}

Misc:


Tlačítka modulu LCD Terminal AppMod

Pre prístup k tlačítkam tohto modulu je v knižnici lcd.h k dispozícii funkcia

     unsigned char ReadButtons();

Ak ju tam nemáte, tu je:

/* ------------------------------------------------------- */
/*  Read and debounce the LCD AppMod buttons               */
/*                                                         */
/*  Returns 0 if nothing  is pressed                       */
/*  Returns 1 if button A is pressed                       */
/*  Returns 2 if button B is pressed                       */
/*  Returns 4 if button C is pressed                       */
/*  Returns 8 if button D is pressed                       */
/*  Returns combination if more is pressed (e.g. 6 for B+C)*/
/*                                                         */
/* ------------------------------------------------------- */

unsigned char ReadButtons()
{
  DDRD  = 0b00001110;                // make LCD bus inputs
  unsigned char state = 0xFF;           // assume nothing pressed
  
  for(int scan = 1; scan<=10; scan++)
  {
   state = state & ((PIND&0xF0)>>4); // make sure button held
   _delay_ms(5);                     // debounce 10 x 5 ms
  }

  DDRD  = 0b11111110;				 // return bus to outputs
  
  return(state);
}


Prečo je takto napísaná a ako vlastne funguje lepšie zistíte, keď si preštudujete schému zapojenia:

LCD App Mod Schematic.png

Návrat na zoznam cvičení...