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