📄 tmp86ch29mg.asm
字号:
;FM2402W_PROCESE
FM2402W:
;D=要写的存储单元号 这是要往24CXX里写的位置
;E=要写入的数据 这是往24CXX里写的数据
SET (P6CR).7
SET (P6CR).6
SET (P6DR).7 ;置SCL=1
SET (P6DR).6 ;置SDA=1
CALL FMSTART ;写开始状态字
LD H,0Y10100000 ;SET 2402=写
CALL FMSEND ;送
LD H,D ;30H指向2402数据的起始地址,将要写2402的起始地址送到H
CALL FMSEND
LD H,E ;取一个数据传递到H
CALL FMSEND ;写具体数据
CALL FMSTOP ;停止
CALL DELAY_1MS ;等待一定时间使24C02内部写完成
RET ;返回
FMSEND: PUSH A ;保存A
LD A,H ;将H中的数发送出去
LD L,0X08 ;往2401发送数据
FMSLO0P1: ROLC A ;将A中的数据移到数据线上
LD (P6DR).7,CF ;送出数据
CALL DELAY_XuS
SET (P6DR).6 ;发送串行时钟进行写操作
CALL DELAY_XuS
CLR (P6DR).6
DEC L
JR NE,FMSLO0P1 ;串行发送8 BIT
FMACK: CLR (P6CR).7 ;准备接收ACK:input
CALL DELAY_XuS
SET (P6DR).6 ;接收ACK的时钟
CALL DELAY_XuS
RFMACK: LD CF,(P6DR).7 ;写完后等待确认信号 ACK
JR CS,RFMACK
SET (P6CR).7 ;output
NOP
CLR (P6DR).6 ;为下一步其它操作做准备
NOP
CLR (P6DR).7
POP A ;还原ACC
CALL DELAY_1MS ;等待内部写完
RET
FM2402R: ;D=要读的存储单元号 这是要从24CXX里读出的位置
;E=读出的数据 这是从24CXX里读出的数据
SET (P6CR).7
SET (P6CR).6
SET (P6DR).7
SET (P6DR).6 ;保证SDA/SCL起始=1
CALL FMSTART ;写状态字
LD H,0Y10100000 ;SET 2402=WRI
CALL FMSEND ;送出状态字
LD H,D ;上程序传来的读取地址;H=地址数据
CALL FMSEND ;送出数据
SET (P6DR).6
SET (P6DR).7 ;保证SDA/SCL起始=1
CALL FMSTART
LD H,0Y10100001 ;读状态
CALL FMSEND
CALL R2READ ;读所需的数
CALL FMSTOP
RET
FMSTART: CALL DELAY_XuS ;对2402操作开始
CLR (P6DR).7 ;在SCL=1时,SDA由1变为0表示开始
CALL DELAY_XuS
CLR (P6DR).6
CALL DELAY_XuS
RET
R2READ: PUSH A
LD L,0X08
FMRLO0P1: CLR (P6CR).7 ;置数据线=1
SET (P6DR).7
CALL DELAY_XuS
SET (P6DR).6 ;输出一个串行时钟
CALL DELAY_XuS
LD CF,(P6DR).7 ;读数据线上的数据到 CF
ROLC A ;移到 A
CALL DELAY_XuS
CLR (P6DR).6
DEC L
JR NE,FMRLO0P1 ;读 8 BIT 数据
CALL DELAY_XuS
SET (P6CR).7
CLR (P6DR).7
LD E,A ;将接收到的数据保存到H
POP A ;还原A
RET
FMSTOP: CALL DELAY_XuS ;对2401操作结束
SET (P6DR).6
CALL DELAY_XuS
SET (P6DR).7 ;在SCL=1时,SDA由0变为1表示结束
CALL DELAY_XuS
RET
DELAY_XuS: PUSH B
LD B,0XF0
EEDELAY_LOOP: NOP
NOP
NOP
DEC B
JRS F,EEDELAY_LOOP
POP B
RET
DELAY_1MS: LD B,0X64 ;延时1mS
LOOP4: LD C,0X03
NOP
LOOP5: DEC C
JR NZ,LOOP5
DEC B
JR NZ,LOOP4
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -