a clock, calendar, temperature lcd 20x4 interfacing

Post here to let others know of a project you're working on.

Moderators: Chuckt, Garth, bitfogav

Post Reply
nodoubtman
Can't get enough of electronics!
Can't get enough of electronics!
Posts: 76
Joined: Wed Jan 25, 2012 2:54 am

a clock, calendar, temperature lcd 20x4 interfacing

Post by nodoubtman » Fri Oct 12, 2012 12:02 am

Hi there!
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

User avatar
brad
Site Admin
Site Admin
Posts: 2578
Joined: Fri Mar 26, 2010 10:30 pm

Re: a clock, calendar, temperature lcd 20x4 interfacing

Post by brad » Fri Oct 12, 2012 8:43 am

That's a tough one!

I haven't programmed in assembly language in years - and the comments are in a different language...

Have you had any success in modifying variables?

nodoubtman
Can't get enough of electronics!
Can't get enough of electronics!
Posts: 76
Joined: Wed Jan 25, 2012 2:54 am

Re: a clock, calendar, temperature lcd 20x4 interfacing

Post by nodoubtman » Fri Oct 12, 2012 9:31 am

brad wrote:That's a tough one!

I haven't programmed in assembly language in years - and the comments are in a different language...

Have you had any success in modifying variables?
i have modified this code :
------------------------------
REGLA2 CALL ANTIREB
INCF ANNEE
MOVLW h'0A'
SUBWF ANNEE,0
BTFSS Z
GOTO REGLA3
MOVLW h'00'
MOVWF ANNEE
------------------------------


to :

------------------------------
REGLA2 CALL ANTIREB
INCF ANNEE
MOVLW h'0A'
SUBWF ANNEE,1
BTFSS Z
GOTO REGLA3
MOVLW h'00'
MOVWF ANNEE
------------------------------

i will try if this is working

thanks!
marC:)

P.S. : You don't program anymore? :(

User avatar
brad
Site Admin
Site Admin
Posts: 2578
Joined: Fri Mar 26, 2010 10:30 pm

Re: a clock, calendar, temperature lcd 20x4 interfacing

Post by brad » Fri Oct 12, 2012 9:36 am

nodoubtman wrote:
brad wrote:That's a tough one!

I haven't programmed in assembly language in years - and the comments are in a different language...

Have you had any success in modifying variables?
i have modified this code :
------------------------------
REGLA2 CALL ANTIREB
INCF ANNEE
MOVLW h'0A'
SUBWF ANNEE,0
BTFSS Z
GOTO REGLA3
MOVLW h'00'
MOVWF ANNEE
------------------------------


to :

------------------------------
REGLA2 CALL ANTIREB
INCF ANNEE
MOVLW h'0A'
SUBWF ANNEE,1
BTFSS Z
GOTO REGLA3
MOVLW h'00'
MOVWF ANNEE
------------------------------

i will try if this is working

thanks!
marC:)

P.S. : You don't program anymore? :(
I program heaps! I have just moved on to Basic and C :)

Post Reply

Who is online

Users browsing this forum: No registered users and 5 guests