📄 voting.a51
字号:
CALL OUTS ;SEND IT
MOV A,MEMORY ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
CALL CREAD ;GET DATA BYTE
MOV A,R1
MOV @R0,A
INC R0
INC MEMORY
DJNZ R3,LABEL
;MOV R3,#10h
;MOV R0,#32h
;MOV DPTR,#002h
;LABEL:ACALL EEPROM_READ
;MOV @R0,A
;INC R0
;INC DPTR
;DJNZ R3,LABEL
RET
;************** ROUTINE 8: INITIALIZING EEPROM LOCATIONS WHERE TOTAL COUNT HAS TO BE SAVED, BY ZERO******
MEMORYINIT:
MOV A,#WTCMD ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,#84H ;GET BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,#00h ;GET DATA
CALL OUT ;SEND IT
CALL STOP ;SEND STOP CONDITION
ACALL DELAY_STOP
MOV A,#WTCMD ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,#85H ;GET BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,#00h ;GET DATA
CALL OUT ;SEND IT
CALL STOP ;SEND STOP CONDITION
ACALL DELAY_STOP
RET
;************** ROUTINE 9: INITIALIZING EEPROM LOCATIONS WHERE INDIVIDUAL COUNT HAS TO BE SAVED, BY ZERO******
MEMINIT:
MOV R3,#10h
MOV R4,#02h
LABELM:
MOV A,#WTCMD ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,R4 ;GET BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,#00h ;GET DATA
CALL OUT ;SEND IT
CALL STOP ;SEND STOP CONDITION
ACALL DELAY_STOP
INC R4
DJNZ R3,LABELM
RET
;***********************************************************************
; EEPROM ROUTINES
;***********************************************************************
;***********************************************************************
; THIS ROUTINE SENDS OUT CONTENTS OF THE ACCUMULATOR
; to the EEPROM and includes START condition. Refer to the data sheets
; for discussion of START and STOP conditions.
;***********************************************************************
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
;*********************************************************************
;********************** EEPROM ROUTINES COMMON TO ALL ***********************
EEPROM_READ: ;read from eeprom
ACALL I2C_START
ACALL EEPROM_WRITE_ADDR
ACALL ACK
MOV A,DPH
ACALL I2C_WRITE
ACALL ACK
MOV A,DPL
ACALL I2C_WRITE
ACALL ACK
ACALL I2C_START
ACALL EEPROM_READ_ADDR
ACALL ACK
ACALL I2C_READ
ACALL NO_ACK
ACALL I2C_STOP
RET
EEPROM_WRITE: ;write in to eeprom
ACALL I2C_START
ACALL EEPROM_WRITE_ADDR
ACALL ACK
MOV A,DPH
ACALL I2C_WRITE
ACALL ACK
MOV A,DPL
ACALL I2C_WRITE
ACALL ACK
MOV A,B
ACALL I2C_WRITE
ACALL ACK
ACALL I2C_STOP
ACALL DELAY_STOP
RET
I2C_READ: ;reading 8 bits from i2c device
MOV R7,#8
GFD:
;SETB SDA
;SETB SCL
;MOV C,SDA
RLC A
;CLR SCL
DJNZ R7,GFD
RET
I2C_WRITE: ;writing 8 bits in to i2c device
MOV R7,#8
WRITING:
RLC A
;MOV SDA,C
ACALL CLOCK
DJNZ R7,WRITING
RET
I2C_START: ;start of i2c routine
;SETB SCL
;SETB SDA
;CLR SDA
;CLR SCL
RET
I2C_STOP: ;end of i2c routine
;SETB SCL
;CLR SDA
;SETB SDA
;CLR SCL
RET
CLOCK: ;synchronizing clock
;SETB SCL
NOP
NOP
;CLR SCL
RET
ACK: ;acknowledge from transmitter or receiver
;CLR SDA
;SETB SCL
;CLR SCL
RET
NO_ACK: ;no acknowledge from transmitter or receiver
;SETB SDA
;SETB SCL
;CLR SCL
RET
EEPROM_READ_ADDR: ;A2,A1,A0 are zero
MOV A,#10100001B
ACALL I2C_WRITE
RET
EEPROM_WRITE_ADDR: ;A2,A1,A0 are zero
MOV A,#10100000B
ACALL I2C_WRITE
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
;******************EEPROM ROUTINES COMMON TO ALL, END HERE********************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -