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

📄 mcs51_list_10_7.asm

📁 source code from Starcki book
💻 ASM
字号:
; ========================================================================
;
;                  Tomasz Starecki: "Mikrokontrolery 8051 w praktyce"
;                        Wydawnictwo BTC  -  http://www.btc.pl
;
; ========================================================================
; zestaw podstawowych procedur do programowj obslugi lacza I2C
; ========================================================================

EXTERN SDA, SCL 		; linie portow pelniace funkcje szyny I2C

EXTERN I2C_fault, I2C_busy, I2C_no_ack, I2C_ostatni_bajt	
				; wskazniki stanu i bledow szyny

EXTERN licznik_bitow_I2C	

PUBLIC zapis_bajtu_I2C, odczyt_bajtu_I2C, start_I2C, stop_I2C

	ORG	1800H

;===========================================================
; procedura pomocnicza - generuje opoznienie ok. 5 us
; 
; UWAGA! dopasowana do zegara 12 MHz, przy wiekszej lub
; wyraznie mniejszej fosc nalezy ja odpowiednio zmodyfikowac
;===========================================================

wait_5us:    
	NOP     ; uwgledniajac, ze LCALL i RET trwaja w sumie 4 cykle
        RET     ; maszynowe wystarczy dolozyc pojedyncza instrukcje NOP

;===========================================================
; procedura pomocnicza - ustawia linie SCL w stan wysoki 
; i czeka na zakonczenie ewentualnego przeciagania stanu 
; niskiego przez urzadzenie podrzedne
;===========================================================

SCL_high:   
	SETB SCL   	; probuje wymusic wysoki stan linii SCL
        JNB SCL, $  	; i czeka na faktyczne przejscie SCL w stan wysoki
        RET

;===========================================================
; procedura pomocnicza - wysyla sygnal STOP i zwalnia szyne
;===========================================================

stop_I2C:  
	CLR SDA      	; wymusza stan niski na SDA
        CALL SCL_high   ; przygotowanie SCL (SCL w stan wysoki)
        CALL wait_5us   ; minimalne opoznienie
        SETB SDA        ; wlasciwe zbocze sygnalu STOP
        CALL wait_5us
        CLR I2C_busy    ; wyzerowanie wskaznika zajetosci szyny
        RET                  

;===========================================================
; procedura wysylania bajtu do urzadzen podrzednych
; bajt do wyslania w ACC
; 	niszczy CY
;===========================================================

zapis_bajtu_I2C:  
	MOV licznik_bitow_I2C, #8	
wr_loop:    
	RLC A        	; bit do wyslania do CY
        MOV SDA, C      ; i na linie SDA
        CALL SCL_high   ; zbocze narastajace SCL
        CALL wait_5us   ; odmierzenie minimalnego czasu wysokiego SCL
        CLR SCL		; i zbocze opadajace SCL
        CALL wait_5us	; zmow minimalny odstep czasowy
        DJNZ licznik_bitow_I2C, wr_loop
			; powtarza petle, az wysle wszystkie bity
        SETB SDA        ; przygotowanie do odbioru bitu potwierdzenia
        CALL SCL_high   ; poczatek impulsu zegarowego dla bitu potwierdzenia
        CALL wait_5us
        JNB SDA, no_wr_ACK ; sprawdzenie, czy jest potwierdzenie, jesli nie
        SETB I2C_no_ack    ; to ustawiany jest odpowiedni znacznik
no_wr_ACK:   
	CLR SCL         ; koniec impulsu zegarowego dla bitu potwierdzenia
        CALL wait_5us	
        RET

;===========================================================
; procedura wysylania sygnalu START szyny I2C
;===========================================================

start_I2C:  
	SETB I2C_busy	; ustawienie wskaznika aktywnej transmisji I2C
        CLR I2C_no_ack  ; zerowanie wskaznikow bledow: braku potwierdzenia
        CLR I2C_fault	; oraz                         blednego stanu szyny
        JNB SCL, fault  ; sprawdza poprawnosc stanu szyny i sygnalizuje
        JNB SDA, fault	; ewentualny blad
        CLR SDA         ; poczatek sygnalu START
        CALL wait_5us
        CLR SCL
        CALL wait_5us   ; koniec sygnalu START
        RET
fault:  
	SETB I2C_fault  ; ustawienie wskaznika bledu szyny
        RET             

;===========================================================
; procedura odbierania bajtu od urzadzenia podrzednego
;
; 	odebrany bajt zwracany jest w ACC
;
; UWAGA! wskaznik I2C_ostatni_bajt jest wykorzystywany do 
; sygnalizacji konca odbioru danych brakiem potwierdzenia 
; i musi zawierac "1", jesli odbierany bajt ma byc ostatnim
; odbieranym bajtem lub "0" w przeciwnym przypadku
;
; 	niszczy CY
;===========================================================

odczyt_bajtu_I2C:   
	MOV licznik_bitow_I2C, #8	; trzeba odebrac 8 bitow
rd_loop:    
	CALL SCL_high        	; zbocze zegara dla odbieranego bitu
        CALL wait_5us
        MOV C, SDA       	; odbierany bit z linii SDA do CY
        RLC A              	; i jego wsuniecie do ACC
        CLR SCL			; koncowe zbocze zegara odebranego bitu
        CALL wait_5us		; minimalny odstep przed kolejnym bitem
        DJNZ licznik_bitow_I2C, rd_loop	
				; jesli nie wszystkie bity, to skok
	MOV C, I2C_ostatni_bajt
	MOV SDA, C		; stan bitu potwierdzenia na linie SDA
	CALL SCL_high        	; poczatek bitu potwierdzenia
        CALL wait_5us
        CLR SCL
        SETB SDA         	; koniec bitu potwierdzenia
        CALL wait_5us
        RET

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -