选择性读时序
.................24c02字节读写程序(已调试过).......................
;////////////////////////////////////////////////////
;AT89C52与AT24C02的IIC通信
;控制数码管显示0-P
;AT24C02采用字节写和选择性读
;////////////////////////////////////////////////////
DAUN EQU 18 ;写入字节数,对24C02(256BK)最大为255
ADDR EQU 41H ;24C02操作数据地址
WRDA EQU 42H ;写入数据暂存器
RDDA EQU 43H ;读出数据暂存器
WP BIT P1.0
SCL BIT P1.1
SDA BIT P1.2
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN: CLR WP;开写保护
MOV SP,70H
MOV P2,#0F7H
MOV P0,#0FFH
LCALL WRIIC;写24C02
LCALL DE1S
D1:LCALL RDIIC;读24C02
LJMP D1
;写24C02子程序
WRIIC:MOV DPTR,#TAB
MOV R0,#DAUN
MOV ADDR,#00H;地址赋初值
D2:LCALL START
MOV WRDA,#0AEH
LCALL SEND
LCALL SACK
MOV A,ADDR
MOV WRDA,A
LCALL SEND
LCALL SACK
CLR A
MOVC A,@A+DPTR
MOV WRDA,A
LCALL SEND
LCALL SACK
LCALL STOP
INC DPTR;数据表指针加一
INC ADDR;24C02写入地址加一
LCALL D50U;写入数据延时,这个时间很重要
DJNZ R0,D2
RET
;读24C02子程序
RDIIC:MOV R0,#DAUN
MOV ADDR,#00H
D5:LCALL START
MOV WRDA,#0AEH
LCALL SEND
LCALL SACK
MOV A,ADDR
MOV WRDA,A
LCALL SEND
LCALL SACK
LCALL START
MOV WRDA,#0AFH
LCALL SEND
LCALL SACK
LCALL READ
LCALL STOP;不需要读应答案信号
MOV A,RDDA
MOV P0,A
LCALL DE1S
INC ADDR;读24C02数据地址加一
DJNZ R0,D5
RET
;24C02开始子程序
START:SETB SDA
SETB SCL
LCALL DE5U
CLR SDA
LCALL DE5U
CLR SCL
RET
;24C02写一个字节子程序
SEND: MOV R1,#08H
MOV A,WRDA
D3:RLC A
MOV SDA,C
LCALL DE5U
SETB SCL
LCALL DE5U
CLR SCL
DJNZ R1,D3
RET
;24C02读一个字节子程序
READ: MOV R1,#08H
D6:SETB SDA
LCALL DE5U
SETB SCL
LCALL DE5U
MOV C,SDA
RLC A
CLR SCL
DJNZ R1,D6
MOV RDDA,A
RET
;24c03写应答子程序
SACK: SETB SDA
LCALL DE5U
SETB SCL
LCALL DE5U
D4:MOV C,SDA
JC D4
CLR SCL
RET
;24C02通信结束子程序
STOP: CLR SDA
LCALL DE5U
SETB SCL
LCALL DE5U
SETB SDA
LCALL DE5U
CLR SCL
RET
;5US延时子程序
DE5U: NOP
NOP
NOP
NOP
NOP
RET
;1S延时子程序
DE1S: MOV R3,#100
E1:MOV R4,#20
E2:MOV R5,#248
DJNZ R5,$
DJNZ R4,E2
DJNZ R3,E1
RET
;50US延时,让24C02写入片内ROM;
D50U:MOV R6,250
E3:NOP
NOP
NOP
NOP
DJNZ R6,E3
RET
;显示数据表
TAB:DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H
DB 0F8H,080H,090H,088H,083H,0C6H,0A1H
DB 086H,08EH,089H,08CH
END
=====================================================================================
/////////////////////////////
;此程序可历遍整个EEPROM(256个字节)
////////////////////////////
wp equ p1.0
scl equ p1.1
sda equ p1.2
wrda equ 40h
rdda equ 41h
org 0000h
sjmp main
org 0030h
main:clr wp
clr p2.0
clr a
mov r2,a
mov r3,a
mov p0,#020h
mov sp,#70h
mov 42H,#020h//要读写的字节数
mov dptr,#tab
n1:lcall wriic
lcall d10m
djnz 42,n1
mov 43,#020h
n2:lcall rdiic
lcall d10m
djnz 43,n2
sjmp $
wriic:lcall start
mov wrda,#10101110b
lcall send
mov wrda,r2
inc r2
lcall send
w1:clr a
movc a,@a+dptr
mov wrda,a
lcall send
inc dptr
lcall stop
ret
rdiic:lcall start
mov wrda,#10101110b
lcall send
mov wrda,r3
inc r3
lcall send
lcall start
mov wrda,#10101111b
lcall send
lcall read
mov p0,rdda
lcall d1s
lcall stop
ret
read: mov r1,#08h
d1:setb sda
lcall d3u
setb scl
lcall d3u
mov c,sda
rlc a
clr scl
lcall d3u
djnz r1,d1
mov rdda,a
lcall stop
ret
start:setb sda
setb scl
lcall d3u
clr sda
lcall d3u
clr scl
ret
send: mov r0,#08h
mov a,wrda
s1:rlc a
mov sda,c
LCALL D3U
setb scl
lcall d3u
clr scl
lcall d3u
djnz r0,s1
setb sda
lcall d3u
setb scl
lcall d3u
s2:mov c,sda
jc s2
clr scl
ret
stop: clr sda
lcall d3u
setb scl
lcall d3u
setb sda
lcall d3u
clr scl
ret
d3u: nop
nop
ret
TAB: DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
D10m: ;误差 0us
MOV R7,#01H
DL1:
MOV R6,#26H
DL0:
MOV R5,#82H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
D1s: ;误差 0us
MOV R7,#0A7H
DL4:
MOV R6,#0ABH
DL3:
MOV R5,#01H
DJNZ R5,$
DJNZ R6,DL3
DJNZ R7,DL4
NOP
RET
END
上一篇:LCD12864图片显示
下一篇:24C02(EEPROM)以字节读写程序(ASM)
推荐阅读最新更新时间:2024-03-16 15:12
设计资源 培训 开发板 精华推荐
- 双11之单片机狂欢:11.11元包邮拇指板STM32L011,抢完为止
- 现场抽取PS5等诸多好礼 SiFive RISC-V 中国技术论坛 上海、北京、深圳 3场线下活动邀您出席!
- 英特尔 SoC FPGA 开发者论坛 (ISDF) 预约报名享好礼!
- 【XILINX 主题分享月】 设计工具资料大搜集!!!
- TE有奖活动|如何有效应对当下测试测量领域的挑战
- 体验Cyclone V Dev Kit
- 机智云Gokit3免费测评试用!用熟悉的方式,快速实现每一个想法!
- TI 金刚狼 LaunchPad系列课程,抢开发板&精美好礼!
- 应用指南下载|是德科技《快速查找和识别隐藏的信号误差》
- 共抗疫情,少出门多学习。领取下载积分,让学习资料到你碗里!