Un orologio/datario con visualizzazione su display LCD realizzato con un AT89C4051. In figura 1 è riportato lo schema elettrico. Lo switch SW3 permette di selezionare il parametro da modificare mentre con SW1 ed SW2 rispettivamente si decrementa o si incrementa il parametro selezionato. Il listato 4 riporta alcune delle funzioni per l’implementazione dell’orologio.
/*---------------------------------------------------- ****** port and bit assignment for LCD ******* ----------------------------------------------------*/ typedef unsigned char bit_8; sbit rs=P3^5; // register select is port 3.5 sbit rw=P3^4; // read/write is port 3.4 sbit en=P3^3; // enable is port 3.3 sbit d7=P1^7; // busy flag is port 1.7 sbit sel_param=P3^2; // select switch to select the clock parameter sbit chg_param_inc=P3^1; // change switch to change the clock parameter sbit chg_param_dec=P3^0; bit_8 code *days[]={"*Sun*","*Mon*","*Tue*","*Wed*","*Thu*","*Fri*","*Sat*"}; // days array bit_8 code *val[]={"0","1","2","3","4","5","6","7","8","9","10","11","12"}; // digit array bit flag; bit_8 month=1,date=1,hh,lmin,hmin,hsec,lsec,day=0,lyear=5,hyear=0,date_count; /*------------------------- *** Function Prototypes *** -------------------------*/ void ini(void); void command(bit_8); void data_in(bit_8*); void busy(void); void sec1(void); void month_select(bit_8); void date_in(bit_8); void set_clock(); void delay(void); /*----------------- *** some macros *** -----------------*/ #define DISABLE_INT IE=0x0; #define ENABLE_INT IE=0x81; /*---------------------- *** one second delay *** ----------------------*/ void sec1()//can be fine tuned by changing the for loop values { bit_8 i,j; TMOD=0x11; for(i=0;i<230;i++) _nop_(); for(i=0;i<7;i++) { TH1=0; TH0=1; TL1=0; TL0=0; TR1=1; for(j=0;j<119;j++) _nop_(); while(TF1!=1) { for(j=0;j<255;j++); _nop_(); } TF1=0; TR0=1; TR1=0; while(TF0!=1) { for(j=0;j<120;j++) _nop_(); } TF0=0; TR0=0; } } /*--------------------- *** selecting month *** ---------------------*/ void month_select(bit_8 mon) { bit_8 year; switch(mon) { case 1: date_count=31; break; case 2: year=hyear*10+lyear; if(year%4==0) date_count=29; else date_count=28; break; case 3: date_count=31; break; case 4: date_count=30; break; case 5: date_count=31; break; case 6: date_count=30; break; case 7: date_count=31; break; case 8: date_count=31; break; case 9: date_count=30; break; case 10: date_count=31; break; case 11: date_count=30; break; case 12: date_count=31; break; } }
Listato 4 |

A livello di codice e’ interessante l’uso dello switch-case. Per esercizio potrebbe essere interessante valutare un’ altra possibile implementazione (difficile credo) al posto del case.
Per esempio Maurizio, usando delle look-up table ?
Si consuma un po’ di memoria però si avrebbe un tempo di esecuzione veloce e soprattutto sempre costante.
Non conosco il micro in questione, quindi non so’ se, in questo caso, sarebbe conveniente (e soprattutto ne valga la pena).
Che ne pensi ?
Mi sembra un’ottima riflessione 😉 Molto utilizzate nell’imaging
Veramente molto interessante, ma non ho idea su come si possa programmare il microcontrollore, cioè quale ide e quale hardware sono necessari, potresti darmi qualche informazione?
C’è un bel corso sui micro http://it.emcelettronica.com/eos-book-2-corso-di-microprogrammazione-tutti poi anche questo articolo http://it.emcelettronica.com/sistemi-di-sviluppo-per-microcontrollori Valuta un attimo.