📄 复件 aqua.asm
字号:
movlw 58h
call LCDSTR
movlw 40h
call LCDSETADR
movlw 81h ;debut
call LCDSTR2
movlw L_BLEUE
call REGLE
movlw 01h ;clear display
call LCDCMD ;
movlw 58h
call LCDSTR
movlw 40h
call LCDSETADR
movlw 87h ;fin
call LCDSTR2
movlw L_BLEUE + 2
call REGLE
return
reacteur
movlw REACTEUR
call REGLE2
return
reacteur2
movlw REACTEUR2
call REGLE2
return
remplissage
movlw REMPLISSAGE
call REGLE2
return
brassage
movlw 12h
call MENU
movlw 12h ;Pompe1
subwf DONNEE,W
btfss STATUS,Z
goto t_pompe2
movlw POMPE1
goto reglage_pompe
t_pompe2
movlw 13h ;Pompe2
subwf DONNEE,W
btfss STATUS,Z
goto t_pompe3
movlw POMPE2
goto reglage_pompe
t_pompe3
movlw 14h ;Pompe3
subwf DONNEE,W
btfss STATUS,Z
goto t_pompe4
movlw POMPE3
goto reglage_pompe
t_pompe4
movlw 15h ;Pompe4
subwf DONNEE,W
btfss STATUS,Z
return
movlw POMPE4
reglage_pompe
call REGLE_POMPE
goto brassage
heure_rempliss
movlw 01h ;clear display
call LCDCMD ;
movlw 0E6h
call LCDSTR
movlw 40h
call LCDSETADR
movlw 81h ;debut
call LCDSTR2
movlw H_REMPLISS
call REGLE
movlw 01h ;clear display
call LCDCMD ;
movlw 48h
call LCDSTR
movlw 40h
call LCDSETADR
movlw 87h ;fin
call LCDSTR2
movlw H_REMPLISS + 2
call REGLE
return
regle_temperature
movlw 01h ;clear display
call LCDCMD ;
movlw 0B1h
call LCDSTR
movlw " "
call LCDCHAR
movlw ":"
call LCDCHAR
movlw TEMP_VISEE + 2
call LIS_EEPROM2
movlw 4Ch
call LCDSETADR
movlw 0DFh ;"?
call LCDCHAR
movlw "C"
call LCDCHAR
att_regle_temp
clrwdt
movlw 4Ah
call LCDSETADR
movf DONNEE,W
call LCDDEC
btfsc PB,2
goto fin_regle_temp
btfss PB,1
goto att_regle_temp
call RELACHE
incf DONNEE
movlw d'30'
subwf DONNEE,W
btfss STATUS,Z
goto att_regle_temp
movlw d'15'
movwf DONNEE
goto att_regle_temp
fin_regle_temp
movlw TEMP_VISEE + 2
call ECRISEEPROM
decf DONNEE
movlw TEMP_VISEE
call ECRISEEPROM
movlw HYSTERESIS
movwf DONNEE
movlw TEMP_VISEE + 3
call ECRISEEPROM
movlw HYSTERESIS
sublw d'10'
movwf DONNEE
movlw TEMP_VISEE + 1
call ECRISEEPROM
return
reset
movlw 01h ;clear display
call LCDCMD ;
movlw 69h
call LCDSTR2
movlw 4Dh
call OUINON
btfss DONNEE,0
return
movlw 01h ;clear display
call LCDCMD ;
reset_fin
goto reset_fin
;============== 调整EEPROM地址 ==============
REGLE
movwf TEMP4
movlw 4Bh
call LCDSETADR
movf TEMP4,W
call LISEEPROM
movf DONNEE,W
call LCDHEX
movlw ":"
call LCDCHAR
incf TEMP4,W
call LISEEPROM
movf DONNEE,W
call LCDHEX
movf TEMP4,W
call LISEEPROM
attente_regle
clrwdt
btfsc PB,1
goto incremente_heure
btfsc PB,2
goto fin_heure
goto attente_regle
incremente_heure
call RELACHE
movlw 24h
call INCREMENTE
movlw 4Bh
call LCDSETADR
movf DONNEE,W
call LCDHEX
goto attente_regle
fin_heure
call RELACHE
movf TEMP4,W
call ECRISEEPROM
incf TEMP4,W
call LISEEPROM
attente_regle2
clrwdt
btfsc PB,1
goto incremente_min
btfsc PB,2
goto fin_regle
goto attente_regle2
incremente_min
call RELACHE
movlw 60h
call INCREMENTE
movlw 4Eh
call LCDSETADR
movf DONNEE,W
call LCDHEX
goto attente_regle2
fin_regle
call RELACHE
incf TEMP4,W
call ECRISEEPROM
return
;============== 中断 ==============
INT
movwf W_TEMP
swapf STATUS,W
clrf STATUS
movwf STATUS_TEMP
btfsc INTCON,T0IF
goto Timer0
goto fin_int
Timer0
bcf STATUS,RP0
bcf STATUS,RP1
movf PB,F
btfsc STATUS,Z ;Aucun bouton appuy?
goto test_boutons
decfsz CPT_TIMER
goto fin_timer0
test_boutons ;non : on teste
swapf PORTB,W
andlw 07h
xorlw 07h
movwf PB
btfsc STATUS,Z ;un changement ?
goto fin_timer0
movlw TEMPS_REBOND
movwf CPT_TIMER
fin_timer0
bcf INTCON,T0IF
fin_int
swapf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP
swapf W_TEMP,W
;****************** restauration de W, STATUS *******************************
bsf INTCON,GIE
retfie
;===================== LIS_I2C =====================
LIS_I2C
movlw H_REMPLISS
call TEST_HEURE
movwf TEMP4
movlw b'01000011'
call PCF8574
movf TEMP4,F
btfsc STATUS,Z
goto pas_remplissage
btfss DONNEE,BAC_HAUT
goto arret_remplissage
btfsc FLAGS,2
goto test_osmo
clrf M_REAC
clrf H_REAC
clrf M_REMP
bsf REMPREAC,0
bcf REMPREAC,2
bsf FLAGS,2
bsf SORTIES1,1
call ECRIS_I2C1
goto test_osmo
arret_remplissage
bcf FLAGS,2
bcf SORTIES1,1
test_osmo
btfsc DONNEE,RES_BAS
bsf SORTIES1,2
btfss DONNEE,RES_HAUT
bcf SORTIES1,2
call ECRIS_I2C1
return
pas_remplissage
bcf FLAGS,2
goto test_osmo
;=====================================
LIS_HEURE
movlw b'10000101'
call DS1302
movf DONNEE,W
movwf HEURES
movlw b'10000011' ;minutes
call DS1302
movf DONNEE,W
movwf MINUTES
return
;=====================================
AFF_HEURE
movlw 06h
movwf TEMP5
movlw 0Bh
call LCDSETADR
essai_heure
decf TEMP5
btfsc STATUS,Z
return
movlw b'10000101'
call DS1302
movf HEURES,W
subwf DONNEE,W
btfss STATUS,C
goto heure_erreur
affichage_heure
movf DONNEE,W
movwf HEURES
call LCDHEX
movlw ":"
call LCDCHAR
essai_minute
decf TEMP5
btfsc STATUS,Z
return
movlw b'10000011' ;minutes
call DS1302
movf MINUTES,W
subwf DONNEE,W
btfss STATUS,C
goto minute_erreur
affichage_minute
movf DONNEE,W
movwf MINUTES
call LCDHEX
return
heure_erreur
movf HEURES,W
btfsc STATUS,Z
goto affichage_heure
goto essai_heure
minute_erreur
movf MINUTES,W
btfsc STATUS,Z
goto affichage_minute
goto essai_minute
;=====================================
ECRIS_I2C0
movlw d'05'
movwf CPT
ecris_I2C0
comf SORTIES, W
movwf DONNEE
movlw b'01000000'
call PCF8574
movlw b'01000001'
call PCF8574
comf SORTIES, W
subwf DONNEE, W
btfsc STATUS, Z
goto ecriture_OK
decfsz CPT
goto ecris_I2C0
bcf FLAGS,7
retlw 0FFh
ecriture_OK
bcf FLAGS,7
retlw 0
;=====================================
TEST_HEURE
movwf TEMP1
call LIS_EEPROM2
movf HEURES,W
bcf STATUS,Z
bcf STATUS,C
subwf DONNEE,W
btfsc STATUS,Z
goto test_minutes
btfsc STATUS,C
retlw 0
test_heures
incf TEMP1
incf TEMP1
movf TEMP1,W
call LIS_EEPROM2
movf HEURES,W
bcf STATUS,Z
bcf STATUS,C
subwf DONNEE,W
btfsc STATUS,Z
goto test_minutes2
btfss STATUS,C
retlw 0
retlw 0FFh
test_minutes
incf TEMP1,W
call LIS_EEPROM2
movf MINUTES,W
bcf STATUS,Z
bcf STATUS,C
subwf DONNEE,W
btfsc STATUS,Z
goto test_heures
btfsc STATUS,C
retlw 0
goto test_heures
test_minutes2
incf TEMP1,W
call LIS_EEPROM2
movf MINUTES,W
bcf STATUS,C
subwf DONNEE,W
btfsc STATUS,Z
retlw 0
btfss STATUS,C
retlw 0
retlw 0FFh
;=====================================
REGLE2
movwf TEMP4
movlw 01h ;clear display
call LCDCMD ;
movlw 8Bh
call LCDSTR2
movlw 0Ah
call LCDSETADR
movf TEMP4,W
sublw REACTEUR
movlw 9Ah ;min.
btfsc STATUS,Z
movlw 52h
call LCDSTR2
movf TEMP4,W
call LISEEPROM
att_regle
clrwdt
movlw 07h
call LCDSETADR
movf DONNEE,W
call LCDHEX
movlw 0A0h
btfsc PB,2
goto fin_regle1
btfss PB,1
goto att_regle
call RELACHE
movlw 0A0h
call INCREMENTE
goto att_regle
fin_regle1
call RELACHE
movf TEMP4,W
call ECRISEEPROM
movlw 40h
call LCDSETADR
movlw 92h
call LCDSTR2
movlw 4Bh
call LCDSETADR
movf TEMP4,W
sublw REMPLISSAGE
movlw 9Fh ;sec.
btfss STATUS,Z
movlw 9Ah ;min.
call LCDSTR2
incf TEMP4,W
call LISEEPROM
att_regle2
clrwdt
movlw 48h
call LCDSETADR
movf DONNEE,W
call LCDHEX
movlw 0A0h
btfsc PB,2
goto fin_regle2
btfss PB,1
goto att_regle2
call RELACHE
movlw 0A0h
call INCREMENTE
goto att_regle2
fin_regle2
call RELACHE
incf TEMP4,W
call ECRISEEPROM
return
;=====================================
LIS_EEPROM
movlw 20h
movwf FSR
bsf STATUS,IRP
movlw 40h
movwf TEMP4
clrf ADRESSE
boucle_lecture
movf ADRESSE,W
call LISEEPROM
movf DONNEE,W
movwf INDF
incf ADRESSE
incf FSR
decfsz TEMP4
goto boucle_lecture
return
;=====================================
LIS_EEPROM2
addlw 20h
movwf FSR
bsf STATUS,IRP
movf INDF,W
movwf DONNEE
return
;=====================================
REGLE_POMPE
movwf ADRESSE
call LISEEPROM
movlw 01h ;clear display
call LCDCMD ;
movlw 04h
call LCDSETADR
movlw 08h
call BOUCLE_POMPE
incf ADRESSE,W
call LISEEPROM
movlw 04h
call BOUCLE_POMPE
movlw 44h
call LCDSETADR
movlw 04h
call BOUCLE_POMPE
incf ADRESSE
incf ADRESSE,W
decf ADRESSE
call LISEEPROM
movlw 08h
call BOUCLE_POMPE
movf ADRESSE,W
call LISEEPROM
clrf TEMP4
movlw 04h
movwf TEMP5
clrf MENUPOS
clrf FINRETRO
attente_pompe
clrwdt
clrw
call LCDSETADR
movf FINRETRO,W
call LCDDEC
btfsc PB,0
return
btfsc PB,2
goto suivant
btfss PB,1
goto attente_pompe
call RELACHE
movlw 01h
xorwf DONNEE
movf TEMP5,W
call LCDSETADR
movlw "1"
btfss DONNEE,0
movlw "0"
call LCDCHAR
goto attente_pompe
suivant
call RELACHE
incf FINRETRO
incf TEMP5
movlw 10h
subwf TEMP5,W
btfss STATUS,Z
goto pompe_suivant
movlw 44h
movwf TEMP5
pompe_suivant
bcf STATUS,C
rrf DONNEE
btfsc STATUS,C
bsf DONNEE,7
incf TEMP4
movlw 08h
subwf TEMP4,W
btfss STATUS,Z
goto attente_pompe
movf ADRESSE,W
call ECRISEEPROM
incf MENUPOS
movlw 03h
subwf MENUPOS,W
btfsc STATUS,Z
return
clrf TEMP4
incf ADRESSE
movf ADRESSE,W
call LISEEPROM
goto attente_pompe
;=====================================
BOUCLE_POMPE
movwf TEMP4
boucle_pompe
movlw "1"
btfss DONNEE,0
movlw "0"
call LCDCHAR
rrf DONNEE
decfsz TEMP4
goto boucle_pompe
return
;=====================================
ECRIS_I2C1
movlw d'05'
movwf CPT
ecris_I2C1
comf SORTIES1, W
iorlw 0F8h
movwf DONNEE
movlw b'01000010'
call PCF8574
movlw b'01000011'
call PCF8574
movlw 07h
andwf DONNEE
comf SORTIES1, W
andlw 07h
subwf DONNEE, W
btfsc STATUS, Z
retlw 0
decfsz CPT
goto ecris_I2C1
retlw 0FFh
;===============================
REMPLISS_S
btfss REMPREAC,0
return
movlw REMPLISSAGE + 1
call LIS_EEPROM2
movf DONNEE,W
subwf SECONDES,W
btfss STATUS,Z
return
bcf REMPREAC,0
bcf SORTIES1,1
call ECRIS_I2C1
return
;==================================
REMPLISS_M
movlw 0A0h
movwf MAX
movf M_REMP,W
movwf DONNEE
call INCREMENTE
movf DONNEE,W
movwf M_REMP
movlw REMPLISSAGE
call LIS_EEPROM2
movf DONNEE,W
subwf M_REMP,W
btfss STATUS,Z
return
clrf M_REMP
bsf REMPREAC,0
bsf SORTIES1,1
call ECRIS_I2C1
return
;=========================================
REACT_REMP
movlw 0A0h
movwf MAX
movf M_REAC,W
movwf DONNEE
call INCREMENTE
movf DONNEE,W
movwf M_REAC
btfsc REMPREAC,2
goto reac_arret_remp
movlw REACTEUR2 + 1
call LIS_EEPROM2
call INCREMENTE
movf M_REAC,W
subwf DONNEE,W
btfss STATUS,Z
goto marche_reac_remp
bcf SORTIES1,0
call ECRIS_I2C1
bsf REMPREAC,2
return
marche_reac_remp
bsf SORTIES1,0
call ECRIS_I2C1
return
reac_arret_remp
movlw REACTEUR2
call LIS_EEPROM2
call INCREMENTE
movf DONNEE,W
subwf M_REAC,W
btfss STATUS,Z
return
bcf REMPREAC,2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -