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

📄 mcs51_list_10_8.asm

📁 source code from Starcki book
💻 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 + -