ATmega8 - LCD kezelés

2013-02-03

 

Egy kis LCD kezelési ujjgyakorlat. A már korábban megoldott LCD vezérlést megírtam ATmega8-ra is. Annyi eltérés azért van, hogy az LCD adat vezetékei most az egyik port felső felére csúsztak. A kapcsolás:

Az asztalon összedugdosva a kapcsolás. A kapcsi rajzhoz képest rajta van a korábbi billentyű kezeléshez tartozó rész is.

Kicsi minimalista LCD kezelés, csak a legszükségesebb rutinokkal.



/*******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2013.02.03.
*   Chip         -  Atmel ATmega8 & HD44780
*   Compiler     -  avr-gcc (WinAVR)
*
*   LCD kezeles ATmega8-cal.
*   
********************************************************************************
*    LCD bekotese:
*
*    14   LCD D7       - AVR PD7 - 13
*    13   LCD D6       - AVR PD6 - 12
*    12   LCD D5       - AVR PD5 - 11
*    11   LCD D4       - AVR PD4 -  6
*    10   LCD D3
*     9   LCD D2
*     8   LCD D1
*     7   LCD D0
*     6   LCD E        - AVR PC2 - 25
*     5   LCD RW       - GND
*     4   LCD RS       - AVR PC3 - 26
*     3   LCD KONTR    - 10 kOhm trim.
*     2   LCD VDD      - +5V
*     1   LCD VSS      - GND
*
*******************************************************************************/
#define F_CPU                4000000             // orajel (MHz)
 
#include "tkiraaly_atmega8.h"
#include 
#include 
 
#define LED                  0
#define LED_ENABLE           BS( DDRB, LED)
#define LED_BE               BC( PORTB, LED)
#define LED_KI               BS( PORTB, LED)
 
#define LCD_E                2
#define LCD_E_ENABLE         BS( DDRC,  LCD_E)
#define LCD_E_0              BC( PORTC, LCD_E)
#define LCD_E_1              BS( PORTC, LCD_E)
 
#define LCD_RS               3
#define LCD_RS_ENABLE        BS( DDRC,  LCD_RS)
#define LCD_RS_UTASITAS      BC( PORTC, LCD_RS)
#define LCD_RS_ADAT          BS( PORTC, LCD_RS)
 
#define LCD_PORT             PORTD               // felso 4 bit+ E, RS
#define LCD_PORT_ENABLE      DDRD= 0B11110000
 
void lcd_init4( void);                           // LCD inicializalasa 4 bitre
void lcd_putc( UC);                              // betu kiirasa
void lcd_putcmd( UC);                            // parancskod kiadasa
void lcd_yx( UC, UC);                            // kurzor pozicioja 0..3/0..15
void lcd_cls( void);                             // kepernyo torles
void lcd_puts( const char *);                    // string kiirasa
 
int main( void)
{
   lcd_init4();
   lcd_cls();
   lcd_yx( 0, 0);
   lcd_puts( PSTR( "tkiraaly.hu 2013"));
   lcd_yx( 1, 1);
   lcd_puts( PSTR( "ATmega8 - LCD"));
   LED_ENABLE;
   LED_BE;
   return 0;
}
 
void lcd_init4( void)                            // LCD inicializalasa 4 bitre
{
   LCD_PORT_ENABLE;
   LCD_E_ENABLE;
   LCD_RS_ENABLE;
   _delay_ms( 15);
   LCD_RS_UTASITAS;
   LCD_PORT= 0B00100000;                         // 4 bit interface
   LCD_E_1;
   LCD_E_0;
   _delay_ms( 5);
   LCD_E_1;
   LCD_E_0;
   _delay_us( 120);
   lcd_putc( 0B00101000);                        // 4 bit interface, 2 sor, 5x8 pontos betu
   lcd_putc( 0B00101000);                        // 2x kell kiadni, vagy LCD D3-t VDD-re kell kotni
   lcd_putc( 0B00001100);                        // kijelzes be, cursor ki
   lcd_putc( 0B00000110);                        // kiiras jobbra
   LCD_RS_ADAT;
}
 
void lcd_putcmd( UC cmd)                         // parancskod kiadasa
{
   LCD_RS_UTASITAS;
   lcd_putc( cmd);
   LCD_RS_ADAT;
}
 
void lcd_putc( UC c)                             // egy betu kiiras
{
   LCD_E_1;                                      // felso 4 bit
   LCD_PORT= ( LCD_PORT & 0x0F) | ( 0xF0 & c);
   LCD_E_0;
   LCD_E_1;                                      // also 4 bit
   LCD_PORT= ( LCD_PORT & 0x0F) | ( 0xF0 & c << 4);
   LCD_E_0;
   _delay_us( 37);                               // var 37 usec  
}
 
void lcd_yx( UC sor, UC betu)                    //  kurzor pozicionalasa 0..3/0..15
{
   UC cim= 0x80;                                 // parancs kodja
   if (sor & 0B00000001) cim+= 64;               // 1. es 3. sor
   if (sor & 0B00000010) cim+= 20;               // 2. es 3. sor
   cim+= betu & 0x0F; 
   lcd_putcmd( cim);
}
 
void lcd_cls( void)                              // kepernyo torles
{
   lcd_putcmd( 0x01);
   _delay_ms( 2);
}
 
void lcd_puts( const char *s)                   // string kiiras
{
   register unsigned char c;
   while ( ( c= pgm_read_byte( s++))) lcd_putc( c);
}

Itt a vége, fuss el véle, legytek az én vendégeim, innen letölthetitek a hozzávalókat összecsomagolva.