- UID
- 1023166
- 性别
- 男
- 来自
- 燕山大学
|
;按复位按键。 该程序可以记录存储复位的次数
UBADR EQU 40H
BITCNT EQU 41H
SUBADR EQU 42H
SDA BIT P3.6
SCL BIT P1.5
ORG 00H
JMP MAIN
ORG 100H
MAIN:
MOV P2,0
ACALL READ_24C02 ;调用读24C02子程序
MOV DPTR,#TABLE
MOV A,R7
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
INC R7
ACALL WRITE_24C02 ;;调用写24C02程序
ACALL DELAY
ACALL DELAY
JMP $
;===================================
DELAY: MOV R0,#0FFH
DELAY0: MOV R1,#0FFH
DELAY1: NOP
NOP
NOP
DJNZ R1,DELAY1
DJNZ R0,DELAY0
RET
;============================
WRITE_24C02:
ACALL START ;发送IC总线起始条件
MOV A,#0A0H ;24C02总线地址
ACALL SENTBYTE ;发送24C02器件总线地址
JB F0,SENDRETURN ;出错返回
MOV A,SUBADR ;取存储地址
ACALL SENTBYTE
JB F0,SENDRETURN
MOV A,R7
ACALL SENTBYTE ;发送一次数据
JB F0,SENDRETURN ;出错返回
ACALL STOP ;发送IC总线停止条件
DELAY10: ;延时10MS等待数据写完
MOV 44H,30H
D1: MOV 45H,#34H
DJNZ 45H,$
DJNZ 44H,D1
SENDRETURN:
RET
;=======================================
READ_24C02: ;读24C02
ACALL START ;发送IC总线起始条件
MOV A,#0A0H
ACALL SENTBYTE ;24C02总线地址
JB F0,RCVRETURN ;出错返回
MOV A,SUBADR ;取存储地址
ACALL SENTBYTE ;发送24C02器件总线地址
JB F0,SENDRETURN ;出错返回
ACALL START ;发送IC总线重复起始条件
MOV A,#0A0H ;24C02总线地址
SETB ACC.0 ;取总线读操作数
ACALL SENTBYTE ;发送被控制总线地址
JB F0,RCVRETURN ;出错返回
ACALL RCVBYTE ;接受数据
RCVRETURN:
RET
;=========================================
START:
SETB SDA ;发送起始条件的数据信号
NOP
NOP
NOP
SETB SCL ;发送起始条件的时钟信号
NOP ;起始条件建立时间大于4.7s
NOP
NOP
CLR SDA ;发送起始信号
NOP ;起始条件锁定时间大于4s
NOP
NOP
CLR SCL ; 钳住IC总线准备发送或接受数据
RET
;==================================
STOP:
CLR SDA ;发送停止条件的数据信号
NOP
NOP
NOP
SETB SCL ;发送停止条件的时钟信号
NOP ;起始条件建立时间大于4s
NOP
NOP
SETB SDA ;发送IC总线停止信号
NOP
NOP
NOP
NOP
RET
;===============================
SENTBYTE: ;送数8位
MOV BITCNT,#08H
SENTB:
RLC A ;要发送的数据左移,发送入位C
MOV SDA,C
NOP
NOP
NOP
SETB SCL ;置时钟线为高,通知被控制开始接受数据位
NOP ;保证时钟高周期大于4s
NOP
NOP
CLR SCL ;钳住总线准备接受下一个数据位
DJNZ BITCNT,SENTB ;8位没发送完继续发送
NOP
NOP
SETB SDA ;8位发送完后释放数据线准备收应答位
NOP
NOP
SETB SCL ;开始接受应答信号
NOP
NOP
CLR F0 ;预先清发送数据出错标志
JNB SDA,ACKEND ;判断是否接受应答信号正常转ACKEND
SETB F0 ;未受到应答置位错误标志
ACKEND:
NOP
CLR SCL ;发送结束钳住总线准备下一步发送或接受数据或进行其他处理
RET
;=================================
RCVBYTE:
SETB SDA ;置数据线为输入方式
MOV BITCNT,#08H ;要传送的数据长度为8位
RCV:
NOP
CLR SCL ;置时钟线为低,准备接受数据
NOP ;时钟低周期大于4.7s
NOP
NOP
NOP
NOP
SETB SCL ;置时钟线为高使数据线上数据有效
NOP
NOP
MOV C,SDA
RLC A ;接受的数据位放入ACC
NOP
NOP
DJNZ BITCNT,RCV ;8位没收完继续接受
CLR SCL ;8位接受完置时钟线和数据线
NOP
NOP
CLR SDA
SETB SDA ;接受非应答信号
NOP
NOP
SETB SCL ;置时钟线为高使应答位有效
NOP ;时钟高周期大于4.7s
NOP
SETB SDA
NOP
NOP
NOP
CLR SCL ;清时钟线钳住IC总线以便发送停止条件
RET
TABLE: DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
END |
|