?? 24c02.asm
字號:
INCLUDE HT48R30A-1.INC
SCL EQU PC.0 ;時鐘線
SDA EQU PC.1 ;數據線
SLVADR EQU 0A0H ;器件24C02地址
RCVDAT EQU 030H ;從24C02讀數據數據首地址
XMTDAT EQU 040H ;往24C02寫數據數據首地址
FLAG0 EQU [20H]
F0 EQU FLAG0.0
ACK EQU FLAG0.1
BITCNT EQU [21H] ;位數寄存器
BYTECNT EQU [22H] ;數據字節數
SUBADR EQU [23H] ;24C02訪問地址
WRITEBYTE EQU [24H] ;寫數據寄存器
READBYTE EQU [25H] ;讀數據寄存器
ORG 000H ;芯片復位從 00 開始
JMP RESET ;程序上電跳轉到初始化
ORG 004H ;外部中斷入口
RETI
ORG 008H ;定時/計數器中斷入口
reti
ORG 020H ;主程序從ROM 20H 地址開始存儲
RESET: CLR PCC ;設置PC1\PC0輸出
CLR PC ;PC口清零
;************************************************
; CLRMEM 將RAM區清零
;************************************************
; MOV A,20H
; MOV MP0,A
;CLR_RAM: CLR R0
; INC MP0
; MOV A,MP0
; SUB A,80H
; SNZ Z
; JMP CLR_RAM
MAIN: MOV A,10H
MOV SUBADR,A
MOV A,5
MOV BYTECNT,A
CALL SENDDAT
NOP
NOP
MOV A,10H
MOV SUBADR,A
MOV A,5
MOV BYTECNT,A
CALL RCVDATA
LOOP: JMP LOOP
;24C021操作子程序
START: SET SDA ;發送起始條件的數據信號
NOP
NOP
SET SCL ;發送起始條件的時鐘信號
NOP ;起始條件建立時間大于4.7US
NOP
NOP
NOP
NOP
NOP
NOP
CLR SDA ;發送起始信號
NOP ;起始條件所定時間大于4US
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL ;鉗住I2C總線,準備發送或接收數據
RET
STOP: CLR SDA ;發送停止條件的數據信號
NOP
NOP
SET SCL ;發送停止條件的時鐘信號
NOP ;起始條件建立時間大于4US
NOP
NOP
NOP
NOP
NOP
NOP
SET SDA ;發送I2C總線停止信號
RET
;發送字節子程序
SDBYTE: MOV A,8
MOV BITCNT,A ;要傳送的數據長度為8位
SENDB: RLC WRITEBYTE ;要發送的數據左移,發送位入C
SZ C ;發送位為"1"轉發送數據位"1"
JMP SENDB1
CLR SDA
JMP SEND
SENDB1: SET SDA ;發送數據位"1"
SEND: NOP
NOP
NOP
NOP
SET SCL ;置時鐘線為高,通知被控器開始接收數據位
NOP ;保證時鐘高周期大于4US
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
SDZ BITCNT
JMP SENDB ;8位沒發送完繼續發送
NOP
NOP
SET SDA ;8位發送完后釋放數據線,準備收應答位
NOP
NOP
SET SCL ;開始接受應答位
NOP
NOP
CLR F0 ;預先清發送數據出錯標志
SET PCC.1 ;INPUT
NOP
NOP
NOP
NOP
SZ SDA ;判斷是否接受到應答信號,正常轉ACKEND
SET F0 ;未收到應答,置位錯誤標志
ACKEND: NOP
NOP
CLR PCC.1 ;OUTPUT
CLR SCL ;發送結束鉗住總線,準備下一步發送或接收數據或進行其他處理
RET
;接收字節子程序
RCVBYTE: SET PCC.1 ;置數據線為輸入方式
MOV A,8
MOV BITCNT,A ;要傳送的數據長度為8位
RCV: NOP
NOP
CLR SCL ;置時鐘線為低,準備接收數據位
NOP ;時鐘低周期大于4US
NOP
NOP
NOP
NOP
NOP
NOP
SET SCL ;置時鐘線為高使數據線上數據有效
NOP
NOP
CLR C ;準備將接受的數據位放入ACC中
SZ SDA ;讀數據位,若為"0"則置C=0并轉RCV0接收數據位
SET C ;讀數據位,若為"1"則置C=1
RLC READBYTE ;接收的數據位放入
NOP
NOP
NOP
NOP
SDZ BITCNT
JMP RCV ;8位沒收完繼續接收
CLR SCL ;8位接收完置時鐘線為低準備發送應答或非應答信號
NOP
NOP
CLR PCC.1 ;OUTPUT
NOP
NOP
CLR SDA ;判斷是否需要繼續接收字節數據,若需要則轉SDACKB發送應答位
SZ ACK
SET SDA ;發送非應答位
SDACKB: NOP
NOP
NOP
SET SCL ;置時鐘線為高使應答位有效
NOP ;時鐘周期大于4US
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL ;清時鐘線鉗住I2C總線以便繼續接收字節數據或發送停止條件
CLR ACK ;清接收非應答標志
RET
;接收數據子程序
RCVDATA: CALL START ;發送I2C總線起始條件
MOV A,SLVADR ;取被控器總線地址
MOV WRITEBYTE,A
CALL SDBYTE ;發送被控器總線地址
SZ F0
JMP RCVRETURN ;出錯返回
MOV A,SUBADR ;取單元地址
MOV WRITEBYTE,A
CALL SDBYTE ;發送單元地址
SZ F0
JMP RCVRETURN ;出錯返回
CALL START ;發送I2C總線重復起始條件
MOV A,SLVADR ;取被控器總線地址
SET ACC.0 ;取總線讀操作位
MOV WRITEBYTE,A
CALL SDBYTE ;發送被控器總線地址
SZ F0
JMP RCVRETURN ;出錯返回
CLR ACK ;清接收非應答標志,準備接收數據
MOV A,RCVDAT
MOV MP0,A ;取接收數據緩沖區首址
SDZ BYTECNT ;如果還未接收數據則轉去接收前(BYTECNT)-1個數據
JMP RCVNEXT
JMP RCVLAST ;只剩最后一個數據未接收轉去接收最后一個數據
RCVNEXT: CALL RCVBYTE ;接收數據
MOV A,READBYTE
MOV R0,A ;將接收數據放入接收緩沖區中
INC MP0 ;指向下一個緩沖區地址
SDZ BYTECNT
JMP RCVNEXT ;重復操作直到剩下最后一個數據
RCVLAST: SET ACK ;置接收非應答標志,準備在接受萬最后一個數據后發出非應答信號以停止接收數據
CALL RCVBYTE ;接收最后一個數據
MOV A,READBYTE
MOV R0,A ;將最后一個數據放入接收緩沖區中
CALL STOP ;發送I2C總線停止條件
RCVRETURN: RET
;發送數據子程序
SENDDAT: CALL START ;發送I2C總線起始條件
MOV A,SLVADR ;取被控器總線地址
MOV WRITEBYTE,A
CALL SDBYTE ;發送被控器總線地址
SZ F0
JMP SENDRETURN ;出錯返回
MOV A,SUBADR ;取單元地址
MOV WRITEBYTE,A
CALL SDBYTE ;發送單元地址
SZ F0
JMP SENDRETURN ;出錯返回
MOV A,XMTDAT
MOV MP0,A ;取發送數據緩沖區首址
SENDNEXT: MOV A,R0
MOV WRITEBYTE,A
CALL SDBYTE ;發送一次數據
SZ F0
JMP SENDRETURN ;出錯返回
INC MP0 ;取下一數據
SDZ BYTECNT
JMP SENDNEXT ;重復操作直到發送完最后一個數據
CALL STOP ;發送I2C總線停止條件
SENDRETURN: RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -