?? 本程序是利用文件240x.asm中的子程序?qū)eprom 240x進(jìn)行多字節(jié)讀寫的操作示例(同樣適用于416).asm
字號:
;240X的程序,調(diào)試成功,與大家分享
;***********************240X_SAMPLE**************************
;程序功能:本程序是利用文件240X.ASM中的子程序?qū)EPROM 240X進(jìn)行多字節(jié)讀寫的操作示例(同樣適用于416).
;說明:本程序在AT24C01A上調(diào)試通過.
;***********************符號定義******************************
;常量定義
I2C_SDA EQU P1.0 ;數(shù)據(jù)線
I2C_SCL EQU P1.1 ;時鐘線
;變量定義
I2C_AD DATA 50H ;存放器件的三位可編程地址或頁地址(0-7)
I2C_SUBA DATA 51H ;存放片內(nèi)尋址字節(jié).
I2C_NUMBYT DATA 52H ;存放傳送的字節(jié)數(shù).
I2C_TDA DATA 53H ;存放發(fā)送數(shù)據(jù)緩沖區(qū)首地址.
I2C_RDA DATA 54H ;存放接收數(shù)據(jù)緩沖區(qū)首地址.
DELAYMS_NUM DATA 55H ;存放延時的毫秒數(shù)
;************************************************************
ORG 00H
MOV I2C_AD,#00H ;設(shè)器件的三位可編程地址
MOV I2C_SUBA ,#00H ;設(shè)器件子地址
MOV I2C_NUMBYT,#02H ;寫2字節(jié)數(shù)據(jù)
MOV I2C_TDA,#30H ;設(shè)發(fā)送緩沖區(qū)首址
;***********寫********************
;待發(fā)送數(shù)據(jù)
MOV 30H,#0FFH
MOV 31H,#0FFH
LCALL I2C240X_WRNBYT ;寫入數(shù)據(jù)
JC $ ;若未正常寫入則停止
;延時10ms
MOV DELAYMS_NUM,#0AH ;置延時毫秒數(shù)
LCALL DELAYNMS
;***********讀********************
MOV I2C_NUMBYT,#02H ;讀2字節(jié)數(shù)據(jù)
MOV I2C_RDA,#40H ;設(shè)接收緩沖區(qū)首址
LCALL I2C240X_RDNBYT ;讀出數(shù)據(jù)
JC $ ;若未正常讀出則停止
SJMP $
;************************************************************
;包含文件
;#include <240X.ASM>
;#include
;END
;***********************240X.asm**********************************
;程序功能:本程序包實現(xiàn)對EEPROM 240X的多字節(jié)讀寫操作.
;入口參數(shù): I2C_AD 存放器件的三位可編程地址或頁地址(0-7).
; I2C_SUBA存放片內(nèi)尋址字節(jié).
; I2C_NUMBYT存放要傳送數(shù)據(jù)的字節(jié)數(shù).
; I2C_TDA存放發(fā)送數(shù)據(jù)緩沖區(qū)首地址.
; I2C_RDA存放接收數(shù)據(jù)緩沖區(qū)首地址.
;出口參數(shù):接收到的數(shù)據(jù)存放在接收數(shù)據(jù)緩沖區(qū)內(nèi).
; C存放接收到的應(yīng)答位或非應(yīng)答位,0表示應(yīng)答位,1表示非應(yīng)答位或總線不可用(數(shù)
據(jù)未正常寫入).
;占用資源:A,PSW,R0,R1,R3.
;占用堆棧:2字節(jié).
;子程序調(diào)用:I2C_START,I2C_STOP,I2C_TACK,I2C_TNACK,I2C_CACK,I2C_WRBYT,I2C_RDBYT.
;說明:1,本程序包適用的芯片有2401,2402,2404,2408,2416.
; 2,本程序適用于晶振頻率為12MHZ,即單周期指令用時1us的模式,若晶振頻率不
; 為12MHZ,則需相應(yīng)地改變NOP指令的條數(shù).
; 3,此程序調(diào)用了文件VI2C.ASM中的子程序,在此程序末尾已經(jīng)用include指令將文件
VI2C.ASM包含進(jìn)來了.
; 4,使用該程序前,用戶需定義下列各符號.
;***********************符號定義示例****************************
; ;常量定
義
; I2C_SDA EQU P1.0 ;數(shù)據(jù)線
; I2C_SCL EQU P1.1 ;時鐘線
; ;變量定義
; I2C_AD DATA 50H ;存放器件的三位可編程地址或頁地址(0-7)
; I2C_SUBA DATA 51H ;存放片內(nèi)尋址字節(jié)
; I2C_NUMBYT DATA 52H ;存放傳送的字節(jié)數(shù)
; I2C_TDA DATA 53H ;存放發(fā)送數(shù)據(jù)緩沖區(qū)首地址
; I2C_RDA DATA 54H ;存放接收數(shù)據(jù)緩沖區(qū)首地址
;***********************I2C240X_WRNBYT*************************
;程序功能:本程序?qū)崿F(xiàn)對EEPROM 240X寫入N字節(jié)數(shù)據(jù).
;入口參數(shù): I2C_AD 存放器件的三位可編程地址或頁地址(0-7),I2C_TDA存放待發(fā)送數(shù)據(jù)緩
沖區(qū)首址,
; I2C_NUMBYT存放待發(fā)送數(shù)據(jù)個數(shù),I2C_SUBA存放片內(nèi)尋址字節(jié).
;出口參數(shù):C存放接收到的應(yīng)答位或非應(yīng)答位,0表示應(yīng)答位,1表示非應(yīng)答位或總線不可用(數(shù)
據(jù)未正常寫入).
;占用資源:A,PSW,R0,R1,R3.
;占用堆棧:2字節(jié).
;子程序調(diào)用:I2C_START,I2C_STOP,I2C_CACK,I2C_WRBYT.
I2C240X_WRNBYT:
MOV R3,I2C_NUMBYT ;R3存放待發(fā)送字節(jié)數(shù)
LCALL I2C_START ;發(fā)開始信號
JC I2C_WABORT ;若總線不可用則中止
MOV A,I2C_AD ;將三位可編程地址或頁地址送入累加器
RL A ;左移一位對齊格式
ORL A,#0A0H ;加上固定的高四位地址
CLR ACC.0 ;設(shè)定為寫
LCALL I2C_WRBYT ;發(fā)送寫器件地址
LCALL I2C_CACK ;檢查應(yīng)答位
JC I2C_WABORT ;若檢測到非應(yīng)答位則中止
MOV A,I2C_SUBA ;將片內(nèi)尋址字節(jié)送入累加器
LCALL I2C_WRBYT ;發(fā)送
LCALL I2C_CACK ;檢查應(yīng)答位
JC I2C_WABORT ;若檢測到非應(yīng)答位則中止
MOV R1,I2C_TDA ;將待發(fā)送數(shù)據(jù)緩沖區(qū)首址送R1
I2C_WLOOP: MOV A,@R1 ;待發(fā)送數(shù)據(jù)送入累加器
LCALL I2C_WRBYT ;發(fā)送N字節(jié)數(shù)據(jù)
LCALL I2C_CACK ;檢測應(yīng)答位
JC I2C_WABORT ;若檢測到非應(yīng)答位則中止
INC R1 ;發(fā)送數(shù)據(jù)緩沖區(qū)指針調(diào)整
DJNZ R3,I2C_WLOOP ;是否發(fā)完?
CLR C ;清錯誤標(biāo)志位,正常寫入
I2C_WABORT: LCALL I2C_STOP ;發(fā)送停止位
RET
;***********************I2C240X_RDNBYT***********************
;程序功能:本程序?qū)崿F(xiàn)從EEPROM240X中讀出N字節(jié)數(shù)據(jù).
;入口參數(shù): I2C_AD 存放器件的三位可編程地址或頁地址(0-7),I2C_RDA存放待接收數(shù)據(jù)緩
沖區(qū)首址,
; I2C_NUMBYT存放待接收數(shù)據(jù)個數(shù),I2C_SUBA存放片內(nèi)尋址字節(jié).
;出口參數(shù):接收到的數(shù)據(jù)存放在接收數(shù)據(jù)緩沖區(qū)中,C存放接收到的應(yīng)答位或非應(yīng)答位,0表示
應(yīng)答位,
; 1表示非應(yīng)答位或總線不可用(數(shù)據(jù)未正常讀出)
;占用資源:A,PSW,R0,R1,R3.
;占用堆棧:2字節(jié).
;子程序調(diào)用:I2C_START,I2C_STOP,I2C_TACK,I2C_TNACK,I2C_CACK,I2C_WRBYT,I2C_RDBYT.
I2C240X_RDNBYT:
MOV R3,I2C_NUMBYT ;R3存放待接收字節(jié)數(shù)
LCALL I2C_START ;發(fā)開始信號
JC I2C_RABORT ;若總線不可用則中止
MOV A,I2C_AD ;將三位可編程地址或頁地址送入累加器
RL A ;左移一位對齊格式
ORL A,#0A0H ;加上固定的高四位地址
CLR ACC.0 ;設(shè)定為寫
LCALL I2C_WRBYT ;發(fā)送寫器件地址
LCALL I2C_CACK ;檢查應(yīng)答位
JC I2C_RABORT ;若檢測到非應(yīng)答位則中止
MOV A,I2C_SUBA ;將片內(nèi)尋址字節(jié)送入累加器
LCALL I2C_WRBYT ;發(fā)送
LCALL I2C_CACK ;檢查應(yīng)答位
JC I2C_RABORT ;若檢測到非應(yīng)答位則中止
LCALL I2C_START ;發(fā)開始信號
JC I2C_RABORT ;若總線不可用則中止
MOV A,I2C_AD ;將三位可編程地址或頁地址送入累加器
RL A ;左移一位對齊格式
ORL A,#0A0H ;加上固定的高四位地址
SETB ACC.0 ;設(shè)定為讀
LCALL I2C_WRBYT ;發(fā)送讀器件地址
LCALL I2C_CACK ;檢查應(yīng)答位
JC I2C_RABORT ;若檢測到非應(yīng)答位則中止
MOV R1,I2C_RDA ;將待接收數(shù)據(jù)緩沖區(qū)首址送R1
I2C_RLOOP: LCALL I2C_RDBYT ;接收1字節(jié)數(shù)據(jù)
MOV @R1,A ;送入緩沖區(qū)
DJNZ R3,I2C_TTACK ;是否接收完?
LCALL I2C_TNACK ;發(fā)送非應(yīng)答位
CLR C ;清錯誤標(biāo)志位,正常讀出
I2C_RABORT: LCALL I2C_STOP ;發(fā)送結(jié)束信號
RET
I2C_TTACK: LCALL I2C_TACK ;發(fā)送應(yīng)答位
INC R1 ;接收數(shù)據(jù)緩沖區(qū)指針調(diào)整
SJMP I2C_RLOOP
;************************************************************
;#include
;2004.11.19 12MHZ
;*******************VI2C**************************************
;程序功能:單主系統(tǒng)主方式下虛擬I2C總線軟件包(100KHZ).
;入口參數(shù): 無.
;出口參數(shù): C存放接收到的應(yīng)答位或非應(yīng)答位,0表示應(yīng)答位,1表示非應(yīng)答位或總線不可用.
;占用資源:A,PSW,R0.
;占用堆棧:0字節(jié).
;子程序調(diào)用:無.
;說明:1,本程序適用于晶振頻率為12MHZ,即單周期指令用時1us的模式,若晶振頻率不
; 為12MHZ,則需相應(yīng)地改變NOP指令的條數(shù).
; 2,該軟件包用于與其它操作I2C接口器件的子程序配合使用.
; 3,使用該程序前,用戶需定義下列各符號.
;***********************符號定義示例****************************
; ;常量定義
; I2C_SDA EQU P1.0 ;數(shù)據(jù)線
; I2C_SCL EQU P1.1 ;時鐘線
;***********************I2C_START******************************
;程序功能:本程序?qū)崿F(xiàn)在虛擬I2C總線上發(fā)送起始位。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -