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

📄 pgm.a51

📁 prepaid energy meter project
💻 A51
📖 第 1 页 / 共 3 页
字号:
         RET
; **********************************************************
; SOFTWARE VERSION OF THE POWER ON RESET
; **********************************************************
RESETLCD4:
         CLR         LCD_RS     ; LCD REGISTER SELECT LINE
         CLR         LCD_E      ; ENABLE LINE
         CLR         LCD_DB7    ; SET BIT PATTERN FOR...
         CLR         LCD_DB6    ; ... POWER-ON-RESET
         SETB        LCD_DB5
         SETB        LCD_DB4
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #4      ; DELAY 4 MILLISECONDS
         CALL       MDELAY
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #1      ; DELAY 1 MILLISECOND
         CALL       MDELAY
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #1      ; DELAY 1 MILLISECOND
         CALL       MDELAY
         CLR         LCD_DB4    ; SPECIFY 4-BIT OPERATION
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #1      ; DELAY 1 MILLISECOND
         CALL       MDELAY
         MOV         R4, #CONFIG; FUNCTION SET
         CALL       WRLCDCOM4
         MOV         R4, #08H   ; DISPLAY OFF
         CALL       WRLCDCOM4
         MOV         R4, #1     ; CLEAR DISPLAY, HOME CURSOR
         CALL       WRLCDCOM4
         MOV         R4,#ENTRYMODE  ; SET ENTRY MODE
         ACALL       WRLCDCOM4
 	   JMP INITLCD4

; **********************************************************
; SUB RECEIVES A COMMAND WORD TO THE LCD
; COMMAND MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDCOM4:
         CLR         LCD_E
         CLR         LCD_RS     ; SELECT READ COMMAND
         PUSH        ACC        ; SAVE ACCUMULATOR
         MOV         A, R4      ; PUT DATA BYTE IN ACC
         MOV         C, ACC.4   ; LOAD HIGH NIBBLE ON DATA BUS
         MOV         LCD_DB4, C ; ONE BIT AT A TIME USING...
         MOV         C, ACC.5   ; BIT MOVE OPERATOINS
         MOV         LCD_DB5, C
         MOV         C, ACC.6
         MOV         LCD_DB6, C
         MOV         C, ACC.7
         MOV         LCD_DB7, C
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         MOV         C, ACC.0   ; SIMILARLY, LOAD LOW NIBBLE
         MOV         LCD_DB4, C
         MOV         C, ACC.1
         MOV         LCD_DB5, C
         MOV         C, ACC.2
         MOV         LCD_DB6, C
         MOV         C, ACC.3
         MOV         LCD_DB7, C
         CLR         LCD_E
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         CALL MADELAY
         POP         ACC
         RET
; **********************************************************
; SUB TO RECEIVE A DATA WORD TO THE LCD
; DATA MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDDATA:
         CLR         LCD_E
         SETB        LCD_RS     ; SELECT READ DATA
             PUSH        ACC        ; SAVE ACCUMULATOR
         MOV         A, R4      ; PUT DATA BYTE IN ACC
         MOV         C, ACC.4   ; LOAD HIGH NIBBLE ON DATA BUS
         MOV         LCD_DB4, C ; ONE BIT AT A TIME USING...
         MOV         C, ACC.5   ; BIT MOVE OPERATOINS
         MOV         LCD_DB5, C
         MOV         C, ACC.6
         MOV         LCD_DB6, C
         MOV         C, ACC.7
         MOV         LCD_DB7, C
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         MOV         C, ACC.0   ; SIMILARLY, LOAD LOW NIBBLE
         MOV         LCD_DB4, C
         MOV         C, ACC.1
         MOV         LCD_DB5, C
         MOV         C, ACC.2
         MOV         LCD_DB6, C
         MOV         C, ACC.3
         MOV         LCD_DB7, C
         CLR         LCD_E
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         NOP
         NOP
         POP         ACC
         RET

; **********************************************************
; SUB TAKES THE STRING IMMEDIATELY FOLLOWING THE CALL AND
; DISPLAYS ON THE LCD. STRING MUST BE TERMINATED WITH A
; NULL (0).
; **********************************************************
LCD_MSG:
	CLR A			; Clear Index 
	MOVC A,@A+DPTR		; Get byte pointed by Dptr 
	INC DPTR			; Point to the next byte 
	JZ LCD_Msg9		; Return if found the zero (end of stringz) 
        CJNE A,#01H,Lcd_Msg1	; Check if is a Clear Command 
	MOV R4,A
	CALL WRLCDCOM4       	;If yes, RECEIVE it as command to LCD 
	JMP   LCD_MSG          	;Go get next byte from stringz 
                              
Lcd_Msg1: CJNE A,#0FFH,FLL	;Check for displaying full character
	MOV R4,A
	CALL WRLCDDATA
	JMP LCD_MSG
 FLL:	CJNE  A,#080h,$+3      	; Data or Address?  If => 80h then is address. 
	JC    Lcd_Msg_Data     	; Carry will be set if A < 80h (Data) 
	MOV R4,A
	CALL  WRLCDCOM4         ; Carry not set if A=>80, it is address 
	JMP Lcd_Msg          	; Go get next byte from stringz 
                             
Lcd_Msg_Data:                   ; 
	MOV R4,A
	CALL WRLCDDATA        	; It was data, RECEIVE it to Lcd 
	JMP  Lcd_Msg          		; Go get next byte from stringz 
Lcd_Msg9: 
	
	RET                    	; Return to Caller 

; **********************************************************
; 1 MILLISECOND DELAY ROUTINE
; **********************************************************

MDELAY:
         PUSH        ACC
         MOV         A,#0A6H
MD_OLP:
         INC         A
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         JNZ         MD_OLP
         NOP
         POP         ACC
         RET
MADELAY:
         PUSH        ACC
         MOV         A,#036H
MAD_OLP:
         INC         A
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         JNZ         MAD_OLP
         NOP
         POP         ACC
         RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DELAYS:                       ;One second delay routine
  MOV R6, #00H               ;put 0 in register R6 (R6 = 0)
   MOV R5, #04H              ;put 5 in register R5 (R5 = 4)
LOOPB:
   INC R6                     ;increase R6 by one (R6 = R6 +1)
   ACALL DELAYMS              ;call the routine above. It will run and return to here. 
   MOV A, R6                  ;move value in R6 to A                    
   JNZ LOOPB                  ;if A is not 0, go to LOOPB
  DEC R5                     ;decrease R5 by one. (R5 = R5 -1)
  MOV A, R5                  ;move value in R5 to A
   JNZ LOOPB                  ;if A is not 0 then go to LOOPB. 
  RET
;**************************************************************************
DELAYMS:                      ;millisecond delay routine
;                             ;
   MOV R7,#00H                ;put value of 0 in register R7
LOOPA:                          
   INC R7                     ;increase R7 by one (R7 = R7 +1)
   MOV A,R7                   ;move value in R7 to Accumlator (also known as A)
   CJNE A,#0FFH,LOOPA         ;compare A to FF hex (256). If not equal go to LOOPA
   RET                        ;return to the point that this routine was called from
;************************************************************************** 

;***********************************************************************
; 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
;*********************************************************************	
 END
   
 



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -