?? dallas.asm
字號:
; Lecteur DALLAS avec liaison RS232 9600 bauds
; 14 janvier 2001
list P=16F876
include <C:\progra~1\MPLAB2\P16F876.INC>
; configuration du processeur
__CONFIG _CP_OFF&_DEBUG_OFF&_WRT_ENABLE_ON&_CPD_OFF&_LVP_OFF&_BODEN_ON&_PWRTE_ON&_WDT_ON&_HS_OSC
;____________________________________________________________________________________________________________________
; variables
;____________________________________________________________________________________________________________________
serie equ 20
part1 equ 21
part2 equ 22
part3 equ 23
part4 equ 24
part5 equ 25
part6 equ 26
dallasCRC equ 27
tmp equ 28
compteur equ 29
valeur equ 2A
temp equ 2B
rotation equ 2C
nboctet equ 2D
crc equ 2F
adresse equ 30
dataee equ 31
saveW equ 32
savesta equ 33
saveFSR equ 34
flag equ 35
caractere equ 36
adresseH equ 37
adresseL equ 38
dataF equ 39
nbkey equ 3A
temp1 equ 3B
temp2 equ 3C
timer equ 3D ; timer pour tempo 1 seconde
seconde equ 3E ; compteur de secondes
key equ 3F ; indice de la clef trouv閑
decompte equ 40 ; decompte pour tempo relais
adlow equ 41 ; poids faible adresse R/W pour protocole
adhigh equ 42 ; poids fort adresse R/W pour protocole
;____________________________________________________________________________________________________________________
; constantes
;____________________________________________________________________________________________________________________
skiprom equ 0CC ; commande DALLAS
readscratch equ 0BE ; " "
convert equ 44 ; " "
readrom equ 33 ; " "
readram equ 0F0 ; " "
Ladress equ 0
Hadress equ 0
ahigh equ 08
alow equ 00
nbclef equ 05 ; nb maximum de clef
ACK equ 06 ; acknowledge liaison serie
;____________________________________________________________________________________________________________________
; etiquettes bits
;____________________________________________________________________________________________________________________
#define _data PORTA,0
#define _rouge PORTB,7
#define _verte PORTB,6
#define _relais PORTB,5
masque equ b'10000000' ; masque de la led qui clignote
; la led qui clignote doit 阾re sur le PORTB
#define zero STATUS,Z
#define _receivedcar flag,0
#define idem flag,1
#define _clignote flag,2
;____________________________________________________________________________________________________________________
; macro commandes
;____________________________________________________________________________________________________________________
bank0 macro
bcf STATUS,RP0
bcf STATUS,RP1
endm
bank1 macro
bsf STATUS,RP0
endm
bank2 macro
bcf STATUS,RP0
bsf STATUS,RP1
endm
bank3 macro
bsf STATUS,RP0
bsf STATUS,RP1
endm
;____________________________________________________________________________________________________________________
; ent阾e programme
;____________________________________________________________________________________________________________________
org 2100 ; initialisation de l'EEPROM
de 00,05
org 0
goto debut
org 4
goto interrupt
;____________________________________________________________________________________________________________________
; programme
;____________________________________________________________________________________________________________________
debut:
clrwdt
clrf flag
movlw 5
movwf timer
call initwdt ; initialisation du watchdog
call initportA ; initialisation PORT A
call initportB
call initportC ; initialisation PORT C
call initV24 ; initialisation RS232
call inittmr1 ; initialisation timer 1
call initint ; initialisation des interruptions
movlw 0
movwf adresse
clrwdt
call readEE ; va lire l'adresse 0 de l'EEPROM
xorlw 0
btfsc zero
goto firstaccess
bsf _rouge
main:
clrwdt
call litcode
btfsc STATUS,C
goto access
btfss _receivedcar
goto main
bcf _receivedcar
movf caractere,w
xorlw 'M' ; set mem ?
btfsc zero
goto setmem
xorlw 'M'
xorlw 'R' ; read mem ?
btfsc zero
goto readmem
xorlw 'R'
xorlw 'W' ; write mem
btfsc zero
goto writemem
goto main
setmem:
movlw d'255'
movwf seconde
sm1:
clrwdt
movf seconde,w ; time out liaison serie une seconde
btfsc zero
goto main
btfss _receivedcar ; attent adresse basse
goto sm1
bcf _receivedcar
movf caractere,w
movwf adlow ; dans le registre
movlw d'255'
movwf seconde
sm2:
clrwdt
movf seconde,w ; time out liaison serie
btfsc zero
goto main
btfss _receivedcar ; attend adresse haute
goto sm2
bcf _receivedcar
movf caractere,w
movwf adhigh ; dans le registre
movlw ACK
call transmit ; puis transmettre un ACK
goto main
readmem:
movlw d'255'
movwf seconde
rm1:
clrwdt
movf seconde,w
btfsc zero
goto main
btfss _receivedcar
goto rm1
bcf _receivedcar
movf caractere,w
xorlw 'E'
btfsc zero
goto rEEPROM
xorlw 'E'
xorlw 'F'
btfsc zero
goto rflash
xorlw'F'
xorlw 'R'
btfss zero
goto main
rram: ; lecture dans la ram
movlw 8
movwf compteur
movlw serie
movwf FSR
rr1:
movf INDF,w
call transmit
incf FSR,f
decfsz compteur,f
goto rr1
movlw ACK
call transmit
goto main
rflash: ; lecture dans la flash
clrwdt
movf adlow,w
movwf adresseL
movf adhigh,w
movwf adresseH
call readF
call transmit ; envoi de l'octet
movlw ACK
call transmit
movf adlow,w
addlw 1
btfsc zero
incf adhigh,f
movf adlow,w
goto main
rEEPROM:
clrwdt
movf adlow,w
movwf adresse
call readEE ; va lire l'EEPROM
call transmit
movlw ACK
call transmit
incf adlow,f
goto main
writemem:
movlw d'255'
movwf seconde
wm1:
clrwdt
movf seconde,w
btfsc zero
goto main
btfss _receivedcar
goto wm1
bcf _receivedcar
movf caractere,w
xorlw 'E'
btfsc zero
goto wEEPROM
xorlw 'E'
xorlw 'F'
btfsc zero
goto wFLASH
xorlw 'F'
xorlw 'R'
btfss zero
goto main
wRAM: ; RAZ des 8 octets du code DALLAS en RAM
clrwdt
movlw 8
movwf compteur
movlw serie
movwf FSR
wr1:
movlw 0
movwf INDF
incf FSR,f
decfsz compteur,f
goto wr1
movlw ACK
call transmit
goto main
wFLASH: ; ecriture dans la FLASH
clrwdt
movf adlow,w
movwf adresseL
movf adhigh,w
movwf adresseH
movlw d'255'
movwf seconde
wf1:
clrwdt
movf seconde,w
btfsc zero
btfss _receivedcar
goto wf1
bcf _receivedcar
movf caractere,w
movwf dataF
call writeF
movlw ACK
call transmit
movf adlow,w
addlw 1
btfsc zero
incf adhigh,f
movf adlow,w
goto main
wEEPROM: ; ecriture dans l'EEPROM
movf adlow,w
movwf adresse
movlw d'255'
movwf seconde
we1:
clrwdt
movf seconde,w
btfsc zero
goto main
btfss _receivedcar
goto we1
bcf _receivedcar
movf caractere,w
movwf dataee
call writeEE
movlw ACK
call transmit
incf adlow,f
goto main
firstaccess: ; aucune clef dans la flash
bsf _clignote
fa1:
clrwdt
call litcode
btfss STATUS,C
goto fa1
bcf _clignote
bcf _rouge
call entercode
bsf _verte
call setrelais
bcf _verte
bsf _rouge
goto main
newaccess: ; adjonction d'une clef
movlw 0 ; verifier
movwf adresse ; si
call readEE ; le nombre maxi de clef
addlw 1 ; n'est pas atteint
sublw nbclef
btfss STATUS,C
goto endna
bcf _verte
bcf _rouge
bsf _clignote
clrf seconde
na0:
clrwdt
movf seconde,w
xorlw 5
btfss zero
goto na0
clrf seconde
na1:
clrwdt
movf seconde,w
xorlw 0A ; time out = 10 secondes
btfsc zero
goto endna
call litcode
btfss STATUS,C
goto na1
call entercode
bcf _clignote
bcf _rouge
bsf _verte
call setrelais
endna:
bcf _clignote
bcf _verte
bsf _rouge
goto main
access: ; une clef a 閠
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -