I have found a website a clock, calendar, temperature on lcd 20x4 screen, but when i tried to change the year, i cannot go further than year 2009, it is written in assembler, my question is how can i change to change the year up to 2012 until 2099 ? i think the code to be modified is :
------------------------------
REGLA2 CALL ANTIREB
INCF ANNEE
MOVLW h'0A'
SUBWF ANNEE,0
BTFSS Z
GOTO REGLA3
MOVLW h'00'
MOVWF ANNEE
------------------------------
Code: Select all
;******************************************
;** THERMOMETRE.asm **
;** Thermometre Int et Ext **
;** PIC 16F88 **
;** LCD en 4 bits : data sur PA0 à PA3 **
;** PA4=E PA6=RS R/W=Gnd **
;** BP de mise à lHeure sur PB0 **
;** BP "+" sur PB3 **
;** I2C : SCL sur PB4 et SDA sur PB1 **
;** 1 Wire sur PB7 **
;** EMD le 23/12/2005 **
;******************************************
CBLOCK h'20'
RAM
PTR
CAR
SECON
MINUT
HEURE
JOUR
MOIS
ANNEE
CHAM
CPTIM
FLAG
MSBT
LSBT
SIGN
HALF
MSD
LSD
HSD
DECIM1
ENDC
ORG h'00'
GOTO PROG
ORG h'0004'
RETFIE
#include "menes88C.inc"
#include "LCD88-4b.inc"
#include "SPI2C88L.inc"
#include "SP1W88.inc"
#DEFINE HALFE FLAG,0
#DEFINE SIGNE FLAG,1
#DEFINE QUAR FLAG,2
#DEFINE BPREG PORTB,0
#DEFINE BPPLUS PORTB,3
#DEFINE FLCLG FLAG,0
;**********************************************
;** TABLE des caractéres **
;**********************************************
TABLE MOVWF SAUV
MOVLW d'10'
SUBWF SAUV
MOVLW HIGH CHAINE1
MOVWF PCLATH
MOVFW SAUV
ADDLW LOW CHAINE1
BTFSC C
INCF PCLATH
MOVWF PCL
CHAINE1 DT "REGLAGE DATE & HEURE",0FF
CHAINE2 DT "TEMPERATURES",0FF
CHAINE3 DT "Interieur:",0FF
CHAINE4 DT "Exterieur:",0FF
PROG PAGE1
CLRF ANSEL ; Port A en I/O digital
MOVLW h'70'
MOVWF OSCCON ; fréquence 8 MHz.
BCF RBPU ; tirage entrée IN au + Vcc
BSF TRISB,0
BSF TRISB,3
BSF TRISB,6
PAGE0
MOVLW h'35'
MOVWF T1CON ; init TIMER
MOVLW d'2' ; compteur par 2 des IT timer1
MOVWF CPTIM
MOVLW d'255'
CALL DELAI
CALL LCD42
CALL INITEM ; init capteur de T° int en I2C
CALL INIT1W ; init capteur de T° ext en 1W
BOU BTFSC BPREG ; teste si BP "Réglage" est appuyé
GOTO SUITE ; non
CALL REGL ; oui, initialise la date dans la RAM
SUITE CALL LECRTC ; Lecture date dans DS1307
CALL AFFLCD ; affiche date et heure sur LCD
CALL LECTINT ; lecture T° int en I2C
CALL AFFTINT ; affichage T° int
CALL MINMAXI ; mise à jour MIN et MAX de T° int
CALL LECTEXT ; lecture T° ext en 1 wire
CALL AFFTEXT ; affichage T° ext
CALL MINMAXE ; mise à jour MIN et MAX de T° ext
GOTO BOU
;*************************************************
;** SP AFTAB **
;** Affiche une chaine de caractères ASCII **
;** dont l'offset par rapport au début **
;** de la table est dans W. **
;** La fin de la table est signalée par h'FF' **
;*************************************************
AFTAB MOVWF PTR
AFTAB1 MOVFW PTR
CALL TABLE
MOVWF CAR
SUBLW h'FF'
BNZ AFTAB2
RETURN
AFTAB2 MOVFW CAR
CALL ECRCAR
INCF PTR
GOTO AFTAB1
;**********************************************
;** Affiche Date sur LCD **
;** et heure du repas **
;**********************************************
AFFLCD MOVLW h'82'
CALL ECRINS ; positionne curseur
MOVFW JOUR
CALL AFLCD
MOVLW h'2F'
CALL ECRCAR ; écrit "/"
MOVFW MOIS
CALL AFLCD
MOVLW h'2F'
CALL ECRCAR ; écrit "/"
MOVLW h'32'
CALL ECRCAR ; affiche 2
MOVLW h'30'
CALL ECRCAR ; affiche 0
MOVFW ANNEE
CALL AFLCD
MOVLW h'20'
CALL ECRCAR ; écrit un espace
MOVFW HEURE
CALL AFLCD
BTFSS SECON,0
GOTO NOPOIN
MOVLW ":"
CALL ECRCAR
GOTO AFMIN
NOPOIN MOVLW h'20'
CALL ECRCAR ; écrit un espace
AFMIN MOVFW MINUT
CALL AFLCD
MOVLW h'C4' ; position sur 2eme ligne
CALL ECRINS
MOVLW CHAINE2-TABLE ; affiche texte: "TEMPERATURES:"
CALL AFTAB
MOVLW h'94' ; position sur 3eme ligne
CALL ECRINS
MOVLW CHAINE3-TABLE ; affiche texte: "INTERIEUR:"
CALL AFTAB
MOVLW h'D4'
CALL ECRINS ; position sur 4eme ligne
MOVLW CHAINE4-TABLE ; affiche texte: "EXTERIEUR:"
CALL AFTAB
RETURN
;**************************************************
;** SP ECREEP **
;** écrit W en EEPROM data adresse h'00' **
;**************************************************
ECREEP PAGE2
CLRF EEADR ; adresse = 00
MOVWF EEDATA ; W mis dans Data
PAGE3
BCF EEPGD ; zone EEPROM data
BSF WREN ; autorise écriture
MOVLW h'55'
MOVWF EECON2
MOVLW h'AA'
MOVWF EECON2
BSF WR ; lance écriture
PAFINI BTFSC WR ; teste si fin
GOTO PAFINI ; non
BCF WREN ; oui donc re interdit écriture
PAGE0
RETURN
;*****************************************************
;** SP LECEEP **
;** lecture EEPROM data en h'00'octet mis dans W **
;****************************************************
LECEEP PAGE2
CLRF EEADR ; adresse = 00
PAGE3
BCF EEPGD ; zone EEPROM data
BSF RD ; autorise lecture
PAGE2
MOVFW EEDATA ; data mis dans W
PAGE0
RETURN
;**************************************************
;** SP AFLCD **
;** Affiche octet codé BCD sur LCD **
;** octet entré dans W **
;**************************************************
AFLCD MOVWF RAM ; sauve valeur
SWAPF RAM,0 ; traitement du MSB
ANDLW h'0F' ; ne garde que les poids faibles
ADDLW h'30' ; conversion ASCII
CALL ECRCAR ; écriture du MSB sur LCD
MOVFW RAM ; traitement du LSB
ANDLW h'0F' ; ne garde que les poids faibles
ADDLW h'30' ; conversion ASCII
CALL ECRCAR ; écriture du LSB sur LCD
RETURN
;**************************************************
;** SP REGL **
;** Réglage heure,minute ... du DS 1307 **
;**************************************************
REGL CALL ANTIREB ; anti rebond
MOVLW h'01'
CALL ECRINS ; clear LCD
MOVLW h'80'
CALL ECRINS
MOVLW CHAINE1-TABLE ; affiche "REGLAGE" sur LCD
CALL AFTAB
CALL LECRTC ; lecture RTC et mise en RAM de la date
CALL BPGREL ; voir si BP réglage relaché
MOVLW d'01'
MOVWF CHAM ; CHAM=1 : JOUR
REGLJ1 CALL TIME1
CALL AFDAT ; affiche les case RAM date sur LCD
BTFSS BPPLUS ; BP + appuyé ?
GOTO REGLJ2 ; oui
GOTO REGLJ4
REGLJ2 CALL ANTIREB
INCF JOUR
MOVLW h'0A'
SUBWF JOUR,0
BTFSS Z
GOTO REGLJ5
MOVLW h'10'
MOVWF JOUR
REGLJ3 CALL ANTIREB
CALL BPPREL ; BP plus relaché ?
GOTO REGLJ4
REGLJ5 MOVLW h'1A'
SUBWF JOUR,0
BTFSS Z
GOTO REGLJ6
MOVLW h'20'
MOVWF JOUR
GOTO REGLJ3
REGLJ6 MOVLW h'2A'
SUBWF JOUR,0
BTFSS Z
GOTO REGLJ7
MOVLW h'30'
MOVWF JOUR
GOTO REGLJ3
REGLJ7 MOVLW h'32'
SUBWF JOUR,0
BTFSS Z
GOTO REGLJ3
MOVLW h'01'
MOVWF JOUR
GOTO REGLJ3
REGLJ4 BTFSC BPREG
GOTO REGLJ1
CALL ANTIREB
CALL BPGREL
MOVLW d'02'
MOVWF CHAM ; CHAM = 2 : MOIS
REGLM1 CALL TIME1
CALL AFDAT ; affiche les case RAM date sur LCD
BTFSS BPPLUS ; BP + appuyé ?
GOTO REGLM2 ; oui
GOTO REGLM4
REGLM2 CALL ANTIREB
INCF MOIS
MOVLW h'0A'
SUBWF MOIS,0
BTFSS Z
GOTO REGLM5
MOVLW h'10'
MOVWF MOIS
REGLM3 CALL ANTIREB
CALL BPPREL ; BP plus relaché ?
GOTO REGLM4
REGLM5 MOVLW h'13'
SUBWF MOIS,0
BTFSS Z
GOTO REGLM3
MOVLW h'01'
MOVWF MOIS
GOTO REGLM3
REGLM4 BTFSC BPREG
GOTO REGLM1
CALL ANTIREB
CALL BPGREL
MOVLW d'03'
MOVWF CHAM ; CHAM=3 : ANNEE
REGLA1 CALL TIME1
CALL AFDAT ; affiche les case RAM date sur LCD
BTFSS BPPLUS ; BP + appuyé ?
GOTO REGLA2 ; oui
GOTO REGLA4
REGLA2 CALL ANTIREB
INCF ANNEE
MOVLW h'0A'
SUBWF ANNEE,0
BTFSS Z
GOTO REGLA3
MOVLW h'00'
MOVWF ANNEE
REGLA3 CALL ANTIREB
CALL BPPREL ; BP plus relaché ?
GOTO REGLA4
REGLA4 BTFSC BPREG
GOTO REGLA1
CALL ANTIREB
CALL BPGREL
MOVLW d'04'
MOVWF CHAM ; CHAM=4 : HEURE
REGLH1 CALL TIME1
CALL AFDAT ; affiche les case RAM date sur LCD
BTFSS BPPLUS ; BP + appuyé ?
GOTO REGLH2 ; oui
GOTO REGLH4
REGLH2 CALL ANTIREB
INCF HEURE
MOVLW h'0A'
SUBWF HEURE,0
BTFSS Z
GOTO REGLH5
MOVLW h'10'
MOVWF HEURE
REGLH3 CALL ANTIREB
CALL BPPREL ; BP plus relaché ?
GOTO REGLH4
REGLH5 MOVLW h'1A'
SUBWF HEURE,0
BTFSS Z
GOTO REGLH6
MOVLW h'20'
MOVWF HEURE
GOTO REGLH3
REGLH6 MOVLW h'24'
SUBWF HEURE,0
BTFSS Z
GOTO REGLH3
MOVLW h'00'
MOVWF HEURE
GOTO REGLH3
REGLH4 BTFSC BPREG
GOTO REGLH1
CALL ANTIREB
CALL BPGREL
MOVLW d'05'
MOVWF CHAM ; CHAM=5 MINUTE
REGLMN1 CALL TIME1
CALL AFDAT ; affiche les case RAM date sur LCD
BTFSS BPPLUS ; BP + appuyé ?
GOTO REGLMN2 ; oui
GOTO REGLMN4
REGLMN2 CALL ANTIREB
INCF MINUT
MOVLW h'0A'
SUBWF MINUT,0
BTFSS Z
GOTO REGLMN5
MOVLW h'10'
MOVWF MINUT
REGLMN3 CALL ANTIREB
CALL BPPREL ; BP plus relaché ?
GOTO REGLMN4
REGLMN5 MOVLW h'1A'
SUBWF MINUT,0
BTFSS Z
GOTO REGLMN6
MOVLW h'20'
MOVWF MINUT
GOTO REGLMN3
REGLMN6 MOVLW h'2A'
SUBWF MINUT,0
BTFSS Z
GOTO REGLMN7
MOVLW h'30'
MOVWF MINUT
GOTO REGLMN3
REGLMN7 MOVLW h'3A'
SUBWF MINUT,0
BTFSS Z
GOTO REGLMN8
MOVLW h'40'
MOVWF MINUT
GOTO REGLMN3
REGLMN8 MOVLW h'4A'
SUBWF MINUT,0
BTFSS Z
GOTO REGLMN9
MOVLW h'50'
MOVWF MINUT
GOTO REGLMN3
REGLMN9 MOVLW h'5A'
SUBWF MINUT,0
BTFSS Z
GOTO REGLMN3
MOVLW h'00'
MOVWF MINUT
GOTO REGLMN3
REGLMN4 BTFSC BPREG
GOTO REGLMN1
CALL ANTIREB
CALL BPGREL
CALL ECRDAT ; mise à jour DS 1307 avec les valeurs réglées
MOVLW h'01'
CALL ECRINS ; Clear LCD
RETURN
;**************************************************
;** SP TIME1 **
;**************************************************
TIME1 BTFSS TMR1IF ; teste débordement timer1
GOTO TIME11 ; non donc retour sans rien faire
DECFSZ CPTIM ; oui, voir si cela fait 2 fois
GOTO TIME13 ; non donc retour avec RAZ du flag débordement
TIME10 MOVLW d'2' ; oui 2 fois, donc rechargement compteur à 2
MOVWF CPTIM
BTFSS FLCLG ; teste flag clignotement
GOTO TIME12 ; flag à "0"
BCF FLCLG ; flag à "1" donc passé à "0"
GOTO TIME13
TIME12 BSF FLCLG ; flag mis à "1"
TIME13 BCF TMR1IF ; RAZ du flag débordement
TIME11 RETURN
;**************************************************
;** SP ANTIREB **
;** Délai de 5 ms pour anti rebond des BP **
;**************************************************
ANTIREB MOVLW d'09'
CALL DELAI
RETURN
;**************************************************
;** SP BPGREL **
;** Teste et attend que BP réglage soit relaché **
;**************************************************
BPGREL BTFSS BPREG ; "0" si appuyé, "1" si relaché
GOTO BPGREL ; non pas relaché
CALL ANTIREB ; oui relaché
RETURN
;**************************************************
;** SP BPPREL **
;** Teste et attend que BP "plus" soit relaché **
;**************************************************
BPPREL BTFSS BPPLUS ; "0" si appuyé, "1" si relaché
GOTO BPPREL ; non pas relaché
CALL ANTIREB ; oui relaché
RETURN
;**************************************************
;** SP ECRDAT **
;** Mise à jour du DS 1307 aprés réglage **
;**************************************************
ECRDAT CALL ENSTA
MOVLW h'D0'
CALL ENBYT
MOVLW h'00'
CALL ENBYT
BCF SECON,7 ; CH à "0" : autorisation horloge
MOVFW SECON
CALL ENBYT
MOVFW MINUT
CALL ENBYT
MOVFW HEURE
CALL ENBYT
NOP
CALL ENBYT
MOVFW JOUR
CALL ENBYT
MOVFW MOIS
CALL ENBYT
MOVFW ANNEE
CALL ENBYT
CALL ENSTO
RETURN
;**************************************************
;** SP AFDAT **
;** Affichage date RAM (minut,heure..) sur LCD **
;**************************************************
AFDAT MOVLW h'C0'
CALL ECRINS ; positionne curseur
MOVLW d'01'
SUBWF CHAM,0 ; teste si cham = 1 ( jour)
BTFSS Z
GOTO AFDAT1 ; non ce n'est pas le champ JOUR
BTFSC FLCLG ; oui c'est le champ qui doit clignoter
GOTO AFDAT1 ; flag = 1 donc champ affiché
MOVLW h'20' ; flag = 0 donc champ éteint
CALL ECRCAR
MOVLW h'20'
CALL ECRCAR
GOTO AFDAT2
AFDAT1 MOVFW JOUR
CALL AFLCD
AFDAT2 MOVLW h'20'
CALL ECRCAR ; écrit un espace
MOVLW d'02'
SUBWF CHAM,0 ; teste si cham = 2 ( mois)
BTFSS Z
GOTO AFDAT3 ; non ce n'est pas le champ MOIS
BTFSC FLCLG ; oui c'est le champ qui doit clignoter
GOTO AFDAT3 ; flag = 1 donc champ affiché
MOVLW h'20' ; flag = 0 donc champ éteint
CALL ECRCAR
MOVLW h'20'
CALL ECRCAR
GOTO AFDAT4
AFDAT3 MOVFW MOIS
CALL AFLCD
AFDAT4 MOVLW h'20'
CALL ECRCAR ; écrit un espace
MOVLW h'32'
CALL ECRCAR ; affiche 2
MOVLW h'30'
CALL ECRCAR ; affiche 0
MOVLW d'03'
SUBWF CHAM,0 ; teste si cham = 3 ( année)
BTFSS Z
GOTO AFDAT5 ; non ce n'est pas le champ année
BTFSC FLCLG ; oui c'est le champ qui doit clignoter
GOTO AFDAT5 ; flag = 1 donc champ affiché
MOVLW h'20' ; flag = 0 donc champ éteint
CALL ECRCAR
MOVLW h'20'
CALL ECRCAR
GOTO AFDAT6
AFDAT5 MOVFW ANNEE
CALL AFLCD
AFDAT6 MOVLW h'20'
CALL ECRCAR ; écrit un espace
MOVLW d'04'
SUBWF CHAM,0 ; teste si cham = 4 ( heure)
BTFSS Z
GOTO AFDAT7 ; non ce n'est pas le champ HEURE
BTFSC FLCLG ; oui c'est le champ qui doit clignoter
GOTO AFDAT7 ; flag = 1 donc champ affiché
MOVLW h'20' ; flag = 0 donc champ éteint
CALL ECRCAR
MOVLW h'20'
CALL ECRCAR
GOTO AFDAT8
AFDAT7 MOVFW HEURE
CALL AFLCD
AFDAT8 MOVLW h'20'
CALL ECRCAR ; écrit un espace
MOVLW d'05'
SUBWF CHAM,0 ; teste si cham = 5 ( minute)
BTFSS Z
GOTO AFDAT9 ; non ce n'est pas le champ minute
BTFSC FLCLG ; oui c'est le champ qui doit clignoter
GOTO AFDAT9 ; flag = 1 donc champ affiché
MOVLW h'20' ; flag = 0 donc champ éteint
CALL ECRCAR
MOVLW h'20'
CALL ECRCAR
GOTO AFDAT10
AFDAT9 MOVFW MINUT
CALL AFLCD
AFDAT10 RETURN
;**************************************************
;** SP LECRTC **
;** Lecture du circuit I2C Horloge DS1307 **
;** Mise à jour des case RAM :Heure, Minut.... **
;**************************************************
LECRTC CALL ENSTA
MOVLW h'D0' ; mot de controle du DS1307 en écriture
CALL ENBYT
MOVLW h'00'
CALL ENBYT ; 1ere adresse registre = secondes
CALL ENRSTA
MOVLW h'D1' ; mot de controle du DS1307 en lecture
CALL ENBYT
CALL REBYT ; réception de la valeur des secondes
MOVWF SECON ; mise à jour case RAM des secondes
CALL ENACK ; ACK pour que RTC continue à envoyer
CALL REBYT
MOVWF MINUT ; mise à jour case Minute
CALL ENACK
CALL REBYT
MOVWF HEURE ; mise à jour case Heure
CALL ENACK
CALL REBYT ; réception du jour de la semaine (inutilisé)
CALL ENACK
CALL REBYT ; réception date
MOVWF JOUR ; mise à jour case date
CALL ENACK
CALL REBYT
MOVWF MOIS ; mise à jour case Mois
CALL ENACK
CALL REBYT
MOVWF ANNEE ; mise à jour case Année
CALL ENNAC ; noack pour finir
CALL ENSTO ; stop
RETURN
;*************************************************
;** Sous programme Init en I2C du DS1621 **
;*************************************************
INITEM CALL ENSTA ;start
MOVLW h'90' ;adresse du DS1621 en écriture
CALL ENBYT
MOVLW h'AC' ;accés au registre de config
CALL ENBYT
MOVLW h'00' ;config: conversion en continu
CALL ENBYT
CALL ENSTO ;Stop
CALL ENSTA ;start
MOVLW h'90' ;adresse du DS1621 en écriture
CALL ENBYT
MOVLW h'EE' ;commande:début de conversion
CALL ENBYT
CALL ENSTO ;stop
;***********************************************************
;** Sous programme Lecure température en I2C du DS 1621 **
;** Affiche la température sur le LCD **
;***********************************************************
LECTINT CALL ENSTA ;start
MOVLW h'90' ;adresse du DS1621 en écriture
CALL ENBYT
MOVLW h'AA' ;commande: lecture Température
CALL ENBYT
CALL ENRSTA ;restart
MOVLW h'91' ;adresse du DS1621 en lecture
CALL ENBYT
CALL REBYT
MOVWF MSBT ;1er octet reçu dans MSBT
CALL ENACK ;envoi ACK
CALL REBYT
MOVWF LSBT ;2eme octet reçu dans LSBT
CALL ENNAC ;envoi NOACK
CALL ENSTO ;stop
RETURN
;***************************************************
;** Sous programme Affichage température **
;***************************************************
AFFTINT BTFSC MSBT,7 ;test si négatif
GOTO NIF ;bit7=1 donc nombre négatif
MOVLW h'2B' ;caractére ASCII "+"
GOTO DAN1
NIF COMF MSBT ;complémente MSBT
INCF MSBT ;MSBT+1
MOVLW h'2D' ;caractére ASCII "-"
DAN1 MOVWF SIGN
BTFSC LSBT,7 ;test 1/2 degré
GOTO DEMI ;LSBT=80 donc 1/2 degré
MOVLW h'30' ;caractére ASCII de "0"
GOTO DAN2
DEMI MOVLW h'35' ;caractère ASCII de "5"
DAN2 MOVWF HALF
MOVLW h'9E'
CALL ECRINS ;envoi position du caratére du signe
MOVFW SIGN
CALL ECRCAR ;affiche le signe
MOVFW MSBT ;chargement du MSB lu dans DS1621
CALL BINBCD ;conversion BCD en 3 digit ASCII
MOVLW h'30' ;test HSD=0 ?
SUBWF HSD,0 ;en ASCII zero = h'30'
BTFSS Z ;test du bit Z
GOTO AFF1 ;Z=0 HSD non nul on affiche 3 digits
MOVLW h'30' ;test MSD=0 ?
SUBWF MSD,0 ;;en ASCII zero = h'30'
BTFSS Z ;test du bit Z
GOTO AFF2 ;Z=0 MSD non nul on affiche 2 digits
GOTO AFF3 ;Z=1 MSD=0 on n'affiche qu'un digit
AFF1 MOVFW HSD
CALL ECRCAR
AFF2 MOVFW MSD ;affichage digit centaine
CALL ECRCAR
AFF3 MOVFW LSD ;affichage digit unité
CALL ECRCAR
MOVLW ',' ; affichage du caractére ASCII " , "
CALL ECRCAR
MOVFW HALF ;affichage du demi digit: 0 ou 5
CALL ECRCAR
MOVLW h'DF' ;affichage caractère ASCII " ° "
CALl ECRCAR
MOVLW 'C' ;affichage caractére " C "
CALL ECRCAR
MOVLW ' ' ;affichage d'un espace pour
CALL ECRCAR ;effacer éventuel caractère
RETURN
;**************************************************
;** SP conversion mot binaire dans W **
;** en 3 digits codés ASCII pour affichage **
;**************************************************
BINBCD CLRF HSD
CLRF MSD
MOVWF LSD ; LSD=W
BIN1 MOVLW d'100' ; test nombre de centaines ?
SUBWF LSD,0 ; LSD-100 ---> W
BTFSS C ; Borrow=1? soit LSD>100 ?
GOTO BIN2 ; non: donc LSD<100
MOVWF LSD ; oui donc: W ---> LSD
INCF HSD ; HSD+1 ---> HSD : incrémente centaines.
GOTO BIN1 ; on recommence
BIN2 MOVLW d'10' ; test nombre de dizaines ?
SUBWF LSD,0 ; LSD-10 ---> W
BTFSS C ; Borrow=1? soit LSD>10 ?
GOTO BIN3 ; non donc c'est fini.
MOVWF LSD ; oui donc: W ---> LSD
INCF MSD ; MSD+1 ---> MSD : incrémente dizaines.
GOTO BIN2 ; on recommence.
BIN3 MOVLW h'30'
ADDWF HSD ; conversion des centaines en ASCII
ADDWF MSD ; conversion des dizaines en ASCII
ADDWF LSD ; conversion des unités en ASCII
RETURN ; non donc c'est fini.
;***************************************
;** INIT1W **
;** Init le bus 1 Wire **
;***************************************
INIT1W CALL DETECT ; Reset + cherche présence esclave
MOVLW h'CC'
CALL ENVBYT ; commande appel général car 1 seul circuit
MOVLW h'4E'
CALL ENVBYT ; commande écriture config
MOVLW h'00'
CALL ENVBYT ; 1er octet de config = TH
MOVLW h'00'
CALL ENVBYT ; 2eme octet de config = TL
MOVLW h'00'
CALL ENVBYT ; 3eme octet de config = résolution 9 bits
RETURN
;****************************************
;** LECTEXT **
;** lecture température bus 1 wire **
;****************************************
LECTEXT CALL DETECT ; Reset + cherche présence esclave
MOVLW h'CC'
CALL ENVBYT ; commande appel général car 1 seul circuit
MOVLW h'44'
CALL ENVBYT ; commande début de conversion
MOVLW d'100' ; attente de 100 ms
CALL DELAI ; pour fin de conversion
CALl DETECT ; Reset + cherche présence esclave
MOVLW h'CC'
CALL ENVBYT ; commande appel général car 1 seul circuit
MOVLW h'BE'
CALL ENVBYT ; commande lecture des 9 octets du DS18B20
CALL RECBYT ; réception du LSB de la température
MOVWF LSBT
CALL RECBYT
MOVWF MSBT ; réception du MSB de la température
BCF SIGNE ; FLAG SIGN=0
BTFSS MSBT,7 ; test signe
GOTO POSIT ; signe positif car bit 7 = 0
BSF SIGNE ; signe négatif car bit 7 = 1 donc FLAG SIGN=1
COMF LSBT ; Complémente LSB
COMF MSBT ; complémente MSB
MOVLW h'01'
ADDWF LSBT ; on fait LSB + 1
BTFSS C ; dépassement ?
GOTO POSIT ; C=0 donc pas de dépassement
MOVLW h'01'
ADDWF MSBT ; C=1 dépassement donc on fait MSB + 1
POSIT RLF MSBT
RLF MSBT
RLF MSBT
RLF MSBT,0 ; résultat dans W
ANDLW h'F0'
MOVWF MSBT
RRF LSBT
RRF LSBT
RRF LSBT
BSF QUAR
BTFSS C
BCF QUAR
RRF LSBT
BSF HALFE
BTFSS C ; teste si C=1, si oui flag HALF=1
BCF HALFE ; si C=0 le flag HALF est mis à "0"
MOVFW LSBT
ANDLW h'0F'
XORWF MSBT,0
MOVWF MSBT
RETURN
;********************************************
;** SP affichage température 1 Wire **
;********************************************
AFFTEXT MOVLW h'DE'
CALL ECRINS ; positionne écriture sur 3eme ligne
MOVLW h'2D' ;caractére ASCII "-"
BTFSC SIGNE ;test si positif
GOTO CARAC1 ;SIGN=1 donc nombre négatif
MOVLW h'2B' ;caractére ASCII "+"
CARAC1 CALL ECRCAR ;affiche le signe
BTFSS HALFE ; teste si décimale est 0 ou 5
GOTO HALF0 ; c'est "0"
MOVLW h'35' ; c'est "5"
MOVWF DECIM1
GOTO CARAC2
HALF0 MOVLW h'30' ; c'est "0"
MOVWF DECIM1
CARAC2 MOVFW MSBT ;chargement de la valeur absolue de la température
CALL BINBCD ;conversion BCD en 3 digit ASCII
MOVLW h'30' ;test HSD=0 ?
SUBWF HSD,0 ;en ASCII zero = h'30'
BTFSS Z ;test du bit Z
GOTO AF1 ;Z=0 HSD non nul on affiche 3 digits
MOVLW h'30' ;test MSD=0 ?
SUBWF MSD,0 ;en ASCII zero = h'30'
BTFSS Z ;test du bit Z
GOTO AF2 ;Z=0 MSD non nul on affiche 2 digits
GOTO AF3 ;Z=1 MSD=0 on n'affiche qu'un digit
AF1 MOVFW HSD
CALL ECRCAR
AF2 MOVFW MSD ;affichage digit centaine
CALL ECRCAR
AF3 MOVFW LSD ;affichage digit unité
CALL ECRCAR
MOVLW ',' ; affichage du caractére ASCII " , "
CALL ECRCAR
MOVFW DECIM1 ;affichage 1ere décimale
CALL ECRCAR
MOVLW h'DF' ;affichage caractère ASCII " ° "
CALl ECRCAR
MOVLW 'C' ;affichage caractére " C "
CALL ECRCAR
MOVLW ' ' ;affichage d'un espace pour
CALL ECRCAR ;effacer éventuel caractère
RETURN
;***************************************
;** SP MINMAXI **
;** mise à jour Min et Max de T° int **
;***************************************
MINMAXI
RETURN
;***************************************
;** SP MINMAXE **
;** mise à jour Min et Max de T° ext **
;***************************************
MINMAXE
RETURN
END