⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aqua ok.asm

📁 基于pic的DS1302串行实时时钟程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
	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 + -