📄 init_e2p.asm
字号:
;******************************************************************************************************
; INIT_EEPROM (PROGRAM INITIALIZES I2C EEPROM)
; Author: Arun Kumar Vadla
;******************************************************************************************************
; XTAL Freq = 12 MHz
$MOD51
LCD EQU P1 ; P1.0 .....P1.7, PORT1 USED AS DATA BUS
RS EQU P3.2
RW EQU P3.3
EN EQU P3.7
DISTO EQU P3.4 ; TIMER 0 INPUT FOR DISTANCE-ODOMETER
SPEDO EQU P3.5 ; TIMER 1 INPUT FOR SPEEDOMETER
SCL EQU P3.0 ;SCL=PIN6
SDA EQU P3.1 ;SDA=PIN5
EEPROMW EQU 10100000B ; SLAVE ADDRESS OF EEPROM 1010 000 + 0 TO WRITE
EEPROMR EQU 10100001B ; SLAVE ADDRESS OF EEPROM 1010 000 + 1 TO READ
DSEG
ORG 020H ; BIT-ADDRESSABLE RAM
FLAGS: DS 1 ; VARIABLES FOR I2C PROTOCOL
LASTREAD BIT FLAGS.0
SQW BIT FLAGS.4
ACK BIT FLAGS.5
BUS_FLT BIT FLAGS.6
_2W_BUSY BIT FLAGS.7
OK BIT 1
STORE BIT 1
BITCNT: DS 1
BYTECNT: DS 1
POINT: DS 1 ; DISTANCE VARIABLES
KM: DS 1
TKM: DS 1
HKM: DS 1
KKM: DS 1
TKKM: DS 1
TOTAL: DS 1
; ***MACRO'S***
SCL_HIGH MACRO
SETB SCL ; SET SCL HIGH
JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL
ENDM
CONVERT MACRO
ORL A,#30H ; CONVERT TO ASCII BY ADDING 30H
ENDM
CSEG ; CODE BEGINS HERE
ORG 0000H ; ON RESET
SJMP MAIN
;ORG 000BH ;Timer Interrupt0
;LJMP UPDATE
MAIN: MOV SP,#70H ; MOVE STACK POINTER TO ADDRESS 70H OF RAM
LCALL PWR_DELAY ;LCD POWER ON DELAY
LCALL INIT ;INITIALIZE LCD
TRY_AGAIN:MOV POINT,#00H
MOV KM,#00H
MOV TKM,#00H
MOV HKM,#00H
MOV KKM,#00H
MOV TKKM,#00H
LCALL SEND2EEPROM
LCALL DELAY
MOV POINT,#1H
MOV KM,#2H
MOV TKM,#3H
MOV HKM,#4H
MOV KKM,#5H
MOV TKKM,#6H
LCALL READEEPROM
LCALL SEND2LCD ; DISPLAY INITIAL/PREVIOUS VALUES
MOV A,POINT
JNZ TRY_AGAIN
SJMP $
SEND2LCD:
MOV A,#0C0H ; LINE 1
LCALL CMD
MOV A,TKKM
CONVERT
LCALL DAT
MOV A,KKM
CONVERT
LCALL DAT
MOV A,HKM
CONVERT
LCALL DAT
MOV A,TKM
CONVERT
LCALL DAT
MOV A,KM
CONVERT
LCALL DAT
MOV A,#'.'
LCALL DAT
MOV A,POINT
CONVERT
LCALL DAT
RET
;****************************LCD SUBROUTINES****************************************
READY:SETB EN ;H->L PULSE ON E
CLR RS ;RS=0 CMD
SETB RW ;RW=1 FOR READ
SETB P1.7 ;D7 AS INPUT
JB P1.7,READY
CLR EN
CLR RW
RET
;****************************LCD SUBROUTINES****************************************
DAT: SETB EN ;H->L PULSE ON E
SETB RS ;RS=1 DATA
CLR RW ;RW=0 FOR WRITE
MOV LCD,A ;MOVE ACC.DATA TO PORT
CLR EN
NOP
LCALL READY
RET
;****************************LCD SUBROUTINES****************************************
CMD: SETB EN ;H->L PULSE ON E
CLR RS ;RS=0 FOR COMMAND
CLR RW ;RW=0 FOR WRITE
MOV LCD,A ;MOVE ACC. DATA TO PORT
CLR EN
NOP
LCALL READY
RET
;****************************LCD SUBROUTINES****************************************
INIT: MOV A,#030H ;INITIALIZE LCD BY SENDING 30H THREE TIMES.
LCALL CMD
ACALL DDELAY ;INITIAL DELAY 4.1MSEC
MOV A,#030H
LCALL CMD
ACALL DDELAY
MOV A,#030H
LCALL CMD
ACALL DDELAY
MOV A,#038H ; INITIALIZE, 2-LINES, 5X7 MATRIX.
LCALL CMD
ACALL DDELAY
MOV A,#0CH ; INVISIBLE CURSOR ON;
LCALL CMD
MOV A,#01H ; CLEAR LCD SCREEN
LCALL CMD
MOV A,#06H ; SHIFT CURSOR RIGHT
LCALL CMD
MOV A,#82H ; LINE 1
LCALL CMD
MOV DPTR,#MSG_1
LINE1: CLR A
MOVC A,@A+DPTR
JZ DONE
ACALL DAT
INC DPTR
SJMP LINE1
DONE: RET
;****************************LCD SUBROUTINES****************************************
CLEAR: MOV A,#01H
LCALL CMD
RET
;****************************LCD SUBROUTINES****************************************
DDELAY: MOV R5,#41D ; 4.1 mS DELAY
QT2: MOV R6,#50D
QT1: DJNZ R6,QT1
DJNZ R5,QT2
RET
;***********************************************************************
; I2C - SERIAL EEPROM ROUTINES
;***********************************************************************
;**********************************************************
; THIS SUB READS ONE BYTE OF DATA FROM THE EEPROM
;**********************************************************
READ_BYTE:
MOV BITCNT,#08H; SET COUNTER FOR 8-BITS DATA
MOV A,#00H
SETB SDA ; SET SDA HIGH TO ENSURE LINE
; FREE
READ_BITS:
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
MOV C,SDA ; MOVE DATA BIT INTO CARRY
RLC A ; ROTATE CARRY-BIT INTO ACC.0
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
DJNZ BITCNT,READ_BITS
; LOOP FOR 8-BITS
JB LASTREAD,ACKN
; CHECK TO SEE IF THIS IS
; THE LAST READ
CLR SDA ; IF NOT LAST READ SEND ACK-BIT
ACKN:
SCL_HIGH ; PULSE SCL TO TRANSMIT ACKNOWLEDGE
CLR SCL ; OR NOT ACKNOWLEDGE BIT
RET
;**********************************************************
; SUB SENDS START CONDITION
;**********************************************************
SEND_START:
SETB _2W_BUSY ; INDICATE THAT 2-WIRE
CLR ACK ; OPERATION IS IN PROGRESS
CLR BUS_FLT ; CLEAR STATUS FLAGS
JNB SCL,FAULT
JNB SDA,FAULT
SETB SDA ; BEGIN START CODITION
SCL_HIGH
CLR SDA
ACALL DEELAY
CLR SCL
RET
FAULT:
SETB BUS_FLT
RET
;**********************************************************
; SUB SENDS STOP CONDITION
;**********************************************************
SEND_STOP:
CLR SDA
SCL_HIGH
SETB SDA
CLR _2W_BUSY
RET
;**********************************************************
; SUB DELAYS THE BUS
;**********************************************************
DEELAY:
NOP ; DELAY FOR BUS TIMING
RET
; *********************************************************
; THIS SUB SENDS 1 BYTE OF DATA TO THE EEPROM
; *********************************************************
SEND_BYTE:
MOV BITCNT,#08H; SET COUNTER FOR 8-BITS
SB_LOOP:
JNB ACC.7,NOTONE ; CHECK TO SEE IF BIT-7 OF
SETB SDA ; ACC IS A 1, AND SET SDA HIGH
JMP ONE
NOTONE:
CLR SDA ; CLR SDA LOW
ONE:
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
RL A ; ROTATE ACC LEFT 1-BIT
CLR SCL ; TRANSITION SCL LOW-TO-HIGH
DJNZ BITCNT,SB_LOOP ; LOOP FOR 8-BITS
SETB SDA ; SET SDA HIGH TO LOOK FOR
SCL_HIGH ; ACKNOWLEDGE PULSE
CLR ACK
JNB SDA,SB_EX ; CHECK FOR ACK OR NOT ACK
SETB ACK ; SET ACKNOWLEDGE FLAG FOR
; NOT ACK
SB_EX:
ACALL DEELAY ; DELAY FOR AN OPERATION
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
ACALL DEELAY ; DELAY FOR AN OPERATION
RET
; *********************************************************************
; SUB READS FROM THE EEPROM AND WRITES IT TO THE SCRATCHPAD MEMORY
; *********************************************************************
READEEPROM:
MOV R1,#POINT ; START FROM POINT STORAGE LOCATION
MOV BYTECNT,#00H
CLR LASTREAD
LCALL SEND_START
MOV A,#EEPROMW
LCALL SEND_BYTE
MOV A,#00H ; POINT TO 00H ADDRESS OF EEPROM
LCALL SEND_BYTE
LCALL SEND_STOP
LCALL SEND_START
MOV A,#EEPROMR ; READ COMMAND
LCALL SEND_BYTE
READ_LOOP:
MOV A,BYTECNT
CJNE A,#06H,NOT_LAST ; CHECK FOR THE LAST BYTE
SETB LASTREAD
NOT_LAST:
LCALL READ_BYTE
MOV @R1,A
MOV A,BYTECNT
CJNE A,#00H,NOT_FIRST
MOV A,@R1
MOV @R1,A
NOT_FIRST:
INC R1 ;** INC RAM LOCATION **
INC BYTECNT
MOV A,BYTECNT
CJNE A,#07H,READ_LOOP ; CHECK FOR 7th BYTE,IF 7th BYTE THEN STOP TRANSFER
LCALL SEND_STOP
RET
;****************************************************************************************************************************
SEND2EEPROM:
LCALL SEND_START ; SEND 2WIRE START CONDITION
MOV A,#EEPROMW ; LOAD EEPROM WRITE COMMAND
LCALL SEND_BYTE ; SEND WRITE COMMAND
MOV A,#00H ; SET EEPROM DATA POINTER TO 00H (ADDRESS LOCATION)
LCALL SEND_BYTE
MOV A,POINT ; Send POINT
LCALL SEND_BYTE
MOV A,KM ; Send KM
LCALL SEND_BYTE
MOV A,TKM ; Send TKM
LCALL SEND_BYTE
MOV A,HKM ; Send HKM
LCALL SEND_BYTE
MOV A,KKM ; Send KKM
LCALL SEND_BYTE
MOV A,TKKM ; Send TKM
LCALL SEND_BYTE
LCALL SEND_STOP ; SEND 2WIRE STOP CONDITION
RET
;************************************************************************************
PWR_DELAY: ; 15 mSec DELAY FOR LCD TO INTIALIZE AFTER POWER-ON
MOV R4,#30D
H2: MOV R3,#250D
H1: DJNZ R3,H1
DJNZ R4,H2
RET
;************************************************************************************
DELAY: ;5 SECS
MOV R0,#50D
RZ3: MOV R1,#100D
RZ1: MOV R2,#250D
RZ2: NOP
NOP
DJNZ R2,RZ2
DJNZ R1,RZ1
DJNZ R0,RZ3
RET
ORG 01F4H
MSG_1: DB 'INIT-EEPROM',00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -