⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init_e2p.asm

📁 speedometer cum odometer with asm and hex files
💻 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 + -