📄 mcs51_list_10_8.asm
字号:
; ====================================================
;
; Tomasz Starecki: "Mikrokontrolery 8051 w praktyce"
; Wydawnictwo BTC - http://www.btc.pl
;
; ====================================================
; podstawowe procedury obslugi interfejsu 1-Wire
; udostepniane sa procedury jak w deklaracji PUBLIC
; wymagane zdefiniowanie (typowo w module glownym)
; parametr體 jak w EXTERN
; niszcza ACC, B, R7, CY
; ====================================================
PUBLIC init_1_wire, zapisz_bajt_1_wire, czytaj_bajt_1_wire, RD_wire_bit
EXTERN wire, brak_urzadzen_1_wire
; ====================================================
; prosty przyklad wykorzystania makro skladajacego
; sie z zaledwie jednej instrukcji, ale dzieki
; odpowiednio dobranej nazwie poprawiajacego
; czytelnosc programu
; =================================================
macro %delay
DJNZ B, $ ; opoznienie rowne ok. 2*B mikrosekund
endmac
; ======== koniec makrodefinicji ==================
; =================================================
; inicjalizacja szyny (szukanie urzadzen 1-Wire)
; niszczy B i CY
; =================================================
init_1_wire:
CLR wire
MOV B, #0 ; wyzerowanie magistrali
%delay ; na ok. 520 us
SETB wire ; powrot do stanu wysokiego
MOV B, #30
%delay ; opoznienie ok. 65 us
MOV C, wire ; odczytanie stanu magistrali
MOV brak_urzadzen_1_wire, C ; znacznik czy sa jakies urzadzenia 1-Wire
%delay ; opoznienie 520 us
RET
; =================================================
; odczyt pojedynczego bitu
; niszczy B i CY
; =================================================
RD_wire_bit: ; odebrany bit w CY
CLR wire ; krotki impuls ujemny
SETB wire ; tu koniec impulsu
MOV B, #5 ; lacznie z reszta instrukcji daje prawie 15 us
NOP
%delay ; opoznienie owych prawie 15 us
MOV C, wire ; i odczyt stanu magistrali
MOV B, #60 ; jeszcze dodatkowe 120 us opoznienia
%delay
RET
; =================================================
; odczyt pojedynczego bajtu (wynik w ACC)
; niszczy R7, B i CY
; =================================================
czytaj_bajt_1_wire: ; odebrany bajt w ACC
MOV R7, #8
czytaj_kolejny_bit:
CALL RD_wire_bit
RRC A
DJNZ R7, czytaj_kolejny_bit
RET
; =================================================
; zapis pojedynczego bitu
; niszczy B i CY
; =================================================
WR_wire_bit: ; bit do wyslania w CY
MOV B, #1
CPL C
MOV B.5, C ; jesli wysylane "0", to B = 33, jesli "1" to B = 1
CLR wire ; poczatek ujemnego impulsu
%delay
SETB wire ; koniec impulsu po ok. 4 us ("1") lub 70 us ("0")
JNC wire_1 ; jesli wyslana "1", to trzeba jeszcze poczekac
RET
wire_1:
MOV B, #30 ; przynajmniej 60 us
%delay
RET
; =================================================
; zapis pojedynczego bajtu (bajt w ACC)
; niszczy R7, B i CY
; =================================================
zapisz_bajt_1_wire:
MOV R7, #8
zapisz_kolejny_bit:
RRC A
CALL WR_wire_bit
DJNZ R7, zapisz_kolejny_bit
RET
END ; koniec modulu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -