Module thứ nhất tôi muốn gửi cho các bạn là về I2C trong 16F87x
Các bạn biết rồi đó I2C là một chuẩn giao tiếp rât phổ biến hiện nay, và trong 16F87x có tich hợp I2C cả chế độ Master và Slave. Dưới đây là code về sử dụng Master I2C Mode. Đây là một VD rất căn bản mà tôi lấy từ tập " I2C master mode"
Nếu bạn nào chưa dùng I2C Master mode trong 16F87x bao giờ tôi nghĩ rằng chưong trình này sẽ rất có ích
( Hix mất một buổi tôi để đánh máy đấy )
PHP Code:
; I2C ket noi voi 24C01C EEPROM
; Ghi tai dia chi 0x12, du lieu 0x34 va doc lai
; MSSP module duoc su che de I2C master mode
#define LC01CTRLIN H'A0' ; Gia tri cua I2C cho Control byte khi dua du lieu vao EEPROM
#define LC01CTRLOUT H'A1' ; ................................... doc du lieu tu EEPROM
#define LC01ADDR H'12' ; Dia chi can luu du lieu
#define LC01DATA H'34' ; Du lieu
#define BAUD D'100' ; Gia tri BAUD RATE
#define FOSC D'4000' ; Gia tri thach anh 4Mhz
#include <p16F877.inc>
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
ORG 0x00
; *** Thiet lap I/O ***
CLRF PORTB ; PORTB pins duoc dua ve 0
BANKSEL TRISB ; BANH1
MOVLW B'00011000' ; RC3,RC4 la input
MOVWF TRISC ; Nhung chan con lai la outputs
CLRF TRISB ; cho moi chan cua portB la outputs
; *** THIET LAP CAC THANH GI CHO I2C ***
; chon MSSP che do MASTER MODE
BANKSEL SSPCON
MOVLW B'00101000' ; Thiet lap MSSP cho chan PORTC o che do I2C
; SSPEN, SSPM BITS
MOVLW SSPCON
; Thiet lap muc cap do cho I2C ( I2C standard level )
BANKSEL SSPSTAT
MOVLW B'10000000'
MOVWF SSPSTAT
; Thiet lap toc do duong truyen
BANKSEL SSPADD
MOVLW (FOSC/(4*BAUD)) - 1; Tinh toan gia tri cho thiet lap toc do
MOVWF SSPADD
; *** Begin I2C Data Transfer Sequences ***
I2CWrite
; Gui bit START va doi cho cho den khi gui xong
BANKSEL SSPCON2
BSF SSPCON2,SEN ; Gui bit Start
CALL WaitMSSP ; Doi cho den khi bit START duoc gui xong
; Nhan va kiem tra CONTROL BYTE, doi cho den khi hoan thanh
MOVLW LC01CTRLIN ; Load CONTROL BYTE (input mode)
CALL Send_I2C_Byte ; Gui byte di
CALL WaitMSSP ; Doi cho den khi ket thuc cong viec
BANKSEL SSPCON2
BTFSC SSPCON2,ACKSTAT ; Kime tra bit ACK tu I2C
goto I2CFail
; Gui va kiem tra bit Stop, doi cho den khi hoan thanh xong
MOVLW LC01ADDR ; load addressByte
CALL Send_I2C_Byte ; Gui dia chi di
CALL WaitMSSP
BANKSEL SSPCON2
BTFSC SSPCON2,ACKSTAT ; Kiem tra ACK
GOTO I2CFail
; Gui va kiem tra DATA byte , doi cho den khi ket thuc
MOVLW LC01DATA ; Load Data Byte
CALL Send_I2C_Byte ; Gui byte di
CALL WaitMSSP
BANKSEL SSPCON2
BTFSC SSPCON2,ACKSTAT
GOTO I2CFail ; Kiem tra trang thai cua co ACK
; Gui va kiem tra bit STOP, doi cho den khi ket thuc
BANKSEL SSPCON2
BSF SSPCON2,PEN ; gui bit Stop
CALL WaitMSSP
; Ket thuc qua trinh viet du lieu len EEPROM
I2CRead
; Gui bit RESTART va doi den khi gui xong
BANKSEL SSPCON2
BSF SSPCON2,RSEN ; Gui bit Restart
CALL WaitMSSP
; Gui va kiem tra CONTROL BYTE, doi cho den khi hoan thanh
MOVLW LC01CTRLIN ; Load CONTROL BYTE ( cho viec xuat du lieu )
CALL Send_I2C_Byte ; Bat dau gui
CALL WaitMSSP ;
; Kiem tra trang thai san sang cua thiet bi
BANKSEL SSPCON2
BTFSC SSPCON2,ACKSTAT ; Kiem tra ACK Status bit
GOTO I2CRead ; Neu chua san sang thi nhay
; Gui va check Diachi Byte, doi cho den khi hoan thanh
MOVLW LC01ADDR ; Load ADDRESS Byte vao W
CALL WaitMSSP ; Gui du lieu
CALL WaitMSSP ; Doi cho den khi gui xong
BANKSEL SSPCON2
BTFSC SSPCON2,ACKSTAT ; Kiem tra ACK Status bit
GOTO I2CFail ; FAILED, NHAY NEU NHU THANH CONG
; Gui REPEATED START bit va doi cho den khi thuc hien xong
BSF SSPCON2,RSEN ; phat ra REPEATE START bit
CALL WaitMSSP ;
; Gui va kiem tra CONTROL BYTE (out) va doi cho den khi hoan thanh
MOVLW LC01CTRLOUT ; Load CONTROL BYTE
CALL Send_I2C_Byte ; Gui
CALL WaitMSSP ; Doi den khi ket thuc
BANKSEL SSPCON2
BTFSC SSPCON2,ACKSTAT ; Kiem tra ACK BIT
GOTO I2CFail ; FAILED, nhay neu nhu thanh cong
; Chuyen trang thai MSSP sang I2C Receive mode
BSF SSPCON2,RCEN ; cho phep RECEIVE Mode (I2C )
; Nhan da ta tu Slave va doi cho den khi ket thuc
; Luu y Receive MODE se tu dong Disable boi MSSP module
CALL WaitMSSP ; Doi cho den khi I2C thuc hien xong
; Gui bit NACK cho Acknowledge Sequence
BANKSEL SSPCON2
BSF SSPCON2,ACKDT ; Chon gui NACK
BSF SSPCON2,ACKEN ; Gui di
; Gui va va kiem tra STOP bit, va doi cho den khi ket thuc
BSF SSPCON2,PEN
CALL WaitMSSP
; I2C Write va Read ket thuc, gia tri se duoc dua ra LEDs
BANKSEL SSPBUF ;
MOVF SSPBUF,W ; Luu gia tri doc duoc tu EEPROM vao thanh ghi W
MOVWF PORTB
; Ket thuc qua trinh doc ghi
GOTO $ ; Vong lap vo han
;*** CAC chuong trinh con va cac loi cua chuong trinh ***
I2CFail
BANKSEL SSPCON2
BSF SSPCON2,PEN ; Send STOP condition
CALL WaitMSSP ; Doi
BANKSEL PORTB
MOVLW 0xFF
MOVWF PORTB ; Loi dua RA PORTB
GOTO $
; Day la chuong tirnh con cho viec gui BYTE len Slave. INput: W
Send_I2C_Byte
BANKSEL SSPBUF ; Chon bank0
movf SSPBUF ;
RETLW 0
WaitMSSP
BANKSEL PIR1
BTFSS PIR1,SSPIF ; Kiem tra trang thai co
GOTO $-1 ; Chua hoan thanh
BCF PIR1,SSPIF ; Da hoan thanh cong viec, va bat dau thu don chien truong
RETLW 0
END