📄 sh69pxx单片机与24系列e2prom接口程序包.txt
字号:
SH69PXX单片机与24系列E2PROM接口程序包
[ 作者:佚名 转贴自:本站原创 点击数:481 文章录入:admin ]
;指令周期>=1us,即单片机时钟源<=4MHz。
;I/O口PORTB.3和PORTB.2分别为时钟线SCL和数据线SDA。
;定义系统寄存器
PORTB EQU 09H ;PORTB端口状态寄存器
PBOUT EQU 19H ;PORTB端口输入/输出控制寄存器
;定义数据寄存器
PORTB_BUF EQU ??H ;PORTB缓存
WR_TMP_H EQU ??H ;发送的串行数据(高四位)
WR_TMP_L EQU ??H ;发送的串行数据(低四位)
S_DATA_H EQU ??H ;读/写的串行数据缓存(高四位)
S_DATA_L EQU ??H ;读/写的串行数据缓存(低四位)
ADDR_H EQU ??H ;要操作的器件地址单元(高四位)
ADDR_L EQU ??H ;要操作的器件地址单元(低四位)
DELAY_H EQU ??H ;延时变量(高四位)
DELAY_L EQU ??H ;延时变量(低四位)
;=============================================================
;写E2PROM程序
;INPUT :ADDR_H,ADDR_L(要操作的单元地址),S_DATA_H,S_DATA_L(要写入的数据)
WRITE24: LDI PBOUT,1111B ;SDA(PORTB.2)和SCL(PORTB.3)都设置为输出状态
CALL START ;发起始信号
LDI WR_TMP_H,0AH ;寻址字节(写)送缓存
LDI WR_TMP_L,0
CALL WRBYTE ;发寻址字节
CALL WRACK ;释放数据线SDA以便让E2PROM发出应答信号
LDA ADDR_H ;要操作的单元地址送缓存
STA WR_TMP_H
LDA ADDR_L
STA WR_TMP_L
CALL WRBYTE ;写入要操作的单元地址
CALL WRACK ;释放数据线SDA以便让E2PROM发出应答信号
LDA S_DATA_H ;要写入的数据送缓存
STA WR_TMP_H
LDA S_DATA_L
STA WR_TMP_L
CALL WRBYTE ;写入的数据
CALL WRACK ;释放数据线SDA以便让E2PROM发出应答信号
CALL STOP_SUB ;发终止信号
NOP
CALL DELAY1 ;延时5~10ms之后再对E2PROM作下次操作
CALL DELAY1
RTNI
; =============================================================
;起始信号子程序
START: ORIM PORTB_BUF,0100B ;SDA置高
STA PORTB
NOP
NOP
ORIM PORTB_BUF,1000B ;SCL置高
STA PORTB
NOP
NOP
ANDIM PORTB_BUF,1011B ;SDA拉低
STA PORTB
CALL DELAY ;保持10us
NOP
ANDIM PORTB_BUF,0111B ;恢复SDA
STA PORTB
NOP
RTNI
;=============================================================
;发送串形数据子程
WRBYTE: LDA WR_TMP_H
BA3 $+3
ANDIM PORTB_BUF,1011B
JMP WRBYTE1
ORIM PORTB_BUF,0100B
WRBYTE1: STA PORTB ;第一位
CALL DELAY ;保持10us
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
LDA WR_TMP_H
BA2 $+3
ANDIM PORTB_BUF,1011B
JMP WRBYTE2
ORIM PORTB_BUF,0100B
WRBYTE2: STA PORTB ;第二位
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
LDA WR_TMP_H
BA1 $+3
ANDIM PORTB_BUF,1011B
JMP WRBYTE3
ORIM PORTB_BUF,0100B
WRBYTE3: STA PORTB ;第三位
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
LDA WR_TMP_H
BA0 $+3
ANDIM PORTB_BUF,1011B
JMP WRBYTE4
ORIM PORTB_BUF,0100B
WRBYTE4: STA PORTB ;第四位
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
LDA WR_TMP_L
BA3 $+3
ANDIM PORTB_BUF,1011B
JMP WRBYTE5
ORIM PORTB_BUF,0100B
WRBYTE5: STA PORTB ;第五位
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
LDA WR_TMP_L
BA2 $+3
ANDIM PORTB_BUF,1011B
JMP WRBYTE6
ORIM PORTB_BUF,0100B
WRBYTE6: STA PORTB ;第六位
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
LDA WR_TMP_L
BA1 $+3
ANDIM PORTB_BUF,1011B
JMP WRBYTE7
ORIM PORTB_BUF,0100B
WRBYTE7: STA PORTB ;第七位
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
LDA WR_TMP_L
BA0 $+3
ANDIM PORTB_BUF,1011B
JMP WRBYTE8
ORIM PORTB_BUF,0100B
WRBYTE8: STA PORTB ;第八位
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
RTNI
;=============================================================
;释放数据线SDA以便让E2PROM发出应答信号
WRACK:
LDI PBOUT,1011B ;把I/O口PORTB.2设置为输入状态以释放SDA,(Bit3,1,0
;根据实际情况设置输入/输出状态)
NOP
CALL DELAY
ORIM PORTB_BUF,1000B ;SCL送一个时钟信号
STA PORTB
CALL DELAY
ANDIM PORTB_BUF,0111B
STA PORTB
NOP
LDI PBOUT,1111B ;PORTB.2恢复输出状态(Bit3,1,0
;根据实际情况设置输入/输出状态)
NOP
NOP
RTNI
;=============================================================
;停止信号子程序
STOP_SUB:ANDIM PORTB_BUF,1011B ;拉低SDA
STA PORTB
NOP
NOP
ORIM PORTB_BUF,1000B ;置高SCL
STA PORTB
CALL DELAY ;保持10us
ORIM PORTB_BUF,0100B ;置高SDA
STA PORTB
NOP
NOP
RTNI
;=============================================================
;读E2PROM程序
;INPUT: ADDR_H,ADDR_L(要操作的单元地址)
;OUTPUT:S_DATA_H,S_DATA_L(读出的数据)
READ24: LDI PBOUT,1111B ;SDA(PORTB.2)和SCL(PORTB.3)都设置为输出状态
CALL START ;发起始信号
LDI WR_TMP_H,0AH ;寻址字节(写)送缓存
LDI WR_TMP_L,0
CALL WRBYTE ;发寻址字节(写)
CALL WRACK ;释放数据线SDA以便让E2PROM发出应答信号
LDA ADDR_H ;要操作的单元地址送缓存
STA WR_TMP_H
LDA ADDR_L
STA WR_TMP_L
CALL WRBYTE ;写入要操作的单元地址
CALL WRACK ;释放数据线SDA以便让E2PROM发出应答信号
CALL START ;发起始信号
LDI WR_TMP_H,0AH ;寻址字节(读)送缓存
LDI WR_TMP_L,1
CALL WRBYTE ;发寻址字节(读)
CALL WRACK ;释放数据线SDA以便让E2PROM发出应答信号
NOP
CALL RDBYTE ;读出数据
LDA WR_TMP_H ;存数据
STA S_DATA_H
LDA WR_TMP_L
STA S_DATA_L
NOP
CALL STOP_SUB ;发终止信号
CALL DELAY1 ;延时5~10ms之后再对E2PROM作下次操作
CALL DELAY1
RTNI
;=============================================================
;读串形数据子程序
RDBYTE: LDI PBOUT,1011B ; 把I/O口PORTB.2设置为输入状态以释放SDA,(Bit3,1,0
;根据实际情况设置输入/输出状态)
NOP
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
LDA PORTB ;读第一位
BA2 $+3
ANDIM WR_TMP_H,0111B
JMP RDBYTE1
ORIM WR_TMP_H,1000B
RDBYTE1: ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
LDA PORTB ;读第二位
BA2 $+3
ANDIM WR_TMP_H,1011B
JMP RDBYTE2
ORIM WR_TMP_H,0100B
RDBYTE2: ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
LDA PORTB ;读第三位
BA2 $+3
ANDIM WR_TMP_H,1101B
JMP RDBYTE3
ORIM WR_TMP_H,0010B
RDBYTE3: ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
LDA PORTB
BA2 $+3 ;读第四位
ANDIM WR_TMP_H,1110B
JMP RDBYTE4
ORIM WR_TMP_H,0001B
RDBYTE4: ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
LDA PORTB
BA2 $+3 ;读第五位
ANDIM WR_TMP_L,0111B
JMP RDBYTE5
ORIM WR_TMP_L,1000B
RDBYTE5: ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
LDA PORTB
BA2 $+3 ;读第六位
ANDIM WR_TMP_L,1011B
JMP RDBYTE6
ORIM WR_TMP_L,0100B
RDBYTE6: ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
LDA PORTB
BA2 $+3 ;读第七位
ANDIM WR_TMP_L,1101B
JMP RDBYTE7
ORIM WR_TMP_L,0010B
RDBYTE7: ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
ORIM PORTB_BUF,1000B
STA PORTB
CALL DELAY
LDA PORTB
BA2 $+3 ;读第八位
ANDIM WR_TMP_L,1110B
JMP RDBYTE8
ORIM WR_TMP_L,0001B
RDBYTE8: ANDIM PORTB_BUF,0111B
STA PORTB
CALL DELAY
LDI PBOUT,1111B ;PORTB.2恢复输出状态(Bit3,1,0
;根据实际情况设置输入/输出状态)
RTNI
;=============================================================
;延时子程序(10us)
DELAY: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RTNI
;=============================================================
;延时子程序(5ms)
DELAY1: LDI DELAY_H,0
LDI DELAY_L,0
DELAY2: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
ADIM DELAY_L,1
LDI TEMP,0
ADCM DELAY_H
BC $+2
JMP DELAY2
RTNI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -