📄 cufirst.a51
字号:
;EEPROM PORT DEFINITIONS ETC.
SDA1 EQU P1.6
SCL1 EQU P1.7
WTCMD EQU 10100000B ;WRITE DATA COMMAND
RDCMD EQU 10100001B ;READ DATA COMMAND
HBADD EQU 7Eh
MEMORY EQU 7Fh
ORG 0000h
LJMP MAIN
MAIN:
;************************ROUTINE TO SET STATUS AS ZERO***********************
MOV A,#WTCMD ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,#00H ;GET BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,#00H ;GET DATA
CALL OUT ;SEND IT
CALL STOP ;SEND STOP CONDITION
ACALL DELAY_STOP
JMP $
OUTS: MOV R2,#8 ;LOOP COUNT -- EQUAL TO BIT COUNT
SETB SDA1 ;INSURE DATA IS HI
SETB SCL1 ;INSURE CLOCK IS HI
NOP ;NOTE 1
NOP
NOP
CLR SDA1 ;START CONDITION -- DATA = 0
NOP ;NOTE 1
NOP
NOP
CLR SCL1 ;CLOCK = 0
OTSLP: RLC A ;SHIFT BIT
JNC BITLS
SETB SDA1 ;DATA = 1
JMP OTSL1 ;CONTINUE
BITLS: CLR SDA1 ;DATA = 0
OTSL1: SETB SCL1 ;CLOCK HI
NOP ;NOTE 1
NOP
NOP
CLR SCL1 ;CLOCK LOW
DJNZ R2,OTSLP ;DECREMENT COUNTER
SETB SDA1 ;TURN PIN INTO INPUT
NOP ;NOTE 1
SETB SCL1 ;CLOCK ACK
NOP ;NOTE 1
NOP
NOP
CLR SCL1
RET
;**********************************************************************
; THIS ROUTINE SENDS OUT CONTENTS OF ACCUMLATOR TO EEPROM
; without sending a START condition.
;**********************************************************************
OUT: MOV R2,#8 ;LOOP COUNT -- EQUAL TO BIT COUNT
OTLP: RLC A ;SHIFT BIT
JNC BITL
SETB SDA1 ;DATA = 1
JMP OTL1 ;CONTINUE
BITL: CLR SDA1 ;DATA = 0
OTL1: SETB SCL1 ;CLOCK HI
NOP ;NOTE 1
NOP
NOP
CLR SCL1 ;CLOCK LOW
DJNZ R2,OTLP ;DECREMENT COUNTER
SETB SDA1 ;TURN PIN INTO INPUT
NOP ;NOTE 1
SETB SCL1 ;CLOCK ACK
NOP ;NOTE 1
NOP
NOP
CLR SCL1
RET
STOP: CLR SDA1 ;STOP CONDITION SET DATA LOW
NOP ;NOTE 1
NOP
NOP
SETB SCL1 ;SET CLOCK HI
NOP ;NOTE 1
NOP
NOP
SETB SDA1 ;SET DATA HIGH
RET
;*******************************************************************
; THIS ROUTINE READS A BYTE OF DATA FROM EEPROM
; From EEPROM current address pointer.
; Returns the data byte in R1
;*******************************************************************
CREAD: MOV A,#RDCMD ;LOAD READ COMMAND
CALL OUTS ;SEND IT
CALL IN ;READ DATA
MOV R1,A ;STORE DATA
CALL STOP ;SEND STOP CONDITION
RET
;**********************************************************************
; THIS ROUTINE READS IN A BYTE FROM THE EEPROM
; and stores it in the accumulator
;**********************************************************************
IN: MOV R2,#8 ;LOOP COUNT
SETB SDA1 ;SET DATA BIT HIGH FOR INPUT
INLP: CLR SCL1 ;CLOCK LOW
NOP ;NOTE 1
NOP
NOP
NOP
SETB SCL1 ;CLOCK HIGH
CLR C ;CLEAR CARRY
JNB SDA1,INL1 ;JUMP IF DATA = 0
CPL C ;SET CARRY IF DATA = 1
INL1: RLC A ;ROTATE DATA INTO ACCUMULATOR
DJNZ R2,INLP ;DECREMENT COUNTER
CLR SCL1 ;CLOCK LOW
RET
;*********************************************************************
; This routine test for WRITE DONE condition
; by testing for an ACK.
; This routine can be run as soon as a STOP condition
; has been generated after the last data byte has been sent
; to the EEPROM. The routine loops until an ACK is received from
; the EEPROM. No ACK will be received until the EEPROM is done with
; the write operation.
;*********************************************************************
ACKTST: MOV A,#WTCMD ;LOAD WRITE COMMAND TO SEND ADDRESS
MOV R2,#8 ;LOOP COUNT -- EQUAL TO BIT COUNT
CLR SDA1 ;START CONDITION -- DATA = 0
NOP ;NOTE 1
NOP
NOP
CLR SCL1 ;CLOCK = 0
AKTLP: RLC A ;SHIFT BIT
JNC AKTLS
SETB SDA1 ;DATA = 1
JMP AKTL1 ;CONTINUE
AKTLS: CLR SDA1 ;DATA = 0
AKTL1: SETB SCL1 ;CLOCK HI
NOP ;NOTE 1
NOP
NOP
CLR SCL1 ;CLOCK LOW
DJNZ R2,AKTLP ;DECREMENT COUNTER
SETB SDA1 ;TURN PIN INTO INPUT
NOP ;NOTE 1
SETB SCL1 ;CLOCK ACK
NOP ;NOTE 1
NOP
NOP
JNB SDA1,EXIT ;EXIT IF ACK (WRITE DONE)
JMP ACKTST ;START OVER
EXIT: CLR SCL1 ;CLOCK LOW
CLR SDA1 ;DATA LOW
NOP ;NOTE 1
NOP
NOP
SETB SCL1 ;CLOCK HIGH
NOP
NOP
SETB SDA1 ;STOP CONDITION
RET
DELAY_STOP: ;terminating write process
MOV TMOD,#00000001B
MOV TH0,#50H
MOV TL0,#00H
SETB TR0
SAC:
JNB TF0,SAC
CLR TR0
CLR TF0
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -