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.