Tutorial para usar us ar LCD HD44780 y similares. (Peter Dannegger 2011) Si gu i e nd ou nc ó di godee j e mp mpl os e nc i l l o,u ni v e r s a lya hor r a ndoc ó di go. ( ht t p: / / www. avr f r eaks . net / i ndex. php?name me=PNp NphpBB2&fil e=vi ewt wt opi c&t =102296) 1. Ha ydi f e r e n t e sma ne r a sd ec on t r ol a rl apa nt a l l aL CD.Us t e dpu edeut i l i z a r8bi t sc o ne lmodod e
pr uebasocupadoo4bi t sc onelmododeesper aocupada. Siu t i l i z aelmodoe s pe r ao c up ado,n ec e s i t a r a50μ spa r at r a ns mi mi t i ru nc a r á c t e r .Pe r ona di eesc a pa z del eeruncar ác t eren50μ s. Po rej e mp mp l ou nme di d ord i gi t a ls ó l omu e s t r aha s t a5me di c i o ne spo rs e gun do ,l oc u a le sbu e nop a r a l e e r .As i qu eu nav el o c i d a dd ea c t u a l i z a c i ónde200mse st a mb mb i é nu nv a l o rer g on ómi c op ar anu es t r a p a n t a l l a . Ent onces, porej emp mpl o,par aunLCD2x16est er esul t aenunacar gapar al aCPUde: 50μs*32/200ms ms=0, 8%. Asíqueelmodode4bi t sc onesper aocupadapuedenocausarnot abl ecar gadel aCPU. Pe r os ól one c e s i t ad e6pi n esd een t r a das a l i d a,a s íqu enoha yr a z ó np ar ape r d e r5p i n esmá sp ar a elusodelmodode8bi t sc onelmododepr uebasdeocupado. •
As ípu es ,n ec e s i t a mo mosl oss i gu i e nt e ss e i sl í n ea sdeL CDc o ne c t a doa lAVR: DB7,DB6,DB5,DB4,RSyE. E lRWl i n ede bee s t a rc o ne c t a d oaGND.Not eol v i d esd el ae n t r a d adec o nt r a s t ec o ne c t a do sde acuer doal ahoj adedat osdesuLCD.Enal gunosLCDquesepuedeconect araGND,per oal gunos ot r ospue de nne c es i t a ru nv ol t a j ene ga t i v oe né l ! . La sl í nea sDB3DB2,DB1yDB0puedens erc onec t ada saGND. •
2. E ls i gu i e n t epun t oe squ ee lL CDd eb eu s a r6p i ne sc ua l q ui e r as ea ,a u nq uenon e ce sa ri a me me n t een
e lmi s mop ue r t od e8b i t s .Da d oq ueha c e nmá sf á c i la lPCBype r mi t i rt o da v í ae lu s od ef u nc i o ne s e s pe c i a l e s( UART,I 2C,t e mp mpor i z a dor e s ,. . . )dede t e r mi na da spi ne s . Pa r ae l l o,ne c es i t a mosunama ma ne r as enc i l l adede fini rl ospi ne saut i l i z ar . E s t os epu edeha c e rf á c i l me nt ec onl as i gu i e nt ema ma c r o: struct bits { uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; } __attribute__((__packed__)); de!ine "#$%_(p&rt,pin) (('(&atie struct bits')*p&rt)+bpin) de!ine "#$%(,-) "#$%_(,-)
La macro se describe en otro tutorial. http://www.avrfreaks.net/index.php?name=PNphpBB!file=viewtopic!t="#$"%!start=all &hora podemos definir los " pines necesarios. 'ambi(n debemos definir los bits direcci)n correspondiente* +a ,ue una macro no se puede -enerar una se-unda macro en el interior: de!ine ./_4 de!ine ./__4
"#$%( %#, 0 ) "#$%( #, 0 )
de!ine ./_5
"#$%( %#, 4 )
de!ine ./__5
"#$%( #, 4 )
de!ine ./_6 de!ine ./__6
"#$%( %#, 3 ) "#$%( #, 3 )
de!ine ./_7 de!ine ./__7
"#$%( %#, 5 ) "#$%( #, 5 )
de!ine ./_" de!ine ./__"
"#$%( %#, 2 ) "#$%( #, 2 )
de!ine ./_0 de!ine ./__0
"#$%( %#, 1 ) "#$%( #, 1 )
3. Ahor apodemosempezarahacerelcódi go.
Enbusc adel ahoj adedat osHD44780,sepuedever ,quehayqueenvi arunni bbl e( 4bi t s)yun pu l s od el al í n eaEd ea l t ayba j a .E s t ef u ee lpa s ob ás i c oe nt odosl ose nv í osyporl ot a nt opod emos e sc r i bi rn ue s t r apr i me r af u nc i ónpa r ael l o. Te ne mosu nae nt r a dadeunb yt e ,d on des ól oe l4bi t ss u pe r i or e ss onut i l i z a dosye s t a b l e c e rl a s5 l í neasdel apant al l aenconsecuenci a.Luegohacemosunpul soenEdur ant e1μ s: static &id cd_nibbe( uint8_t d ) { ./_4 0; i!( d * 14 ) ./_4 ./_5 0; i!( d * 15 ) ./_5 ./_6 0; i!( d * 16 ) ./_6 ./_7 0; i!( d * 17 ) ./_7 ./_0 1; _dea-_us( 1 ); ./_0 0;
1; 1; 1; 1; 1us
}
Pe r ode s pu ésdel ai n i c i a l i z a c i ón ,n ec e s i t a mose nv i a rs i e mpr eunb yt ee nt e r o .Yde s pu ésdec a da by t e ,n ec e s i t a mosu nae s pe r aa c t i v adea l r e de dord e50μ s .As íqu ene c e s i t a mosl as i gu i e nt ef u nc i ón : static &id cd_b-te( uint8_t d ) { cd_nibbe( d ); cd_nibbe( d4 ); _dea-_us( 50 ); }
50us
Ta mbi é nd ebe mose nv i a ri n s t r u c c i on esyda t o sal apa nt a l l aL CD.L aú ni c adi f e r e n c i aese le s t a dode l al í ne aRS.Ya l gun asi ns t r uc c i on es( Di s pa yc l a r o ,devi s i t a )n e c es i t amá st i e mpooc upa dade al r ededorde2ms: &id cd_c&and( uint8_t d ) { ./_" 0; cd_b-te( d ); i!( d 3 ) _dea-_s( 2 ); }
9ait 2s
&id cd_putcar( uint8_t d ) { ./_" 1; cd_b-te( d ); }
Ahor ae s t a mosl i s t osp ar ai ni c i a l i z a re lL CD.Enpr i me rl uga rd e be mose s t a bl e c erl os6pi ne sa u t i l i z a rc o mos a l i d as .L ue god ebe moss e gui re lor de nd ei n i c i a l i z a c i ónde lmod od e4bi t sdeac u er do c o nl ahoj adeda t os .¿ Po rq uéde be mo st r a t a rd ee s t a b l e c e re lmod od e8b i t sporp r i me r ave z ? De s p ué sdede s e r n e r g í z a r ,a lr e s t a b l e c e re lL CDd eb ee s t a re ne lmo dod e8b i t s .Pe r od es p ué sde e ne r g i z a ror e i ni c i a l i z a rp orot r af u e nt e( r e s etma nua l ,owa t c h dog) ,e le s t a doe sde s c onoc i do. As íqu el aú ni c apos i bi l i da dd ee nc e nd erl apa nt a l l aLCDe nu ne s t a doc o noc i do,e ses t a bl e c e re l mod od e8bi t se np r i me rl u ga r .Yaqu ee s t op ue def a l l a r ,s il apa nt a l l ae s t a b ae ne lmod od e4b i t sy s equ e dae s p er a n doe ls e g un doni b bl e ,d ebe mo si n t e n t a r l od osv e c e s . &id cd_init( { ./__4 ./__5 ./__6 ./__7 ./__" ./__0 ./_0 0; ./_" 0;
&id ) 1; 1; 1; 1; 1; 1;
_dea-_s( 15 ); cd_nibbe( 030 ); _dea-_s( 4+1 ); cd_nibbe( 030 ); _dea-_us( 100 ); cd_nibbe( 030 ); _dea-_us( ./_%$_<% ); cd_nibbe( 020 ); _dea-_us( ./_%$_<% ); cd_c&and( 028 ); cd_c&and( 008 ); cd_c&and( 001 ); cd_c&and( 006 ); cd_c&and( 00/ );
enabe &utput pins
send c&ands
4 bit &de
2 ines 5'7 dispa- &!! dispa- cear curs&r increent &n, n& curs&r, n& bink
}
Al gu na sf u n c i on esa di c i on al e squ ee nc o nt r a r a sene lc ó di gofi n al : l c d _p ut s( ) :mo s t r a ru naca d en ad ec a r a c t e r e st e r mi n a daenNUL L . l dc _x y( ) :e st a bl e c ee lc ur s orha s t ax( c ol umna ) ,y( l í ne a) l d c _bl a nk :s obr e s c r i bi ru np ed az odel apa nt a l l aL CDc o ne s pa c i ose nbl a nc o •
•
•
Por ,u( lcdx+ se llev) a cabo como macro? 0ado ,ue por lo -eneral la posici)n es conocida en tiempo de compilaci)n* es un ahorro de c)di-o* + si el comando se calcula en tiempo de compilaci)n tambi(n lo es. ¿Porquénousarni ngúncomandocl ear ? Cuandoseusaelcomandocl earsepuedeversi empr eunmol est opar padeohast aqueelt ext of ue e s c r i t od en ue v o.Po rl ot a n t o ,e s t os ev emu c h omá spr of e s i on a l ,s i s eomi t ee s tec o ma n doy s i mpl e me nt es obr e s c r i bi re la nt i gu ot e x t oc onun on ue v o.
4. F i n al me nt ee s t a mosp r e pa r a d osp a r ae s c r i bi rn ue s t r opr i me rp r o gr a maq ueu t i l i z au nL CD.
int ain( &id ) { cd_init(); cd_-( 2, 0 ); cd_puts( =>e& eter= ); !&r(;;){ } }
Re s u l t a d ofin a l .
' cd_dr+c ' incude =ain+= incude =cd_dr+= uint8_t cd_p&s ./_.$?1; static &id cd_nibbe( uint8_t d ) { ./_7 0; i!( d * 17 ) ./_7 ./_6 0; i!( d * 16 ) ./_6 ./_5 0; i!( d * 15 ) ./_5 ./_4 0; i!( d * 14 ) ./_4 ./_0 1; _dea-_us( ./_%$_?< ); ./_0 0; }
1; 1; 1; 1;
static &id cd_b-te( uint8_t d ) { cd_nibbe( d ); cd_nibbe( d4 ); _dea-_us( ./_%$_<% ); } &id cd_c&and( uint8_t d ) { ./_" 0; cd_b-te( d ); s9itc( d ){ case 0 +++ 3: _dea-_us( ./_%$_/. ); d ./_.$?1; case 080 +++ 0AA: cd_p&s d; } }
&n &n@er c&ands set p&siti&n
&id cd_putcar( uint8_t d ) { ./_" 1; cd_b-te( d ); s9itc( BBcd_p&s ){ case ./_.$?1 B ./_/.C?: d ./_.$?2; break; case ./_.$?2 B ./_/.C?: d ./_.$?1; break; de!aut: return; } cd_c&and( d ); } &id cd_puts( &id 's ) { !&r( uint8_t 's1 s; 's1; s1BB ) cd_putcar( 's1 );
dispa- strin@ !r& "< unti Der& b-te
} &id cd_bank( uint8_t en ) { 9ie( enEE ) cd_putcar( F F ); } &id cd_init( { ./__4 ./__5 ./__6 ./__7 ./__" ./__0 ./_0 0; ./_" 0;
bank n di@its
&id ) 1; 1; 1; 1; 1; 1;
enabe &utput pins
send c&ands
_dea-_s( 15 ); cd_nibbe( 030 ); _dea-_s( 4+1 ); cd_nibbe( 030 ); _dea-_us( 100 ); cd_nibbe( 030 ); _dea-_us( ./_%$_<% ); cd_nibbe( 020 ); _dea-_us( ./_%$_<% ); cd_c&and( 028 ); cd_c&and( 008 ); cd_c&and( 001 ); cd_c&and( 006 ); cd_c&and( 00/ );
4 bit &de
2 ines 5'7 dispa- &!! dispa- cear curs&r increent &n, n& curs&r, n& bink
} ' cd_dr+ ' i!nde! _cd_dr__ de!ine _cd_dr__ de!ine ./_/.C? de!ine ./_.$?
16 2
de!ine de!ine de!ine de!ine
080 (080 B 040) (080 B 014) (080 B 054)
./_.$?1 ./_.$?2 ./_.$?3 ./_.$?4
de!ine ./_%$_?< 1+0 de!ine ./_%$_<% 50+0 de!ine ./_%$_/. 2000+0
1Gs 50Gs 2s
&id cd_putcar( uint8_t d ); &id cd_init( &id ); &id cd_puts( &id 's ); &id cd_bank( uint8_t en ); bank n di@its &id cd_c&and( uint8_t d ); de!ine cd_-(, -) cd_c&and(() B ((-) H ./_.$?2 : ./_.$?1 )) endi!
' -de!s+ ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' ' ' "eera ep!u de!initi&ns ' ' ' '
__attribute__(("_ain));
!&rce access &! interrupt ariabes de!ine $J<() ('(&atie t-pe&!()')*()) a9a-s inine !uncti&n de!ine <$.() static __attribute__ ((a9a-s_inine)); static ? de!ine n&p()
__as__ &atie(=n&p=::)
endi! ' ain+c ' i!nde! _ain__ de!ine _ain__ incude arinterrupt+I incude arp@space+I incude =-de!s+= de!ine
K%<.
8e6
8>D
de!ine A_/C K%<. incude utidea-+I de!ine de!ine
./_4 ./__4
"#$%( %#, 0 ) "#$%( #, 0 )
de!ine de!ine
./_5 ./__5
"#$%( %#, 4 ) "#$%( #, 4 )
de!ine de!ine
./_6 ./__6
"#$%( %#, 3 ) "#$%( #, 3 )
de!ine de!ine
./_7 ./__7
"#$%( %#, 5 ) "#$%( #, 5 )
de!ine de!ine
./_" ./__"
"#$%( %#, 2 ) "#$%( #, 2 )
de!ine de!ine
./_0 ./__0
"#$%( %#, 1 ) "#$%( #, 1 )
endi! ' ain+c ' incude incude incude incude
strin@+I stdib+I =ain+= =cd_dr+=
int ain( &id ) { uint32_t a 0; car sLsiDe&!(=42M4M672M5=)N;
<"/$$ space !&r 32 bit nuber
cd_init(); cd_-( 2, 0 ); cd_puts( =>e& eter= ); !&r(;;){ ut&a( a, s, 10 ); cd_-( 0, 1 ); cd_bank( 10 E stren( s )); insert spaces unti nuber cd_puts( s ); dispa- nuber ri@t adOusted aBB; } }