Dani Display

2013-01-13

 

Egyik kedves barátomnak készítettem ezt a programot/áramkört. LCD kijelzőre szeretett volna soros porton keresztül kiírni szövegeket. A kapcsolás annyiban különbözik az előzőektől, hogy a belső oszcillátor nem volt elég pontos a soros vonali kommunikációhoz, ezért kiegészítettem egy kerámia rezonátorral.

A kerámia szűrőhöz csináltam egy körömnyi öcsi-panelt. A kerámia szűrő középső lábát egy vezetékkel a földre kell kötmi.

Az eszköz 4 parancsot tud végrehajtani. Igazából a begépelt szöveget [Enter] -rel kell lezárni, és az első betüjét értelmezi parancsnak. A kiirási parancsok második betüje szintén 0..9-ig terjedő számjegy, amely azt adja meg, hányadik betütől kezdődjön az ezt követő szöveg kiírása.
C - LCD törlése
I - Információs képernyő
0 - Kiírás az első sorba
1 - Kiírás a második sorba

Itt látható APH2-es fejem soros oldala munkában. A programban 9600 Baud Rate-et, No parity, 1 Stop bit értékeket állítottam be. A terminál programba is ezt kell beállítani. Az I parancs hatása

C [Enter]
00árvíztűrő [Enter]
01tükörfúrógép [Enter]
parancsok hatása. Mint ismert, ebben a szövegben megtalálható az összes ékezetes magyar betü. A memória mérete miatt csak a kis ékezetes betük érhetők el.

Ebben a programban jött elő a hiba, hogy a képernyő törlés parancs kiadása után kell várni 2 msec-et. A program egyéb tevékenység hiányában folyamatosan várakozik, hogy jött-e valami a soros vonalon? A bejövő karaktereket letárolja egy buffer-be. Figyeli, hogy, ne csorduljon túl. Ha [Enter]-t ütünk (leánykori nevén [CR]), feldolgozza a begépelt karakter sort. Az első betüt tekinti parancsnak. Parancs végrehajtás után a buffert törli.

Itt látható a program.



/*******************************************************************************
*   Author       -  Kiraly Tibor                                               *
*                   http://www.tkiraaly.hu                                     *
*   Date         -  2013.01.03.                                                *
*   Chip         -  Atmel ATtiny2313 & HD44780                                 *
*   Compiler     -  avr-gcc (WinAVR )                                          *
*                                                                              *
*   DaniDisplay V1                                                             *
*   A soros porton varja az utasitasokat, beállítása 9600N1                    *   
*   4 utasitast ismer, a tobbire nem reagal, az utasitas vege CR (13).         *
*   C - kepernyo torles                                                        *
*   I - informacio kiiras                                                      *
*   0 - kiiras felso sorba                                                     *
*   1 - kiiras also sorba                                                      *
*   Kiirasi parancsok masodik betuje szamjegy, amely azt mutatja hanyadik      *
*   Betunel kezdodik a kiiras, azutan a kiirando szoveg kovetkezik.            *
*   pl.: i, c, 00Kiraly, 10Tibor, 182013                   *
*                                                                              *
********************************************************************************
*   PonyProg Configuration and Security Bits (bepipalva):                      *
*   Klso keramia szuro oszcilator: SUT0                                        *
*                                                                              *
*******************************************************************************/
//
//
//    LCD bekotese:
//
//    14   LCD D7       - AVR PB3 - 15
//    13   LCD D6       - AVR PB2 - 14
//    12   LCD D5       - AVR PB1 - 13
//    11   LCD D4       - AVR PB0 - 12
//    10   LCD D3       - VDD              ( VDD - 2 soros kijelzo, GND - 1 soros)
//     9   LCD D2       - GND
//     8   LCD D1       - GND
//     7   LCD D0       - GND
//     6   LCD E        - AVR PD6 - 11     (1 - change data - 0)
//     5   LCD RW       - GND              (0- write, 1- read)
//     4   LCD RS       - PD5              (0- istruction, 1- data)
//     3   LCD KONTR    - 10 kOhm trim.
//     2   LCD VDD      - +5V
//     1   LCD VSS      - GND


#ifndef F_CPU
#define F_CPU                4000000             // orajel (MHz)
#endif
#define BAUDRATE             9600
#define CMD_LINE_LENGHT      18                  // parancs sor hossza




#include "tkiraaly_attiny2313.h"
#include "tkiraaly_lcddef.h"
#include 
#include 




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_putc_hu( UC);                           // betu kiirasa, magyar Win konverzio
void lcd_puts_hu( const char *);                 // string kiirasa, magyar betuk is
void lcd_defc( const uint8_t *);                 // egyedi betu(k) beallitasa        
void cmd_line( void);                            // parancssor feldolgozo




#define LCD_E                6
#define LCD_E_0              BC( PORTD, LCD_E)
#define LCD_E_1              BS( PORTD, LCD_E)

#define LCD_RS               5
#define LCD_RS_UTASITAS      BC( PORTD, LCD_RS)
#define LCD_RS_ADAT          BS( PORTD, LCD_RS)

#define LED                  4
#define LED_BE               BC( PORTD, LED)
#define LED_KI               BS( PORTD, LED)

#define LCD_PORT             PORTB               // also 4 bit
#define LCD_PORT_ENABLE      DDRB= 0B00001111    // also 4 bit kimenet




const uint8_t magyar_betuk[] PROGMEM =
{
   0,
                                                 // á - 0
   Cx______X_,
   Cx_____X__,
   Cx____XXX_,
   Cx_______X,
   Cx____XXXX,
   Cx___X___X,
   Cx____XXXX,
   Cx________,
                                                 // é - 1
   Cx______X_,
   Cx_____X__,
   Cx____XXX_,
   Cx___X___X,
   Cx___XXXXX,
   Cx___X____,
   Cx____XXX_,
                                                 // í- 2
   Cx________,
   Cx______X_,
   Cx_____X__,
   Cx________,
   Cx____XX__,
   Cx_____X__,
   Cx_____X__,
   Cx____XXX_,
   Cx________,
                                                 // ó - 3
   Cx______X_,
   Cx_____X__,
   Cx____XXX_,
   Cx___X___X,
   Cx___X___X,
   Cx___X___X,
   Cx____XXX_,
   Cx________,
                                                 // ő - 4
   Cx_____X_X,
   Cx____X_X_,
   Cx____XXX_,
   Cx___X___X,
   Cx___X___X,
   Cx___X___X,
   Cx____XXX_,
   Cx________,
                                                 // ú - 5
   Cx______X_,
   Cx_____X__,
   Cx________,
   Cx___X___X,
   Cx___X___X,
   Cx___X__XX,
   Cx____XX_X,
   Cx________,
                                                 // Ű - 6
   Cx_____X_X,
   Cx____X_X_,
   Cx________,
   Cx___X___X,
   Cx___X___X,
   Cx___X__XX,
   Cx____XX_X,
   Cx________,
   
   0xFF
};




UC usart_input= 0;                               // soros portrol bejovo betu




ISR( USART_RX_vect)                              // USART megszakitas kezelese
{
   usart_input= UDR;
}




int main( void)
{
   IT_DISABLE;
   DDRD= 0B01110000;                             // LCD init
   LCD_PORT_ENABLE;
   lcd_init4();
   UBRRL= ( F_CPU/( BAUDRATE* 16UL))- 1;         // USART init
   UBRRH= (( F_CPU/( BAUDRATE* 16UL))- 1)>> 8;
   UCSRC= ASYNCRON+ BIT_8+ PARITY_NO+ STOPBIT_1;
   UCSRB= RX_ENABLE+ TX_ENABLE+ IT_RX_ENABLE;
   IT_ENABLE;
   LED_BE;
   lcd_defc( magyar_betuk);
   lcd_cls();
   lcd_yx( 1, 6);
   lcd_puts_hu( PSTR( "DD1 Ready"));
   lcd_yx( 0, 0);
   for( ;;) cmd_line();                          // parancs feldolgozas
   return 0;
}




void lcd_init4( void)                            // LCD inicializalasa 4 bitre
{
   _delay_ms( 15);
   LCD_RS_UTASITAS;
   LCD_PORT= 0x00000010;                         // 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 & 0B11110000) | ( 0B00001111 & c >> 4);
   LCD_E_0;
   LCD_E_1;                                      // also 4 bit
   LCD_PORT= ( LCD_PORT & 0B11110000) | ( 0B00001111 & c);
   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_defc( const uint8_t *s)                 // egyedi betu(k) beallitasa
{
   register unsigned char c;
   LCD_RS_UTASITAS;
   lcd_putc( ( ( pgm_read_byte( s++) & 0B00000111) << 3) | 0B01000000);   // betu cime + parancs 
   LCD_RS_ADAT;
   while ( ( c= pgm_read_byte( s++)) != 0xFF) lcd_putc( c);
   LCD_RS_UTASITAS;
   LCD_RS_ADAT;
}




void lcd_putc_hu( UC c)                          // magyar betu kiirasa LCD-re
{
   switch( c)
   {
      case 0xD6:                                 // Ö
      case 0xF6:                                 // ö
                  c= 0xEF;
                  goto kiir;
      case 0xDC:                                 // Ü
      case 0xFC:                                 // ü
                  c= 0xF5;
                  goto kiir;
      case 0xC1:                                 // Á
      case 0xE1:                                 // á
                  c= 0;
                  goto kiir;
      case 0xC9:                                 // É
      case 0xE9:                                 // é
                  c= 1;
                  goto kiir;
      case 0xCD:                                 // Í
      case 0xED:                                 // í
                  c= 2;
                  goto kiir;
      case 0xD3:                                 // Ó
      case 0xF3:                                 // ó
                  c= 3;
                  goto kiir;
      case 0xD5:                                 // Ő
      case 0xF5:                                 // ő
                  c= 4;
                  goto kiir;
      case 0xDA:                                 // Ú
      case 0xFA:                                 // ú
                  c= 5;
                  goto kiir;
      case 0xDB:                                 // Ű
      case 0xFB:                                 // ű
                  c= 6;
                  goto kiir;
      default:;
   }
   kiir:
   lcd_putc( c);
}




void lcd_puts_hu( const char *s)                 // string kiiras, magyar betuk is
{
   register unsigned char c;
   while ( ( c= pgm_read_byte( s++))) lcd_putc_hu( c);
}




void cmd_line( void)                             // parancssor feldolgozo
{
   static UC cmd[ CMD_LINE_LENGHT];              // parancs sor
   static UC hossz= 1;                           // szamlalo a parancs sor hosszahoz
   static UC * p= cmd;                           // mutato a parancs sorhoz, elejere allas
   UC c;                                         // bejovo betuhoz
   UC y;
   UC x;
   if ( usart_input != 0)                        // jott be betu?
   {
      c= usart_input;                            // bejott betu eltarolasa feldolgozasra
      usart_input= 0;
      switch( c)                                 // parancs lezaras jott be?
      {
         case 10: break;                         // LF - kihagy, eldob
         case 13:                                // CR - parancs lezaras -> feldolgozas
         {
            *p= '\0';                            // parancs vege, lezaras
            p= cmd;                              // mutato allitasa a parancs elejere
            switch( *p)
            {
               case 'I':                      // info keres
               case 'i':
                  lcd_cls();
                  lcd_yx( 0, 0);
                  lcd_puts_hu( PSTR( "tkiraaly.hu 2013"));
                  lcd_yx( 1, 0);
                  lcd_puts_hu( PSTR( "DaniDisp V1"));
                  break;
               case 'C':                      // kepernyo torles
               case 'c':
                  lcd_cls();
                  lcd_yx( 0,0);
                  break;
               case '0':                      // kiiras
               case '1':                      // y = 0..1
                  y= *p- '0';
                  if ( y > 1) y= 1;
                  x= *++p- '0';               // x = 0..9
                  if ( x > 9) x= 9;
                  lcd_yx( y, x);
                  while ( *++p) lcd_putc_hu( *p);
            }
            hossz= 1;                            // parancs feldolgozasa utan torles
            p= cmd;
            *p= '\0';
            break;
         }   
         default:                                // barmi egyeb jott be, eltarolja
         {
            *p= c;
      	    if( hossz != CMD_LINE_LENGHT)        // cmd max hossza
            {
               p++;
               hossz++;
            }
         }   
      }
   }
}

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