MMP Cvičenie 3: Rozdiel medzi revíziami
Zo stránky SensorWiki
(24 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
__NOTOC__ | |||
== Programovateľný LCD displej == | == 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 | |||
[[Obrázok:Acrob_LCD_Schematic.png|center]] | |||
[[Obrázok:Acrob_LCD_Schema2.png|800px|center]] | |||
=== Úlohy === | === Úlohy === | ||
Najprv sa snažte | 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. | ||
==== Simulátor periférií ==== | |||
Stiahnite a nainštalujte si Hapsim - simulátor periférií pre AVR Studio: | |||
* http://www.helmix.at/hapsim/ | |||
[[Obrázok:ScreenshotHapsim.png|center]] | |||
==== 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"> | |||
. | |||
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++) | |||
for(znak=' | lcdDataWrite(znak); | ||
lcdControlWrite(0x40+0x80); | |||
for(znak='0';znak<'8';znak++) | |||
lcdDataWrite(znak); | |||
for(;;); | |||
return 0; | |||
} | |||
</source> | </source> | ||
Riadok 59: | Riadok 86: | ||
** 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/DEM16216SYH-LY.pdf DEM 16216 SYH-LY] | ||
** Displej 2x16 [http://ap.urpi.fei.stuba.sk/mmp/DEM20231SYH-PY.pdf DEM 20231 SYH-PY] | ** 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] | * 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] | * Stamp Works - pp. 73 and more [http://www.parallax.com/Portals/0/Downloads/docs/books/sw/Web-SW-v2.1.pdf] | ||
=== Arduino === | |||
* [http://www.arduino.cc/en/Tutorial/LCDLibrary LCD Library] | * [http://www.arduino.cc/en/Tutorial/LCDLibrary LCD Library] | ||
<source lang="c"> | |||
/* | |||
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); | |||
} | |||
</source> | |||
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
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
Ú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:
- 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.
Simulátor periférií
Stiahnite a nainštalujte si Hapsim - simulátor periférií pre AVR Studio:
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
- Katalógové listy
- Radič Hitachi HD44780
- Displej 2x16 DEM 16216 SYH-LY
- Displej 2x16 DEM 20231 SYH-PY
- 2x16 Parallel LCD datasheet
- Podrobné manuály sú aj u výrobcu Hantronix.
- Peter Ouwehand: How to control a HD44780-based Character-LCD
- Ian Harries: HD44780-Based LCD Modules'
- Tomáš Dresler: Inteligentní displeje a jejich připojení k PC. [hw.cz]
- Nuts & Volts: Demystifying Character Based LCDs
- Stamp Works - pp. 73 and more [1]
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: