Operácie

LCD displej EA-DOGM 163

Zo stránky SensorWiki

Verzia z 19:03, 15. apríl 2025, ktorú vytvoril Balogh (diskusia | príspevky)

LCD Modul s displejom EA-DOGM-163

Toto je návod na cvičenie s doskou Acrob a rozširujúcim modulom EA-DOGM163. Ak chcete pracovať s bežným LCD displejom s paralelným pripojením, pozrite sa na tento návod pre LCD displej s radičom HD44780.

Vlastnosti:

  • 3x16 LCD Displej s podsvietením
  • 3 Tlačítka, 1 LED
  • Príprava na ESP-01 WiFi modul
  • Konfiguračné prepojky

Technické parametre:

  • Napájanie: 5 V @ 15 mA
  • Pripojenie: SPI interface
  • Radič displeja je Hitachi HD44780 compatible
  • Rozmery: 60 x 50 x 20 mm
  • Pracovná teplota: 0 až +70 °C


Na rozširujúcej doske s displejom máte k dispozícii 3-riadkový displej EA-DOGM163 s podsvietením a okrem toho ešte jednu LED diódu navyše a tri tlačidlá, ktoré môžete použiť na svoje vlastné účely. Pred pripojením dosky hrebienkovým konektorom k základnej doske Acrob odpojte napätie a skontrolujte orientáciu a polohu pinov.

Rozmiestnenie prepojok na konektore J1 'nemeňte', môžete však skontrolovať ich správnu polohu podľa obr. 1.



Takto majú byť rozmiestnené prepojky J1.


Po pripojení modulu k doske Acrob sú obsadené nasledovné vstupy a výstupy mikroprocesora, ktoré už ďalej nemôžete používať na svoje vlastné účely.

AVR Pin      Arduino     Význam signálu
 
 PORTD.2       D2          LCD: RS (SPI zbernica, Register Select)
 PORTD.4       D4          LCD: /CS (displej, Chip Select)
 PORTD.6       D6          LCD: Backlight - podsvietenie displeja On/Off alebo plynule PWM
 PORTD.7       D7          SW_B Prostredné tlačidlo
 
 PORTB.0       D8          SW_C Pravé tlačidlo     
 PORTB.3       D11         LCD: SI
 PORTB.5       D13         LCD: CLK
 
 PORTC.2       A2          LED na module vľavo   
 PORTC.3       A3          SW_A Ľavé tlačidlo   

Piny, ktoré využíva LCD displej pripojený cez zbernicu SPI, nemusíte konfigurovať, všetko zabezpečí knižnica lcd. Súbory lcd.c a lcd.h podľa možnosti nemeňte a nezabudnite na ich správne vloženie do projektu. Pre správnu funkciu potrebujete svoje vlastné knižnice uart.c a uart.h (alebo vypustite príslušné časti kódu z ukážky).


/*
 * LcdDemo.c   Ver 0.3  (15. 4. 2025 19:53:07) 
 *			   Ver 0.2  (10. 4. 2025 07:26:17)
 *             Ver 0.1  (10. 3. 2024 09:47:21)  
 * 
 * Minimal working example for the FEI STU
 * Function:
 * a) setup serial interface and prepare stdio.h
 * b) setup LCD display an show some text on it
 * c) student functions are not used in demo
 *
 * Necessary definitions set in Project -> Properties
 *              ATmega328P
 *              F_CPU=16000000UL
 *              BAUDRATE=9600
 *
 */ 


#include <avr/io.h>
#include "uart.h"
#include "lcd.h"

#define LED1 PB5  // internal Acrob LED 
#define LED2 PC2  // LCD board external LED
#define SW_A PC3  // Tlacitko vlavo - vsetky tri maju pullUp
#define SW_B PD7  // Tlacitko v strede
#define SW_C PB0  // Tlacitko vpravo


#include <stdio.h>
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
                              
int main(void)
{ 
  DDRB |= (1<<LED1);    // PORTB.5 kde je LED ma byt OUTPUT
  DDRC |= (1<<LED2);    // Doplnujuca LED na displeji, Output
 
  uart_init();
  stdout = &mystdout;          // printf() works from now
  printf("Hello, world! \n");  // output to Serial terminal 

  lcd_init();                  // inicializacia displeja
  
  lcd_bklt(1);                 // zapni podsvietenie displeja
   
  lcd_putc(0x2A);              // 0x2A hex = 52 dec = '*'
  lcd_putc(' ');               // znak medzera
   
   for (int i=0; i<26; i++) lcd_putc('A'+i);	    
   
  lcd_putc(' ');               // znak medzera
  
  /* tato cast kodu zatial nefunguje, vasa uloha je 
     doprogramovat prislusne funkcie tak, aby to islo */ 
  
  lcd_setCursor(3,3);         // nastav kurzor na 3. riadok, 3. stlpec           
  lcd_puts("Hello, world!");  // a vypis tam tento text
 
  while(1)
  {
    if (bit_is_clear(PINC, SW_A))   // Test tlacitka
	{
		lcd_putc('*');              // ak je stlacene, napis *
		_delay_ms(1000);            // a pockaj chvilu
	}	
  } 
  return(0);
}
/*
 *  lcd.h  Library for MISA @ FEI STU
 *
 *  Created: 15. 4. 2025 20:48:48  - added char definition support, removed ext. dependencies
 *   Author: Richard Balogh based on gitHub code for EA*DOGM163
 */ 

#ifndef LCD_H_
#define LCD_H_

#include <stdlib.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#define CHARACTER_BUFFER_BASE_ADDRESS 0x80
#define CHARACTERS_PER_ROW 16

#define DISPLAY_RS_PORT PORTD
#define DISPLAY_RS_DDR DDRD
#define DISPLAY_RS_PIN 2
#define DISPLAY_CSB_PORT PORTD
#define DISPLAY_CSB_DDR DDRD
#define DISPLAY_CSB_PIN 4

#define DISPLAY_BKLT_PORT PORTD
#define DISPLAY_BKLT_DDR DDRD
#define DISPLAY_BKLT_PIN 6

#define DISPLAY_RS_low   (DISPLAY_RS_PORT &= ~(1<<DISPLAY_RS_PIN))
#define DISPLAY_RS_high  (DISPLAY_RS_PORT |= (1<<DISPLAY_RS_PIN))

#define DISPLAY_CSB_low  (DISPLAY_CSB_PORT &= ~(1<<DISPLAY_CSB_PIN))
#define DISPLAY_CSB_high (DISPLAY_CSB_PORT |= (1<<DISPLAY_CSB_PIN))

#define DISPLAY_BKLT_low   (DISPLAY_BKLT_PORT &= ~(1<<DISPLAY_BKLT_PIN))
#define DISPLAY_BKLT_high  (DISPLAY_BKLT_PORT |= (1<<DISPLAY_BKLT_PIN))


//instructions (see the ST7036 instruction set for further information)
#define INSTRUCTION_CLEAR_DISPLAY    		0b00000001
#define INSTRUCTION_FUNCTION_SET_INIT_0  	0b00110011
#define INSTRUCTION_FUNCTION_SET_INIT_1  	0b00110010
#define INSTRUCTION_FUNCTION_SET_INIT_2  	0b00101001
#define INSTRUCTION_INSTRUCTION_SET_0    	0b00101000
#define INSTRUCTION_INSTRUCTION_SET_1 		0b00101001
#define INSTRUCTION_BIAS_SET				0b00010101
#define INSTRUCTION_POWER_CONTROL 			0b01010011
#define INSTRUCTION_FOLLOWER_CONTROL		0b01101100
#define INSTRUCTION_CONTRAST_SET			0b01111111
#define INSTRUCTION_DISPLAY_ON				0b00001100
#define INSTRUCTION_ENTRY_MODE 				0b00000110

void lcd_init(void);
void lcd_write( char data );
void lcd_data( char data );     
void lcd_command( char instruction );

void lcd_putc( char znak );
void lcd_puts( char *string );

void lcd_clear( void );
void lcd_clearline( unsigned char zeile );

void lcd_setCursor(char row, char col);
void lcd_bklt( char OnOff);

void def_znak(unsigned char *ZnakArray, unsigned char Address);

#endif /* LCD_H_ */
#include "lcd.h"

/* Primitivne funkcie, nepredpoklada sa ich vyuzitie uzivatelom */

/* Funkcia zapise jeden bajt po SPI zbernici do zariadenia */
void lcd_write( char data )
{
 signed char index = 8;
        char c_data;

 DISPLAY_CSB_PORT &= ~(1<<DISPLAY_CSB_PIN); 	// Chip-Select do log.0 
 c_data = data;

 do
 {
  _delay_us(6);
  if ( c_data & 0x80 )		// najyssi bit zamaskujeme 
	   PORTB |= (1<<3);		// a posleme ho na zbernicu
  else
	   PORTB &= ~(1<<3);    // cez vodic MOSI (alebo len SI)
  _delay_us(5);			    // a vygenerujeme jeden hodinovy pulz
       PORTB &= ~(1<<5);     // na vyvod CLK
  _delay_us(6);
	   PORTB |= (1<<5);    
	
   c_data = c_data << 1;    // na najvyssie miesto posunieme dalsi bit
   index--;

  } while (index > 0);      // a toto spravime dokola 8x

	                        // a napokon zdvihneme /CS do log.1
	_delay_ms( 2 );
	DISPLAY_CSB_PORT |= (1<<DISPLAY_CSB_PIN);   
}


/* Funkcia zapise jeden byte do riadiaceho (Control) registra */
void lcd_command( char instruction )
{
	DISPLAY_RS_PORT &= ~(1<<DISPLAY_RS_PIN);
	_delay_us( 1 );
	lcd_write( instruction );
}


/* Funkcia zapise jeden byte do datoveho (Data) registra */
void lcd_data( char data )
{
	DISPLAY_RS_PORT |=  1<<DISPLAY_RS_PIN;
	_delay_us( 7 );
	lcd_write( data );
}


/* Uzivatelske funkcie, ktore ma pouzivat uzivatel */



/* Inicializacia displeja podla datasheetu pre radic ST7036 */
void lcd_init(void)
{  
	
              DDRB |= (1<<PB3) | (1<<PB5);	   // MOSI + SCK as OUTPUTs
    DISPLAY_RS_DDR |= 1<<DISPLAY_RS_PIN;       // All signals as OUTPUT
   DISPLAY_CSB_DDR |= 1<<DISPLAY_CSB_PIN;
  DISPLAY_BKLT_DDR |= 1<<DISPLAY_BKLT_PIN;
	
     	
             PORTB |= (1<<PB5);               // set_bit( ST7036_CLK );
  DISPLAY_CSB_PORT |= (1<<DISPLAY_CSB_PIN);   // set_bit( ST7036_CSB );
   DISPLAY_RS_PORT &= ~(1<<DISPLAY_RS_PIN);   // set_bit( ST7036_CSB );
  
  _delay_ms(50);		// pockame viac ako 40ms na ustalenie napajacieho napatia

   lcd_command( 0x39 );	// Function set; 8-bit Datenlänge, 2 Zeilen, Instruction table 1
  _delay_us(50);		// mehr als 26,3µs warten

  lcd_command( 0x1d );	// Bias Set; BS 1/5; 3 zeiliges Display /1d
 _delay_us(50);		// mehr als 26,3µs warten

  lcd_command( 0x50 );	// Booster aus; Kontrast C5, C4 setzen /50
 _delay_us(50);		// mehr als 26,3µs warten

  lcd_command( 0x6c );	// Spannungsfolger und Verstärkung setzen /6c
 _delay_ms( 500 );	// mehr als 200ms warten !!!
 
  lcd_command( 0x7c );	// Kontrast C3, C2, C1 setzen /7c
 _delay_us(50);		// mehr als 26,3µs warten

  lcd_command( 0x38 );	// Display EIN, Cursor EIN, Cursor BLINKEN /0f
 _delay_us(50);		// mehr als 26,3µs warten

  lcd_command( 0x0f );	// Display EIN, Cursor EIN, Cursor BLINKEN /0f
  _delay_us(50);		// mehr als 26,3µs warten

  lcd_command( 0x01 );	// Display löschen, Cursor Home
 _delay_ms(400);		//

  lcd_command( 0x06 );	// Cursor Auto-Increment
 _delay_us(50);		// mehr als 26,3µs warten

}

/* Funkcia zobrazi na pozicii kurzoru jeden znak */
/* Alias funkcia z dovodov kompatibility         */
void lcd_putc( char znak )
{
	lcd_data(znak);
}


/* Funkcia zobrazi na displeji nejaky text*/
void lcd_puts(char *string)
{
  /* ToDo: toto je vasa uloha */
}

/* Funkcia nastavi kurzor na poziciu riadok, stlpec */ 
/*   a text sa samozrejme vypise od kurzora dalej.  */
void lcd_setCursor(char row, char col)
{
  /* ToDo: aj toto je vasa uloha */
}

void lcd_clearline( unsigned char riadok )
{
 unsigned char index;
 lcd_setCursor( riadok, 0 );
 for (index=1; index<20; index++) lcd_data( ' ' );
}

void lcd_clear( void )
{
	lcd_clearline( 0 );
	lcd_clearline( 1 );
	lcd_clearline( 2 );
}

/* Funkcia zapne alebo vypne podsvietenie displeja */
void lcd_bklt( char OnOff)
{
  if (OnOff) 
     DISPLAY_BKLT_high;
  else
     DISPLAY_BKLT_low;
}

/* Funkcia ulozi uzivatelom definovany znak do CG RAM na Address */
void def_znak(unsigned char *ZnakArray, unsigned char Address)
{
  lcd_command(0x40|(Address<<3));  //nastavenie adresy znaku v CGRAM
  for(unsigned char i = 0;i<8; i++) lcd_data( *(ZnakArray + i));
  lcd_command(0x80);               // zmena na DD RAM
}
#include <Arduino.h>
#include <SPI.h>
#include <dogm_7036.h>
/*Available functions in dogm_7036 Libraray:
void initialize       (byte p_cs, byte p_si, byte p_clk, byte p_rs, byte p_res, boolean sup_5V, byte lines);
void string           (const char *str);
void ascii            (char character);
void position         (byte column, byte line);
void displ_onoff      (boolean on);
void cursor_onoff     (boolean on);
void define_char      (byte mem_adress, byte *dat);
void clear_display    (void);
void contrast         (byte contr);
*/

#define LED_D1 16
#define SW_A 17
#define SW_B 7
#define SW_C 8


// LCD Displej:
#define CLK 13   //(aka PB5)
#define SI 11    //(aka PB3)
#define RS 2     // (aka PD2)
#define CS 4     // (aka PD4)
#define BKLT 6   // (aka PD6)


dogm_7036 LCD;

int BL_pin       = 6; // BL je na pine D6

void init_backlight();
void mono_backlight(byte brightness);


void setup()
{
  init_backlight(); //use mono backlight in this sample code. Please change it to your configuration
//               CS,    RS
  LCD.initialize(CS,SI,CLK,RS,4,1,DOGM163);   //SS = 10, 0,0= use Hardware SPI, 9 = RS, 4 = RESET, 1 = 5V, EA DOGM163-A (=3 lines)
  LCD.displ_onoff(true);          //turn Display on
  LCD.cursor_onoff(true);         //turn Curosor blinking on


  LCD.clear_display();            //Clear the whole content
  LCD.position(1,1);              //set Position: first line, first character
  LCD.string("UAMT FEI STU");        //show String
  LCD.position(1,2);              //set Position: second line, first character
  LCD.string("5. aprila 2024");     
  LCD.position(1,3);              
  LCD.string("3 lines 16 char");   
  mono_backlight(255); //full
  
  delay(2000);
  
}

int con=0;
int mode=0;
int pod=0xff;

char buffer[16];
void loop()
{
  /* sem dame zmeny kontrastu a podsvietenia cez tlacitka */

  if ( digitalRead(SW_A)==0)
   if (mode)
       LCD.contrast(con--);
   else 
       mono_backlight(pod--);
  
  if ( digitalRead(SW_B)==0)
   if (mode)
       LCD.contrast(con++);
   else 
       mono_backlight(pod++);
  
  if (con<=0)  con =1;
  if (con>=63) con = 63;

  if (pod<=0)  pod = 1;
  if (pod>=255) pod = 255;

  
  if ( digitalRead(SW_C)==0)
    {  digitalWrite(LED_D1,HIGH);
      mode = !mode;
    }
    else
      digitalWrite(LED_D1,LOW);

              
  sprintf(buffer, "Podsviet: %02X   ", pod);
  LCD.position(1,2);              
           // 0123456789012345
  LCD.string(buffer);         

   sprintf(buffer, "Contrast: %02d   ", con);
  LCD.position(1,3);              
           // 0123456789012345
  LCD.string(buffer);         

   delay(100);

}


void init_backlight()
{
    pinMode(BL_pin,  OUTPUT);
    mono_backlight(255);
}

void mono_backlight(byte brightness)
{
  analogWrite(BL_pin, brightness);  
}


Dokumentácia

Inštrukcie radiča LCD displeja

Úloha

Upravte vzorový program tak, aby sa na zobrazovanej pozícii nezobrazoval kurzor. Požadovaný príkaz Cursor on/off (C) nájdete v tabuľke s inštrukciami.


Okrem zobrazovania jednotlivých znakov dokážeme pomocou riadiacich príkazov lcd_command() ovládať spôsob zobrazenia, meniť aktuálnu polohu kurzora, ako aj to či vôbec bude kurzor zobrazený, alebo nie. Príkladom jednej z najjednoduchších inštrukcií je 0000 0001, ktorým sa vymaže celý zobrazený obsah a kurzor sa vráti do počiatočenej pozície 0,0 - pozri prvý riadok v tabuľke nižšie.

V jazyku C sa dané inštrukcie dajú posielať pomocou príkazu lcd_command(), ktorý máte definovaný v lcd.h

Nasledovné inštrukcie ilustrujú využitie, pričom pre správne pochopenie by ste mali nahliadnuť aj do tabuľky nižšie.

 lcd_command(0x01);   /* Clear screen  - vid riadok 1 v tabulke */

 lcd_command(0x02);   /* Cursor to home position - vid riadok 2 v tabulke */

Prípadne si to môžete zapísať aj prehľadnejšie pomocou už známych operácií s bitmi:

#define LCD_CLR               0      /* DB0: clear display                  */
#define LCD_HOME              1      /* DB1: return to home position        */


 lcd_command(1<<LCD_CLR);   /* Clear screen */
 lcd_command(1<<LCD_HOME);  /* Set cursor to home position */

Iným užitočným a často používaným príkazom je nastavenie aktuálnej pozície kurzora, teda miesto na displeji, kam sa bude vypisovať text. Je to vlastne nastavenie adresy DDRAM, pričom jednotlivé adresy zodpovedajú pozíciam na displeji podľa tejto tabuľky.

// Nastavíme kurzor na 1. riadok pozicia 03 (4. v poradi) - na obr. pismeno E
   lcd_command(0x80 + 3);        // 0b1000 0000 + 3

// Nastavíme kurzor na 3. riadok pozicia 13 - na obr. pismeno t 
   lcd_command(0x80 + 0x20 + 13);	//  (0b1000 0000 + 0x2D)



Kompletná inštrukčná sada radiča HD44780 je uvedená v nasledovnej tabuľke:

HD44780U based instruction set
Instruction Code Description Execution
time (max)
(when fcp = 270 kHz)
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
Clear display 0 0 0 0 0 0 0 0 0 1 Clears display and returns cursor to the home position (address 0). 1.52 ms
Cursor home 0 0 0 0 0 0 0 0 1 * Returns cursor to home position. Also returns display being shifted to the original position. DDRAM content remains unchanged. 1.52 ms
Entry mode set 0 0 0 0 0 0 0 1 I/D S Sets cursor move direction (I/D); specifies to shift the display (S). These operations are performed during data read/write. 37 μs
Display on/off control 0 0 0 0 0 0 1 D C B Sets on/off of all display (D), cursor on/off (C), and blink of cursor position character (B). 37 μs
Cursor/display shift 0 0 0 0 0 1 S/C R/L * * Sets cursor-move or display-shift (S/C), shift direction (R/L). DDRAM content remains unchanged. 37 μs
Function set 0 0 0 0 1 DL N F * * Sets interface data length (DL), number of display line (N), and character font (F). 37 μs
Set CGRAM address 0 0 0 1 CGRAM address Sets the CGRAM address. CGRAM data are sent and received after this setting. 37 μs
Set DDRAM address 0 0 1 DDRAM address Sets the DDRAM address. DDRAM data are sent and received after this setting. 37 μs
Read busy flag &
address counter
0 1 BF CGRAM/DDRAM address Reads busy flag (BF) indicating internal operation being performed and reads CGRAM or DDRAM address counter contents (depending on previous instruction). 0 μs
Write CGRAM or
DDRAM
1 0 Write Data Write data to CGRAM or DDRAM. 37 μs
Read from CG/DDRAM 1 1 Read Data Read data from CGRAM or DDRAM. 37 μs
Instruction bit names —

I/D - 0 = decrement cursor position, 1 = increment cursor position; S - 0 = no display shift, 1 = display shift; D - 0 = display off, 1 = display on; C - 0 = cursor off, 1 = cursor on; B - 0 = cursor blink off, 1 = cursor blink on ; S/C - 0 = move cursor, 1 = shift display; R/L - 0 = shift left, 1 = shift right; DL - 0 = 4-bit interface, 1 = 8-bit interface; N - 0 = 1/8 or 1/11 duty (1 line), 1 = 1/16 duty (2 lines); F - 0 = 5×8 dots, 1 = 5×10 dots; BF - 0 = can accept instruction, 1 = internal operation in progress.


Vysvetlivky: CGRAM je pamäť tvarov špeciálnych znakov, ktoré si môže užívateľ nadefinovať sám (Character Generator RAM)

DDRAM je pamäť aktuálne zobrazených znakov (Display Data RAM). Každý zobrazený znak zodpovedá jednej pozícii v DDRAM. Prvý riadok má adresy od 0 po 1F pre 16 znakov. Druhý riadok má pridelené adresy 20 až 2F. Tretí riadok má potom adresy 30 až 3F.

Doba trvania (execution time) je stanovená pre oscilátor s frekvenciou 270 kHz. Avšak táto frekvencia záleží aj od napájacieho napätia a ďalších faktorov a môže sa pohybovať od 190 kHz po 350 kHz, takže ak nepoužívame bit BUSY ale pevné čakacie slučky, treba to zobrať do úvahy.

Výpis textových reťazcov

Úloha:

Namiesto vypisovania textov po jednom znaku si naprogramujte vlastnú funkciu na výpis textového reťazca. Potom demonštrujte jej využitie tak, že na tretí riadok displeja vypíšete svoje meno.

<syntaxhighlightlang="cpp">
void lcd_puts(const char *s);  /* deklaracia funkcie  */
void lcd_puts(const char *s)   /* definicia funkcie   */

{

 // sem pride vas vlastny kod...

}

void lcd_setCursor(char row, char col);  /* deklaracia funkcie  */
void lcd_setCursor(char row, char col)   /* definicia funkcie   */

{

 // sem pride vas vlastny kod...

}


lcd_setCursor(3,3);         // nastav kurzor na 3. riadok, 3. stlpec      
lcd_puts("Meno Priezvisko");
</syntaxhighlight>

Často však potrebujeme vypisovať aj hodnoty premenných a náročnejšie formátované výstupy. Ak vám chýba funkcia printf() s jej rozsiahlymi formátovacími možnosťami, oceníte ukážku využitia pomocou jej sesterskej funkcie sprintf(), ktorá vám pripraví požadovaný reťazec na výstup.

<syntaxhighlight lang="cpp">

/* zadefinujeme pole znakov, t.j. reťazec dlhý ako je riadok na displeji

* t.j. 16 plus jeden naviac na ukončovací znak reťazca \0                      */
             // 01234567890123456 +1 na koniec retazca

char riadok[]= {" "};

int value = 42; // premenná, ktorej hodnotu by sme chceli zobraziť na LCD

sprintf(riadok,"Dec %d = %03X Hex",value,value); // Zobrazíme ju 2x: raz desiatkovo a potom hexa

lcd_puts(riadok);

</ssyntaxhighlight>

Vytváranie vlastných znakov

Displej (resp. jeho radič HD44780) okrem iného obsahuje aj malú pamäť vyhradenú na užívateľom vytvorené znaky. Môže ich byť max. 8 a prístupné sú ako znaky s ASCII kódmi 0x00 až 0x08. S prvým zo znakov, ktorého kód je 0x00 je trocha problém, pretože aj reťazce v jazyku C používajú tento znak ako príznak konca reťazca. Znaky sa vytvárajú v matici 5x8 a ukladajú sa po riadkoch do pamäti CGRAM (Character Generator RAM) a mapujú sa na pozície 0-8 v DD RAM (Display Data RAM), alebo zrkadlene na adresy 9-F.

Vytváranie znakov ilustruje nasledovný obrázok. Keďže na hodnote najvyšších troch bitov nezáleží, budeme uvažovať s nulou.


Úloha:

Vypíšte na displej teplotu v stupňoch Celzia a svoje meno alebo iné slovo s diakritikou.

// vytvorenie specialneho znaku, ulozeny v IRAM, potom ho ulozime do CGRAM

 unsigned char Znak_SC[8]= {0x1A,0x1D,0x04,0x04,0x04,0x05,0x02,0};// st.C	

// zapis specialneho znaku do CGRAM  na poziciu 4 
 def_znak( Znak_SC,4);// supen Celzia

 lcd_data(0x04);		// znak zadany priamo kodom 

alebo ako súčasť reťazca
        // 0123456789012345  
 lcd_puts("Teplota: 37\x04");


Zoznam úloh na odovzdanie

  • Upravte vzorový program tak, aby sa na zobrazovanej pozícii nezobrazoval kurzor.
  • Naprogramujte vlastnú funkciu na výpis textového reťazca. Demonštrujte jej využitie tak, že na druhý riadok displeja vypíšete svoje meno.
  • Vypíšte na displej teplotu v stupňoch Celzia a svoje meno alebo iné slovo s diakritikou.


Zoznam bonusových úloh

  1. Zadefinujte vlastný špeciálny znak (znak s diakritikou) na pozíciu 0 (nula) CGRAM a zobrazte ako súčasť formátovaného príkazu do druhého riadku.
  2. Pripojte k mikropočítaču dve tlačítka, pomocou ktorých budete text na displeji posúvať vľavo a vpravo.