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.