📄 复件 aqua.asm
字号:
clrf M_REAC
return
;===================================
REACT
incf CPT_MIN
movlw 0A0h
movwf MAX
movf M_REAC,W
movwf DONNEE
call INCREMENTE
movf DONNEE,W
movwf M_REAC
btfsc REMPREAC,2
goto reac_arret
movlw REACTEUR + 1
call LIS_EEPROM2
call INCREMENTE
movf M_REAC,W
subwf DONNEE,W
btfss STATUS,Z
goto marche_reac
bcf SORTIES1,0
call ECRIS_I2C1
bsf REMPREAC,2
return
marche_reac
bsf SORTIES1,0
call ECRIS_I2C1
return
reac_arret
movf CPT_MIN,W
sublw d'60'
btfss STATUS,Z
return
movf H_REAC,W
movwf DONNEE
call INCREMENTE
movf DONNEE,W
movwf H_REAC
movlw REACTEUR
call LIS_EEPROM2
movf DONNEE,W
subwf H_REAC,W
btfss STATUS,Z
return
bcf REMPREAC,2
clrf H_REAC
clrf M_REAC
return
;=============================
TEST_BRASSAGE
addwf TEMP5,W
call LIS_EEPROM2
movf DONNEE,W
andwf TEMP4,W
btfss STATUS,Z
goto marche_pompe
movlw " "
call LCDCHAR
retlw 00h
marche_pompe
movf MENUPOS,W
call LCDCHAR
retlw 0FFh
;================================
BRASSAGE
movf HEURES,W
call BCD2DEC
clrf TEMP5
movf DONNEE,W
movwf TEMP3
movlw 08h
subwf TEMP3,W
btfss STATUS,C
goto suite_bra
movwf TEMP3
incf TEMP5
movlw 08h
subwf TEMP3,W
btfss STATUS,C
goto suite_bra
movwf TEMP3
incf TEMP5
suite_bra
bsf TEMP4,0
movf TEMP3,W
andlw 0FFh
btfsc STATUS,Z
goto suite_bra2
boucle_bras
bcf STATUS,C
rlf TEMP4
decfsz TEMP3
goto boucle_bras
suite_bra2
movlw 44h
call LCDSETADR
movlw "1"
movwf MENUPOS
movlw POMPE1
call TEST_BRASSAGE
bcf SORTIES,2
andlw 0FFh
btfss STATUS,Z
bsf SORTIES,2
incf MENUPOS
movlw POMPE2
call TEST_BRASSAGE
bcf SORTIES,3
andlw 0FFh
btfss STATUS,Z
bsf SORTIES,3
incf MENUPOS
movlw POMPE3
call TEST_BRASSAGE
bcf SORTIES,4
andlw 0FFh
btfss STATUS,Z
bsf SORTIES,4
incf MENUPOS
movlw POMPE4
call TEST_BRASSAGE
bcf SORTIES,5
andlw 0FFh
btfss STATUS,Z
bsf SORTIES,5
bsf FLAGS,7
return
;============== BCD ======================
BCD2DEC
movwf TEMP1
movlw 0
btfsc TEMP1,0
addlw d'1'
btfsc TEMP1,1
addlw d'2'
btfsc TEMP1,2
addlw d'4'
btfsc TEMP1,3
addlw d'8'
btfsc TEMP1,4
addlw d'10'
btfsc TEMP1,5
addlw d'20'
btfsc TEMP1,6
addlw d'40'
btfsc TEMP1,7
addlw d'80'
movwf DONNEE
return
;=================== 菜单"Commandes Manu" ==============
MENU_MANU
movlw 18h
movwf MENUPOS
movwf TEMP2
clrf TEMP5
clrf CPT
bsf CPT,0
clrf CPT2
bsf CPT2,0
ecrit_menu_manu
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 0Eh
call LCDSETADR
movlw ' '
call LCDCHAR
movf CPT,W
andwf CMDMANU,W
movlw 'A'
btfsc STATUS,Z
goto fin_test_auto1
movf CPT,W
andwf SORTIES,W
movlw 'X'
btfsc STATUS,Z
movlw '0'
fin_test_auto1
call LCDCHAR
movlw 41h
call LCDSETADR
movlw HIGH(MENUTABLE)
movwf PCLATH
incf MENUPOS,W
call MENUTABLE
clrf PCLATH
andlw 0FFh
btfss STATUS,Z
goto fin_menu_manu
movlw HIGH(MENUTABLE)
movwf PCLATH
movf TEMP2,W
call MENUTABLE
clrf PCLATH
fin_menu_manu
call LCDSTR
movlw 4Eh
call LCDSETADR
movlw ' '
call LCDCHAR
rlf CPT,W
andwf CMDMANU,W
movlw 'A'
btfsc STATUS,Z
goto fin_test_auto2
rlf CPT,W
andwf SORTIES,W
movlw 'X'
btfsc STATUS,Z
movlw '0'
fin_test_auto2
call LCDCHAR
attente_menu_manu
clrwdt
btfsc PB,1
goto menu_manu_suivant
btfss PB,2 ;enter
goto attente_menu_manu
call RELACHE
movlw 23h
subwf MENUPOS,W
btfsc STATUS,Z
return
movf CPT,W
xorwf CMDMANU
goto ecrit_menu_manu
menu_manu_suivant
rlf CPT
btfss STATUS,C
goto test_fin_manu
bsf FLAGS,1
test_fin_manu
incf MENUPOS
movlw HIGH(MENUTABLE)
movwf PCLATH
movf MENUPOS,W
call MENUTABLE
clrf PCLATH
andlw 0FFh
btfss STATUS,Z
goto ecrit_menu_manu
movf TEMP2,W
movwf MENUPOS
goto ecrit_menu_manu
;=============== BCD ====================
DEC2BCD
movwf TEMP1
clrf TEMP2
clrf DONNEE
movlw d'10'
continue_compt
subwf TEMP1
btfss STATUS,C
goto stop_compt
incf TEMP2
goto continue_compt
stop_compt
swapf TEMP2,W
movwf DONNEE
movf TEMP1,W
addlw d'10'
iorwf DONNEE
return
;====================== 测温 ======================
TEMPERATURE
bsf STATUS,RP0 ;bank 1
bsf SSPCON2,SEN ;start
bcf STATUS,RP0 ;bank 0
temp_start
btfss PIR1,SSPIF
goto temp_start
movlw b'10000001' ;adresse thermometre
movwf SSPBUF
bcf PIR1,SSPIF
temp_adr
btfss PIR1,SSPIF
goto temp_adr
btfsc SSPCON2,ACKSTAT ;si not ack
return
movlw 04h
call TEMPO
bsf STATUS,RP0
bsf SSPCON2,RCEN ;reception
bcf STATUS,RP0
bcf PIR1,SSPIF
temp_lecture
btfss PIR1,SSPIF
goto temp_lecture
movf SSPBUF,W ;lecture
movwf TEMPERATURE_ENTIER
movlw 04h
call TEMPO
bsf STATUS,RP0
bcf SSPCON2,ACKDT ;ack
bsf SSPCON2,ACKEN
bcf STATUS,RP0
bcf PIR1,SSPIF
temp_ack
btfss PIR1,SSPIF
goto temp_ack
movlw 04h
call TEMPO
bsf STATUS,RP0
bsf SSPCON2,RCEN ;reception
bcf STATUS,RP0
bcf PIR1,SSPIF
temp_lecture2
btfss PIR1,SSPIF
goto temp_lecture2
movf SSPBUF,W ;lecture
movwf TEMPERATURE_DECIMALE
movlw 04h
call TEMPO
bsf STATUS,RP0
bsf SSPCON2,ACKDT ;not ack
bsf SSPCON2,ACKEN
bcf STATUS,RP0
bcf PIR1,SSPIF
temp_not_ack
btfss PIR1,SSPIF
goto temp_not_ack
movlw 04h
call TEMPO
bsf STATUS,RP0 ;bank 1
bsf SSPCON2,PEN ;stop
bcf STATUS,RP0 ;bank 0
bcf PIR1,SSPIF
temp_stop
btfss PIR1,SSPIF
goto temp_stop
bcf PIR1,SSPIF
movf TEMPERATURE_DECIMALE,W
call DEC2BCD
movf DONNEE,W
movwf TEMPERATURE_DECIMALE
movf TEMPERATURE_DECIMALE,W
andlw 0Fh
sublw d'05'
clrf TEMP1
btfss STATUS,C
incf TEMP1
swapf TEMPERATURE_DECIMALE,W
andlw 0Fh
addwf TEMP1,W
movwf TEMPERATURE_DECIMALE
sublw d'10'
btfss STATUS,Z
return
incf TEMPERATURE_ENTIER
clrf TEMPERATURE_DECIMALE
return
;=====================================
AFF_TEMPERATURE
clrw
call LCDSETADR
movf TEMPERATURE_ENTIER,W
call LCDDEC
movlw "."
call LCDCHAR
movf TEMPERATURE_DECIMALE,W
addlw d'48' ;passage en ascii
call LCDCHAR
movlw 0DFh ;"?
call LCDCHAR
movlw "C"
call LCDCHAR
return
;=========================================
SORTIE_LIBRE
btfsc FLAGS,6
goto interrupteur
btfss PB,1
goto arret_sortie
btfsc FLAGS,5
goto pas_premier
bsf FLAGS,5
bsf SORTIES,7
call ECRIS_I2C0
movlw 49h
call LCDSETADR
movlw "X"
call LCDCHAR
movlw 60h
movwf MAX
movf SECONDES,W
movwf DONNEE
call INCREMENTE
call INCREMENTE
movf DONNEE,W
movwf FIN_X
return
pas_premier
movf SECONDES,W
subwf FIN_X,W
btfsc STATUS,Z
bsf FLAGS,6
return
interrupteur
btfsc FLAGS,4
goto deja_relache
btfsc PB,1
return
bsf FLAGS,4
deja_relache
btfss PB,1
return
arret_sortie
bcf FLAGS,5
bcf FLAGS,4
bcf FLAGS,6
btfss SORTIES,7
return
bcf SORTIES,7
call ECRIS_I2C0
movlw 49h
call LCDSETADR
movlw " "
call LCDCHAR
return
;=================== 温度 =========================
REGUL_TEMPERATURE
movlw TEMP_VISEE + 2
call LIS_EEPROM2
movf TEMPERATURE_ENTIER,W
subwf DONNEE,W
btfsc STATUS,Z
goto test_decimale
btfsc STATUS,C ;temp_entier > temp_visee
goto temp_faible
btfss SORTIES,6
return
bcf SORTIES,6
bsf FLAGS,7
return
test_decimale
temp_faible
btfsc SORTIES,6
return
bsf SORTIES,6
bsf FLAGS,7
return
;========================== MAIN ============================
MAIN
clrwdt
bsf STATUS,RP0 ;bank 1
movlw b'11010101' ;timer 0 prescaler 64
movwf OPTION_REG
movlw 0FFh
movwf ADCON1 ;entrees analogiques
movlw 78h ;port B
movwf TRISB
clrf TRISD ;port D, outputs
clrf TRISE ;port E, outputs
movlw d'127' ;vitesse clock I2C
movwf SSPADD ;20 kHz
bcf STATUS,RP0 ;bank 0
bsf PORTB,7
bsf INTCON,T0IE
bsf INTCON,GIE
movlw b'00101000' ;I2C master mode
movwf SSPCON ;configuration I2C
clrf PB
clrf PORTE
clrf FLAGS
clrf EXDONNEE
clrf SORTIES
clrf SORTIES1
clrf REMPREAC
clrf M_REAC
clrf H_REAC
clrf CMDMANU
clrf CPT_MIN
bsf SORTIES,6
call LCDINIT
call LIS_HEURE
call AFF_HEURE
debut
bsf FLAGS,0
call LIS_EEPROM
movlw 01h ;clear display
call LCDCMD ;
call BRASSAGE
boucle
clrwdt
movf PB,W
andlw 07h
btfsc STATUS,Z ;doit on allumer le retroeclairage
goto pas_retro ;non
bcf PORTB,7 ;retroeclairage
bcf STATUS,C
movf SECONDES,W
addlw 30h ;activer pendant 30s
movwf FINRETRO
movlw 60h
subwf FINRETRO,W
btfsc STATUS,C
movwf FINRETRO
pas_retro
call SORTIE_LIBRE
movf SECONDES,W
movwf EXSECONDES
movlw b'10000001' ;secondes
call DS1302
movf DONNEE,W
andlw 7Fh
movwf SECONDES
btfsc FLAGS,0
goto minute_ecoulee
andlw 0FFh
btfss STATUS,Z ;secondes = 0 ?
goto pas_min_ecoulee
movf EXSECONDES,W
sublw 59h
btfss STATUS,Z ;exsecondes = 59 ?
goto pas_min_ecoulee
minute_ecoulee
bcf FLAGS,0
call AFF_HEURE
call TEMPERATURE
call AFF_TEMPERATURE
call REGUL_TEMPERATURE
movf SECONDES,F
btfsc STATUS,Z
call LIS_I2C
btfss FLAGS,2
goto react_normal
call REACT_REMP
goto suite_test
react_normal
call REACT
suite_test
movlw L_BLANCHE
call TEST_HEURE
andlw 0FFh
btfsc STATUS,Z
goto arret_blanche
btfsc SORTIES,0
goto test_bleue
bsf SORTIES,0
bsf FLAGS,7
goto test_bleue
arret_blanche
btfss SORTIES,0
goto test_bleue
bcf SORTIES,0
bsf FLAGS,7
test_bleue
movlw L_BLEUE
call TEST_HEURE
andlw 0FFh
btfsc STATUS,Z
goto arret_bleue
btfsc SORTIES,1
goto fin_lumiere
bsf SORTIES,1
bsf FLAGS,7
goto fin_lumiere
arret_bleue
btfss SORTIES,1
goto fin_lumiere
bcf SORTIES,1
bsf FLAGS,7
fin_lumiere
btfsc FLAGS,7
call ECRIS_I2C0
movlw 42h
call LCDSETADR
movlw " "
btfsc SORTIES,0
movlw "B"
call LCDCHAR
movlw " "
btfsc SORTIES,1
movlw "b"
call LCDCHAR
movlw 48h
call LCDSETADR
movlw " "
btfsc SORTIES,6
movlw "C"
call LCDCHAR
movlw " "
btfsc SORTIES,7
movlw "X"
call LCDCHAR
movlw " "
btfsc SORTIES1,0
movlw "R"
call LCDCHAR
movlw " "
btfsc FLAGS,2 ;remplissage
movlw "r"
call LCDCHAR
movlw " "
btfsc SORTIES1,2
movlw "O"
call LCDCHAR
movf MINUTES,W
andlw 0FFh ;une heure ecoulee ?
btfsc STATUS,Z
call BRASSAGE
btfss FLAGS,2
goto pas_rempliss
call REMPLISS_M
pas_min_ecoulee
btfss FLAGS,2
goto pas_rempliss
call REMPLISS_S
pas_rempliss
movf SECONDES,W
subwf FINRETRO,W
btfsc STATUS,Z
bsf PORTB,7
btfss PB,0
goto boucle
call RELACHE
bcf PORTB,7
call MENU_UTIL
bsf PORTB,7
goto debut
;===================== MSG 显示信息 =====================
org 0800h
MSG
addwf PCL
DT "Commandes manu",0 ;00h
DT "Reglages",0 ;0Fh
DT "Mesure pH",0 ;18h
DT "Sortie",0 ;22h
DT "A propos...",0 ;29h
DT "date / heure",0 ;35h
DT "Reset",0 ;42h
DT "Lumiere blanche",0 ;48h
DT "Lumiere bleue",0 ;58h
DT "Reacteur calc.",0 ;66h
DT "Remplissage",0 ;75h
DT "Pompes brassage",0 ;81h
DT "Pompe 1",0 ;91h
DT "Pompe 2",0 ;99h
DT "Pompe 3",0 ;A1h
DT "Pompe 4",0 ;A9h
DT "Temperature",0 ;B1h
DT "Libre",0 ;BDh
DT "Osmoseur",0 ;C3h
DT "Etalonage",0 ;CCh
DT "Reacteur calc.2",0 ;D6h
DT "Heures Rempliss",0 ;E6h
;===================== MSG2显示信息 =====================
org 0900h
MSG2
addwf PCL
DT "Julien Schmitt",0 ;00h
DT "V1.0 19/06/2000",0 ;0Fh
DT "Menu utilisateur",0 ;20h
DT "****************",0 ;31h
DT "jour",0 ;42h
DT "mois",0 ;47h
DT "annee",0 ;4Ch
DT "heure",0 ;52h
DT "minutes",0 ;58h
DT "Aquamate",0 ;60h
DT "Etes vous sur ?",0 ;69h
DT "OUI",0 ;79h
DT "NON",0 ;7Dh
DT "debut",0 ;81h
DT "fin",0 ;87h
DT "chaque",0 ;8Bh
DT "pendant",0 ;92h
DT "min.",0 ;9Ah
DT "sec.",0 ;9Fh
;==================== MENUTABLE ========================
org 0A00h
MENUTABLE
addwf PCL
DT 00h,0Fh,18h,29h,22h,0
;/menu principal : 00h/
DT 35h,48h,58h,66h,0D6h,75h,81h,0E6h,0B1h,42h,22h,0
;/menu reglages : 06h/
DT 91h,99h,0A1h,0A9h,22h,0
;/reglage des pompes : 12h/
DT 48h,58h,91h,99h,0A1h,0A9h,0B1h,0BDh,66h,75h,0C3h,22h,0
;/Menu Manu : 18h/
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -