?? 本程序是利用文件240x.asm中的子程序?qū)eprom 240x進行多字節(jié)讀寫的操作示例(同樣適用于416).asm
字號:
;入口參數(shù):無.
;出口參數(shù):SDA,SCL返回為低電平,
; 錯誤標(biāo)志位C,若錯誤標(biāo)志位C為高電平則表示總線不可用.
;占用資源:C.
;占用堆棧:0字節(jié).
;子程序調(diào)用:無.
;說明:當(dāng)SCL為高電平時,SDA由高變低.
I2C_START: SETB I2C_SDA
SETB I2C_SCL
;判斷總線是否可用
JNB I2C_SDA,I2C_ER1 ;不為高則跳轉(zhuǎn)
JNB I2C_SCL,I2C_ER1 ;不為高則跳轉(zhuǎn)
NOP ;保證啟動建立時間大于4.7us (start
setup time)
CLR I2C_SDA ;保證啟動保持時間大于4.0us (start hold
time)
NOP
NOP
NOP
NOP
NOP
CLR I2C_SCL
CLR C ;清錯誤標(biāo)志位(總線可用)
SJMP I2C_OK1
I2C_ER1: SETB C ;置錯誤標(biāo)志位(總線不可用)
I2C_OK1: RET
;***********************I2C_STOP*******************************
;程序功能:本程序?qū)崿F(xiàn)在虛擬I2C總線上發(fā)送結(jié)束位。
;入口參數(shù):SCL在入口時應(yīng)為低電平.
;出口參數(shù):SDA,SCL都為高電平.
;占用資源:無.
;占用堆棧:0字節(jié).
;子程序調(diào)用:無.
;說明:當(dāng)SCL為高電平時,SDA由低變高。
I2C_STOP: CLR I2C_SDA
NOP ;保證SCL低電平時間大于4.7us(clock pulse
width low)
NOP ;以及數(shù)據(jù)建立時間大于200ns(data in
setup time)
SETB I2C_SCL
NOP ;保證結(jié)束建立時間大于4.7us(stop setup
time)
NOP
NOP
NOP
NOP
SETB I2C_SDA
RET
;**********************I2C_TACK*******************************
;程序功能:本程序?qū)崿F(xiàn)向虛擬I2C總線上發(fā)送應(yīng)答位。
;入口參數(shù):SCL在入口時應(yīng)為低電平.
;出口參數(shù):SDA,SCL都為低電平.
;占用資源:無.
;占用堆棧:0字節(jié).
;子程序調(diào)用:無.
I2C_TACK: CLR I2C_SDA ;發(fā)送應(yīng)答位
NOP ;保證SCL低電平時間大于4.7us(clock pulse
width low)
NOP ;以及數(shù)據(jù)建立時間大于200ns(data in
setup time)
SETB I2C_SCL ;產(chǎn)生一個時鐘周期
NOP ;保證SCL高電平時間大于4.0us(clock pulse
width high)
NOP
NOP
NOP
CLR I2C_SCL
RET
;**********************I2C_TNACK******************************
;程序功能:本程序?qū)崿F(xiàn)向虛擬I2C總線上發(fā)送非應(yīng)答位。
;入口參數(shù):SCL在入口時應(yīng)為低電平.
;出口參數(shù):SDA為高電平,SCL為低電平.
;占用資源:無.
;占用堆棧:0字節(jié).
;子程序調(diào)用:無.
I2C_TNACK: SETB I2C_SDA ;發(fā)送非應(yīng)答位
NOP ;保證SCL低電平時間大于4.7us(clock pulse
width low)
NOP ;以及數(shù)據(jù)建立時間大于200ns(data in
setup time)
SETB I2C_SCL ;產(chǎn)生一個時鐘周期
NOP ;保證SCL高電平時間大于4.0us(clock pulse
width high)
NOP
NOP
NOP
CLR I2C_SCL
RET
;**********************I2C_CACK*******************************
;程序功能:本程序?qū)崿F(xiàn)從虛擬I2C總線上檢查應(yīng)答位。
;入口參數(shù):SCL在入口時應(yīng)為低電平.
;出口參數(shù):應(yīng)答位存在C中,SCL為低電平.
;占用資源:C.
;占用堆棧:0字節(jié).
;子程序調(diào)用:無.
I2C_CACK: SETB I2C_SDA ;置I2C_SDA為輸入方式
NOP ;保證SCL低電平時間大于4.7us(clock
pulse width low)
NOP ;以及保證tAA大于0.1us(clock low to
data out valid)
SETB I2C_SCL
NOP ;保證SCL高電平時間大于4.0us(clock
pulse width high)
NOP
NOP
NOP
MOV C,I2C_SDA ;接收應(yīng)答位
CLR I2C_SCL ;拉低時鐘線
RET
;***********************I2C_WRBYT******************************
;程序功能:本程序?qū)崿F(xiàn)向虛擬I2C總線上發(fā)送一字節(jié)數(shù)據(jù).
;入口參數(shù):A存待發(fā)送單字節(jié)數(shù)據(jù),SCL在入口時應(yīng)為低電平.
;出口參數(shù):SCL為低電平.
;占用資源:A,PSW,R0.
;占用堆棧:0字節(jié).
;子程序調(diào)用:無.
I2C_WRBYT: MOV R0,#08H ;計8位
I2C_WLP: RLC A
MOV I2C_SDA,C
;保證SCL低電平時間大于4.7us(clock
pulse width low)
NOP ;以及數(shù)據(jù)建立時間大于200ns(data in
setup time)
SETB I2C_SCL ;產(chǎn)生一個時鐘周期
NOP ;等待接收器件讀取
NOP ;保證SCL高電平時間大于4.0us(clock
pulse width high)
NOP
NOP
CLR I2C_SCL ;拉低時鐘線以便再次發(fā)送
DJNZ R0,I2C_WLP ;是否發(fā)完8位
RET
;***********************I2C_RDBYT******************************
;程序功能:本程序?qū)崿F(xiàn)從虛擬I2C總線上接收一字節(jié)數(shù)據(jù).
;入口參數(shù):SCL在入口時應(yīng)為低電平.
;出口參數(shù):A存放接收到的單字節(jié)數(shù)據(jù),SCL為低電平.
;占用資源:A,PSW,R0.
;占用堆棧:0字節(jié).
;子程序調(diào)用:無.
I2C_RDBYT: MOV R0,#08H ;計數(shù)8位
SETB I2C_SDA ;置1以便輸入
I2C_RLP: NOP ;保證SCL低電平時間大于4.7us(clock pulse
width low)
;保證SCL低電平時間大于4.7us(clock pulse width low)
NOP ;以及保證tAA大于0.1us(clock low to data
out valid)
;以及數(shù)據(jù)建立時間大于200ns(data in setup time)
NOP
SETB I2C_SCL ;拉高時鐘線,以便輸入
NOP ;保證SCL高電平時間大于4.0us(clock
pulse width high)
NOP
MOV C,I2C_SDA
RLC A
CLR I2C_SCL ;拉低時鐘線,以便發(fā)送器發(fā)送
DJNZ R0,I2C_RLP
RET
;****************DELAYNMS***************************************
;程序功能:本程序?qū)崿F(xiàn)延時Nms.
;入口參數(shù):DELAYMS_NUM存放延時的毫秒數(shù).
;出口參數(shù):無.
;占用資源:R3
;占用堆棧:0字節(jié).
;子程序調(diào)用:無.
;說明:1,本程序適用于晶振頻率為12MHZ時,即單周期指令用時1us的模式,
; 時間計算公式為(249*4+1+1+2)*(DELAYMS_NUM)+2=1000*(DELAYMS_NUM)+2
; 2,未加上調(diào)用該子程序的指令執(zhí)行的時間,如 LCALL DELAYNMS
; 3,使用該子程序前需定義符號DELAYMS_NUM,例DELAYMS_NUM DATA 55H
DELAYNMS: MOV R3,#0F9H ;1us
LOOP500: NOP
NOP
DJNZ R3,LOOP500 ;2us
NOP
DJNZ DELAYMS_NUM,DELAYNMS ;2us
RET ;2us
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -