📄 aqua ok.asm
字号:
include <p16f877.inc>
#define E PORTB,0
#define RW PORTB,1
#define RS PORTB,2
#define CLK PORTE,0
#define IO PORTE,1
#define RST PORTE,2
;Sorties I2C :
;composant 0 : BLANCHE,BLEUE,1,2,3,4,TERMO,LIBRE
;composant 1 : REAC,NIV,OSMO
;Entrees I2C
BAC_BAS equ 03h
BAC_HAUT equ 04h
RES_BAS equ 05h
RES_HAUT equ 06h
;RAM
CBLOCK 20h
TEMP1
TEMP2
TEMP3
TEMP4
TEMP5
DONNEE
MENUPOS
PB
ADRESSE
MAX
FLAGS
EXDONNEE
HEURES
MINUTES
SECONDES
SORTIES
SORTIES1
FINRETRO
REMPREAC
M_REAC
H_REAC
M_REMP
EXSECONDES
CMDMANU
CPT
CPT2
CPT_MIN
CMDMANU1
EXDONNEE2
CPT_TIMER
TEMPERATURE_ENTIER
TEMPERATURE_DECIMALE
FIN_X
ENDC
CBLOCK 70H ; 70H - 7FH : accessible depuis toutes les banks
W_TEMP
STATUS_TEMP
ENDC
;EEPROM
L_BLANCHE equ 00h ;heures debut - minutes debut -
L_BLEUE equ 04h ;heures fin - minutes fin
REACTEUR equ 08h ;toutes les X heures - pendant X min
REMPLISSAGE equ 0Ah ;toutes les X minutes - pendant X sec
POMPE1 equ 0Ch ;
POMPE2 equ 0Fh ;24 bits par pompe pour avoir les
POMPE3 equ 12h ;24 heures
POMPE4 equ 15h ;
REACTEUR2 equ 18h ;toutes les X minutes - pendant X min
H_REMPLISS equ 20h ;comme L_BLANCHE
TEMP_VISEE equ 24h ;seuil bas - seuil haut (4 octets)
TEMPS_REBOND equ 18h ;X fois 6 ms
HYSTERESIS equ d'1'
ORG 0003h
goto MAIN
;****************************************************************************
; interruption
;****************************************************************************
ORG 0004h
goto INT
;****************************************************************************
; TEMPO == attente : 1 dans W = 0,25 ms
;****************************************************************************
TEMPO
movwf TEMP1
tempo2
movlw 0ACh
movwf TEMP2
tempo1
clrwdt
decfsz TEMP2
goto tempo1
decfsz TEMP1
goto tempo2
retlw 0
;****************************************************************************
; Pilotage LCD
; LCDCMD envoie la commande W au LCD
; LCDCHAR envoie le caractere W au LCD
;****************************************************************************
LCDCMD
bcf INTCON,GIE
movwf TEMP1
call LCDBUSY
bcf RS
goto lcdwr
LCDCHAR
bcf INTCON,GIE
movwf TEMP1
call LCDBUSY
bsf RS
lcdwr
clrwdt
bcf RW
bsf E
movf TEMP1,W
movwf PORTD
bcf E
bsf INTCON,GIE
retlw 0
;****************************************************************************
; LCDSTR == envoie la chaine W au LCD
;****************************************************************************
LCDSTR
movwf TEMP3
movlw HIGH(MSG)
movwf PCLATH
movf TEMP3,W
call MSG
clrf PCLATH
andlw 0FFH
btfsc STATUS,Z
retlw 0
call LCDCHAR
incf TEMP3,W
goto LCDSTR
;****************************************************************************
; LCDSTR2 == envoie la chaine W au LCD
;****************************************************************************
LCDSTR2
movwf TEMP3
movlw HIGH(MSG2)
movwf PCLATH
movf TEMP3,W
call MSG2
clrf PCLATH
andlw 0FFH
btfsc STATUS,Z
retlw 0
call LCDCHAR
incf TEMP3,W
goto LCDSTR2
;****************************************************************************
; LCDBUSY == attend que le LCD soit libre
;****************************************************************************
LCDBUSY
bcf INTCON,GIE
bsf STATUS,RP0
movlw 0xFF
movwf TRISD
bcf STATUS,RP0
bcf RS
bsf RW
bsf E
movf PORTD,W
bcf E
andlw 0x80
btfss STATUS,Z
goto LCDBUSY
bcf RW
bsf STATUS,RP0
clrf TRISD
bcf STATUS,RP0
bsf INTCON,GIE
return
;****************************************************************************
; LCDDEC == ecrit W en decimal
;****************************************************************************
LCDDEC
clrf TEMP2
movwf TEMP3
lcddec10
movlw 0Ah
subwf TEMP3,W
btfss STATUS,C
goto decend
movwf TEMP3
incf TEMP2
goto lcddec10
decend
movf TEMP2,W
addlw 30h
call LCDCHAR
movf TEMP3,W
addlw 30h
goto LCDCHAR
;****************************************************************************
; LCDHEX == ecrit W en Hexadecimal
;****************************************************************************
LCDHEX
movwf TEMP3
swapf TEMP3,W
call WRITEDIG
movf TEMP3,W
WRITEDIG
andlw 0Fh
addlw 0F6h
btfsc STATUS,C
addlw 07h
addlw 3Ah
goto LCDCHAR
;****************************************************************************
; LCDSETADR == chargement de l'adresse
;****************************************************************************
LCDSETADR
iorlw 80h
call LCDCMD
retlw 0
;****************************************************************************
; LCDINIT
;****************************************************************************
LCDINIT
bcf RW
bcf E
bcf RS
movlw 80h
call TEMPO
movlw 38h ;interface 8 bits, 2 lignes
call LCDCMD
movlw 08h ;disp.off, curs.off, no-blink
call LCDCMD
movlw 01h ;clear display
call LCDCMD
movlw 0Ch ;disp.on, curs.off
call LCDCMD
movlw 06h ;auto-inc (shift-cursor)
call LCDCMD
return
;****************************************************************************
; DS1302 == lecture/ecriture ?l'adresse W du DS1302
; donnee dans DONNEE
;****************************************************************************
DS1302
bsf RST
movwf TEMP1
movwf TEMP2
movlw 08h
movwf TEMP4
movf TEMP1,W
bcf STATUS,C
adresse
bcf IO
btfsc TEMP1,0
bsf IO
bsf CLK
clrwdt
clrwdt
bcf CLK
rrf TEMP1
decfsz TEMP4
goto adresse
btfss TEMP2,0 ;test du bit R/W
goto ecriture
bsf STATUS,RP0
movlw 02h ;IO = entree
movwf TRISE
bcf STATUS,RP0
movlw 08h
movwf TEMP4
bcf STATUS,C
clrf DONNEE
lecture
rrf DONNEE
bsf CLK
clrwdt
btfsc IO
bsf DONNEE,7
bcf CLK
decfsz TEMP4
goto lecture
bsf STATUS,RP0
clrf TRISE
bcf STATUS,RP0
bcf RST
return
ecriture
movlw 08h
movwf TEMP4
ecrit
bcf IO
btfsc DONNEE,0
bsf IO
bsf CLK
clrwdt
clrwdt
bcf CLK
rrf DONNEE
decfsz TEMP4
goto ecrit
bcf RST
return
;****************************************************************************
; LISEEPROM == adresse W, donnee dans DONNEE
;****************************************************************************
LISEEPROM
bsf STATUS,RP1
bcf STATUS,RP0
movwf EEADR
bsf STATUS,RP0
bcf EECON1,EEPGD
bsf EECON1,RD
bcf STATUS,RP0
movf EEDATA,W
bcf STATUS,RP1
movwf DONNEE
return
;****************************************************************************
; ECRISEEPROM == adresse W, donnee dans DONNEE
;****************************************************************************
ECRISEEPROM
bcf INTCON,GIE
bcf PIR2,EEIF
bsf STATUS,RP1
movwf EEADR
bcf STATUS,RP1
movf DONNEE,W
bsf STATUS,RP1
movwf EEDATA
bsf STATUS,RP0
bcf EECON1,EEPGD
bsf EECON1,WREN
movlw 55h
movwf EECON2
movlw 0AAh
movwf EECON2
bsf EECON1,WR
bcf STATUS,RP0
bcf STATUS,RP1
boucle_eeprom
clrwdt
btfss PIR2,EEIF
goto boucle_eeprom
bsf STATUS,RP1
bsf STATUS,RP0
bcf EECON1,WREN
bcf STATUS,RP0
bcf STATUS,RP1
bsf INTCON,GIE
return
;****************************************************************************
; PCF8574 == adresse W, donnee dans DONNEE
;****************************************************************************
PCF8574
movwf TEMP1
bsf STATUS,RP0 ;bank 1
bsf SSPCON2,SEN ;start
bcf STATUS,RP0 ;bank 0
start
btfss PIR1,SSPIF
goto start
movwf SSPBUF
bcf PIR1,SSPIF
adr
btfss PIR1,SSPIF
goto adr
btfsc TEMP1,0
goto lect_I2C
movf DONNEE,W
movwf SSPBUF ;ecriture I2C
bcf PIR1,SSPIF
goto stop
lect_I2C
bsf STATUS,RP0
bsf SSPCON2,RCEN ;reception
bcf STATUS,RP0
bcf PIR1,SSPIF
ack
btfss PIR1,SSPIF
goto ack
movf SSPBUF,W ;lecture
movwf DONNEE
bsf STATUS,RP0
bsf SSPCON2,ACKDT
bsf SSPCON2,ACKEN ;ack
bcf STATUS,RP0
bcf PIR1,SSPIF
stop
btfss PIR1,SSPIF
goto stop
bsf STATUS,RP0 ;bank 1
bsf SSPCON2,PEN ;stop
bcf STATUS,RP0 ;bank 0
bcf PIR1,SSPIF
fin_I2C
btfss PIR1,SSPIF
goto fin_I2C
bcf PIR1,SSPIF
return
;****************************************************************************
; RELACHE == attend que la touche pressee soit relachee
;****************************************************************************
RELACHE
clrwdt
movlw 0FFh
andwf PB,W
btfss STATUS,Z
goto RELACHE
return
;****************************************************************************
; MENU == premiere position dans W, retour dans DONNEE
;****************************************************************************
MENU
movwf MENUPOS
movwf TEMP2
ecrit_menu
call RELACHE
movlw 01h ;clear display
call LCDCMD ;
movlw 7Eh
call LCDCHAR
movlw HIGH(MENUTABLE)
movwf PCLATH
movf MENUPOS,W
movwf DONNEE
call MENUTABLE
clrf PCLATH
call LCDSTR
movlw 41h
call LCDSETADR
incf MENUPOS
movlw HIGH(MENUTABLE)
movwf PCLATH
movf MENUPOS,W
call MENUTABLE
clrf PCLATH
andlw 0FFh
btfss STATUS,Z ;test si fin de menu
goto fin_menu
movf TEMP2,W
movwf MENUPOS
movlw HIGH(MENUTABLE)
movwf PCLATH
movf MENUPOS,W
call MENUTABLE
clrf PCLATH
fin_menu
call LCDSTR
attente_menu
clrwdt
btfsc PB,1 ;suivant
goto ecrit_menu
btfss PB,2 ;enter
goto attente_menu
call RELACHE
return
;****************************************************************************
; REGLHEURE == reglage de l'heure
;****************************************************************************
REGLHEURE
clrw ;WP
movwf DONNEE
movlw b'10001110'
call DS1302
;************** jour ******************
movlw 32h
movwf MAX
movlw b'10000110'
movwf ADRESSE
movlw 42h
call BOUCLEREGL
;************** mois ******************
movlw 13h
movwf MAX
movlw b'10001000'
movwf ADRESSE
movlw 47h
call BOUCLEREGL
;************** annee *****************
movlw 99h
movwf MAX
movlw b'10001100'
movwf ADRESSE
movlw 4Ch
call BOUCLEREGL
;************** heures ****************
movlw 24h
movwf MAX
movlw b'10000100'
movwf ADRESSE
movlw 52h
call BOUCLEREGL
;************** minutes ***************
movlw 60h
movwf MAX
movlw b'10000010'
movwf ADRESSE
movlw 58h
call BOUCLEREGL
clrf DONNEE
movlw b'10000000' ;secondes ?0 + clock enable
call DS1302
return
;****************************************************************************
; BOUCLEREGL == boucle de reglage de l'heure
; adresse DS1302 dans ADRESSE, valeur max dans MAX
; texte dans W (table MSG2)
;****************************************************************************
BOUCLEREGL
movwf TEMP3
movlw 40h
call LCDSETADR
movf TEMP3,W
call LCDSTR2
movf ADRESSE,W
iorlw 01h
call DS1302
movlw 48h
call LCDSETADR
movlw ":"
call LCDCHAR
movlw " "
call LCDCHAR
movf DONNEE,W
call LCDHEX
boucle_regl
clrwdt
btfsc PB,2
goto fin_regl
btfss PB,1
goto boucle_regl
movlw 4Ah
call LCDSETADR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -