Suite à l'essai concluant de l'afficheur LCD économique DEM 16209 FGH-PW.
Je l'ai adapté à la minuterie à afficheur LED décrite dans ce blog.
En fait, tous les afficheurs LCD de type HD 44780 (1602) conviennent.
Avantages:
Inconvénients:
Le schéma: (cliquez dessus pour agrandir).
Quelques photos de la maquette:
On affiche par 2 potentiomètres le temps voulu, de 0 à 59mn 59 s, une valeur à changer dans le logiciel pour modifier ce temps max, jusqu'à 99mn 59 s.
Ce temps s'affiche sur la première ligne.
On appuie sur ON/OFF.
Le temps décompté apparait sur la seconde ligne.
La diode rouge s'allume.
Lorsque le décompte passe à 0, la diode s'éteint, un beep, et retour à la photo ci dessus.
En affichant 00:00, nous avons un compteur. ON/OFF pour démarrer, la lumière s'allume, le temps s'affiche. ON/OFF, la lumière s'éteint.
Le code:
Le fichier .bas original en téléchargement ICI est beaucoup plus lisible et mieux commenté. A ouvrir dans le "Picaxe programming editor", c'est mieux, en couleurs!
' MINUTERIE LCD ALPHANUMERIQUE ET PICAXE 14M2
#picaxe14M2 'directive 14M2
setfreq m16 '4 ou 16 MHz pour la variable time.
'le LCD fonctionne sur les 2 fréquences !!
dirsB=%111111 'défini les ports B en sorties
dirsC=%000110 'idem I/O ports C
SYMBOL RS = B.0 ; 0 = Command 1 = Data
SYMBOL E = B.1 ; 0 = Idle 1 = Active
SYMBOL DB4 = B.2 ; LCD Data Line 4
SYMBOL DB5 = B.3 ; LCD Data Line 5
SYMBOL DB6 = B.4 ; LCD Data Line 6
SYMBOL DB7 = B.5 ; LCD Data Line 7
SYMBOL RSCMDmask = %00000000 ; Select Command register
SYMBOL RSDATmask = %00000001 ; Select Data register
SYMBOL cpt = b1
SYMBOL car = b2
SYMBOL rsbit = b3
'Nibble commands - To initialise 4-bit mode
DATA 0,( $33 ) ; %0011---- %0011---- 8-bit / 8-bit
DATA 1,( $32 ) ; %0011---- %0010---- 8-bit / 4-bit
'Byte commands - To configure the LCD
DATA 2,( %00101000 ) ; %001LNF00 Display Format
DATA 3,( %00001100 ) ; %00001DCB Display On
DATA 4,( %00000110 ) ; %000001IS Cursor Move
‘ ; L : 0 = 4-bit Mode 1 = 8-bit Mode
‘ ; N : 0 = 1 Line 1 = 2 Lines
‘ ; F : 0 = 5x7 Pixels 1 = N/A
‘ ; D : 0 = Display Off 1 = Display On
‘ ; C : 0 = Cursor Off 1 = Cursor On
‘ ; B : 0 = Cursor Steady 1 = Cursor Flash
‘ ; I : 0 = Dec Cursor 1 = Inc Cursor
‘ ; S : 0 = Cursor Move 1 = Display Shift
DATA 5,( $01 ) ; Clear Screen
PowerOnReset:
FOR cpt = 0 TO 5
READ cpt,car
GOSUB SendInitCmdByte
NEXT
'*********************** DEBUT PROGRAMME PERSO ************
DATA 6,("TOTAL: ") 'Texte sur l'afficheur
DATA 13,("RESTE: ")
symbol nmn = b4
symbol nsec = b5
symbol dsec = b6
symbol usec = b7
symbol ndmn = b8
symbol memOnOff = b9
symbol temps = w10
symbol tsec = w11
symbol pousOnOff = pinC.3
symbol lum = C.1 'lum =1 :allumage fluos
debut:
low lum 'sortie lum=0
readadc C.0,nmn 'lecture position minutes
nmn=59*nmn/255 'calcul nbre minutes: 59=minutes max affichables
readadc C.4,nsec 'lectuere position secondes
nsec=59*nsec/255 'calcul secondes
tsec=60*nmn+nsec 'temps total en secondes
temps=tsec
gosub conver
gosub ligne1
gosub ecrit
pause 10
'Les lignes en rouges sont maladroites et peuvent être remplacées par celles en vert dans le programme téléchargé.
if pousOnOff=1 and tsec <>0 then 'temps <>0 ->départ décompte
pause 10
stb: if pousOnOff =0 then decompt 'attente relachement bouton
goto stb
end if
if pousOnOff=1 and tsec =0 then 'temps =0 ->départ comptage
pause 10
stb2: if pousOnOff=0 then compt 'attente relachement bouton
goto stb2
end if
#rem
If poussOnOff=1 then 'Ah!, on a appuyer sur le poussoir
Do: Loop while pousOnOff=1 'Attente relachement poussoir
pause 10 'antirebond
If tsec=0 then goto compt 'temps=0, on compte
else goto decompt 'temps<>0, on décompte
endif
#endrem
decompt:
high lum 'allumage lumière
time=0
do while temps<>0
temps=tsec-time
gosub ligne2
gosub conver
gosub ecrit
loop 'boucle tant que temps <>0
low lum 'extinction lumière
sound C.2,(119,80) 'beep (119 à 16Mz, 125 à 4Mz) suivant buzzer
gosub efface
goto debut 'retour
compt:
high lum 'allumage lumière
tsec=3600
time=0
do while tsec>time 'arret au bout de 1 heure ou RAZ
temps=time
gosub ligne1
gosub conver
gosub ecrit
loop 'fin boucle
low lum 'extinction lumière
sound C.2 ,(119,80) 'beep (119 à 16Mz, 125 à 4Mz) suivant buzzer
goto debut
conver: 'Ici, on décompose en diz de mn,mn,diz de sec et sec
'puis +48 pour le code ascii
gosub raz 'Pour arrêter
nmn=temps/60 'Min décomposition du temps total en Minutes
ndmn=nmn/10+48 'diz de minutes
nmn=nmn//10+48 'minutes
nsec=temps//60 'secondes restantes
dsec=nsec/10+48 'DSec Dizaines de secondes
usec=nsec//10+48 'USec Unités de secondes
return
ligne1: 'position du curceur ligne 1 et ecriture du label
car= $80 | $00 'curseur début ligne1
gosub SendCmdByte
FOR cpt = 6 TO 12 'lecture texte ligne1 "TOTAL"
READ cpt,car
GOSUB SendDataByte
NEXT
return
ligne2: 'idem ligne 1
car= $80 | $40 'curseur début ligne2
gosub SendCmdByte
FOR cpt =13 TO 19 'lecture texte ligne2 "RESTE"
READ cpt,car
GOSUB SendDataByte
NEXT
return
ecrit: 'on écrit de gauche à droite
car=ndmn 'affichage diz de minutes
GOSUB SendDataByte
car=nmn 'affichage minutes
GOSUB SendDataByte
car=":" 'position separateur
GOSUB SendDataByte
car=dsec 'affichage diz de secondes
GOSUB SendDataByte
car=usec 'affichage secondes
GOSUB SendDataByte
return
Raz: 'Ne fonctionne qu'au relachement du poussoir
if pousOnOff=1 then
memOnOff=1 'memo appui
return
endif
if pousOnOff=0 and memOnOff=1 then 'RAZ seulement si appui
memOnOff=0
gosub efface
goto debut
end if
return
efface:
READ 5,car 'effacement écran
GOSUB SendInitCmdByte
return
'******************************* FIN PROGRAMME PERSO **************
SendInitCmdByte:
PAUSE 15 ; Delay 15mS
SendCmdByte:
rsbit = RSCMDmask ; Send to Command register
SendDataByte:
pinsB = car & $F0 / 4 | rsbit ; Put MSB out first
PULSOUT E,1 ; Give a 10uS pulse on E
pinsB = car & $0F * 4 | rsbit ; Put LSB out second
PULSOUT E,1 ; Give a 10uS pulse on E
rsbit = RSDATmask ; Send to Data register next
RETURN