📄 vcg21.asm
字号:
BTFSS STATUS,Z
GOTO EJUMP8
; CURSOR AT 10TH POSITION
SWAPF DAY,0 ; GET 10'S DAYS
ANDLW 0x0F
ADDLW 1 ; INCREMENT 10'S DAYS
MOVWF TEMP
SUBLW 4
BTFSC STATUS,Z ; IS 10'S DAYS=3 ?
CLRF TEMP ; RESET 10'S DAYS
SWAPF TEMP,1
MOVF DAY,0
ANDLW 0x0F
ADDWF TEMP,0
MOVWF DAY ; SET 10'S DAYS
GOTO ENDEDIT
EJUMP8: ;****** ADJUST DAYS
MOVLW .11
SUBWF CURSOR,0 ; CURSOR AT 11TH POSITION
BTFSS STATUS,Z
GOTO EJUMP9
MOVF DAY,0 ; GET DAYS
ANDLW 0x0F
ADDLW 1 ; INCREMENT DAYS
MOVWF TEMP
SUBLW 0x0A
BTFSC STATUS,Z ; IS DAYS=10 ?
CLRF TEMP ; RESET DAYS
MOVF DAY,0
ANDLW 0xF0
ADDWF TEMP,0
MOVWF DAY ; SET DAYS
GOTO ENDEDIT
EJUMP9: ;****** ADJUST 10'S MONTHS
MOVLW .13
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP10
; CURSOR AT 13TH POSITION
SWAPF MONTH,0 ; GET 10'S MONTHS
ANDLW 0x0F
ADDLW 1 ; INCREMENT 10'S MONTHS
MOVWF TEMP
SUBLW 2
BTFSC STATUS,Z ; IS 10'S MONTHS=2 ?
CLRF TEMP ; RESET 10'S MONTHS
SWAPF TEMP,1
MOVF MONTH,0
ANDLW 0x0F
ADDWF TEMP,0
MOVWF MONTH ; SET 10'S MONTHS
GOTO ENDEDIT
EJUMP10: ;****** ADJUST MONTHS
MOVLW .14
SUBWF CURSOR,0 ; 14TH CURSOR POSITION
BTFSS STATUS,Z
GOTO EJUMP11
MOVF MONTH,0 ; GET MONTHS
ANDLW 0x0F
ADDLW 1 ; INCREMENT MONTHS
MOVWF TEMP
SUBLW 0x0A
BTFSC STATUS,Z ; IS MONTHS=10 ?
CLRF TEMP ; RESET MONTHS
MOVF MONTH,0
ANDLW 0xF0
ADDWF TEMP,0
MOVWF MONTH ; SET MONTHS
GOTO ENDEDIT
EJUMP11: ;****** ADJUST 10'S YEARS
MOVLW .16
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP12
; CURSOR AT 16TH POSITION
SWAPF YEAR,0 ; GET 10'S YEARS
ANDLW 0x0F
ADDLW 1 ; INCREMENT 10'S YEARS
MOVWF TEMP
SUBLW .10
BTFSC STATUS,Z ; IS 10'S YEARS=10 ?
CLRF TEMP ; RESET 10'S YEARS
SWAPF TEMP,1
MOVF YEAR,0
ANDLW 0x0F
ADDWF TEMP,0
MOVWF YEAR ; SET 10'S YEARS
GOTO ENDEDIT
EJUMP12: ;****** ADJUST YEARS
MOVLW .17
SUBWF CURSOR,0 ; 17TH CURSOR POSITION
BTFSS STATUS,Z
GOTO EJUMP13
MOVF YEAR,0 ; GET YEARS
ANDLW 0x0F
ADDLW 1 ; INCREMENT YEARS
MOVWF TEMP
SUBLW 0x0A
BTFSC STATUS,Z ; IS YEARS=10 ?
CLRF TEMP ; RESET YEARS
MOVF YEAR,0
ANDLW 0xF0
ADDWF TEMP,0
MOVWF YEAR ; SET YEARS
EJUMP13: ;****** ADJUST USER CHAR1
MOVLW .19
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP14 ; DON'T DO IF NOT AT CURSOR POS
INCF CHAR1,1 ; INCREMENT CHARCATER
MOVLW 0x26 ; MAX CHARACTER NUMBER
SUBWF CHAR1,0
BTFSC STATUS,Z
CLRF CHAR1 ;SET CHAR BACK TO
GOTO ENDEDIT
EJUMP14: ;****** ADJUST USER CHAR2
MOVLW .20
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP15 ; DON'T DO IF NOT AT CURSOR POS
INCF CHAR2,1 ; INCREMENT CHARCATER
MOVLW 0x26 ; MAX CHARACTER NUMBER
SUBWF CHAR2,0
BTFSC STATUS,Z
CLRF CHAR2 ;SET CHAR BACK TO
GOTO ENDEDIT
EJUMP15: ;****** ADJUST USER CHAR3
MOVLW .21
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP16 ; DON'T DO IF NOT AT CURSOR POS
INCF CHAR3,1 ; INCREMENT CHARCATER
MOVLW 0x26 ; MAX CHARACTER NUMBER
SUBWF CHAR3,0
BTFSC STATUS,Z
CLRF CHAR3 ;SET CHAR BACK TO
GOTO ENDEDIT
EJUMP16: ;****** ADJUST USER CHAR4
MOVLW .22
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP17 ; DON'T DO IF NOT AT CURSOR POS
INCF CHAR4,1 ; INCREMENT CHARCATER
MOVLW 0x26 ; MAX CHARACTER NUMBER
SUBWF CHAR4,0
BTFSC STATUS,Z
CLRF CHAR4 ;SET CHAR BACK TO
GOTO ENDEDIT
EJUMP17: ;****** ADJUST USER CHAR5
MOVLW .23
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP18 ; DON'T DO IF NOT AT CURSOR POS
INCF CHAR5,1 ; INCREMENT CHARCATER
MOVLW 0x26 ; MAX CHARACTER NUMBER
SUBWF CHAR5,0
BTFSC STATUS,Z
CLRF CHAR5 ;SET CHAR BACK TO
GOTO ENDEDIT
EJUMP18: ;****** ADJUST USER CHAR6
MOVLW .24
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP19 ; DON'T DO IF NOT AT CURSOR POS
INCF CHAR6,1 ; INCREMENT CHARCATER
MOVLW 0x26 ; MAX CHARACTER NUMBER
SUBWF CHAR6,0
BTFSC STATUS,Z
CLRF CHAR6 ;SET CHAR BACK TO
GOTO ENDEDIT
EJUMP19: ;****** ADJUST USER CHAR7
MOVLW .25
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP20 ; DON'T DO IF NOT AT CURSOR POS
INCF CHAR7,1 ; INCREMENT CHARCATER
MOVLW 0x26 ; MAX CHARACTER NUMBER
SUBWF CHAR7,0
BTFSC STATUS,Z
CLRF CHAR7 ;SET CHAR BACK TO
GOTO ENDEDIT
EJUMP20: ;****** ADJUST USER CHAR8
MOVLW .26
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP21 ; DON'T DO IF NOT AT CURSOR POS
INCF CHAR8,1 ; INCREMENT CHARCATER
MOVLW 0x26 ; MAX CHARACTER NUMBER
SUBWF CHAR8,0
BTFSC STATUS,Z
CLRF CHAR8 ;SET CHAR BACK TO
GOTO ENDEDIT
EJUMP21: ;****** ADJUST USER CHAR9
MOVLW .27
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP22 ; DON'T DO IF NOT AT CURSOR POS
INCF CHAR9,1 ; INCREMENT CHARCATER
MOVLW 0x26 ; MAX CHARACTER NUMBER
SUBWF CHAR9,0
BTFSC STATUS,Z
CLRF CHAR9 ;SET CHAR BACK TO
GOTO ENDEDIT
EJUMP22: ;****** ADJUST USER CHAR10
MOVLW .28
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP23 ; DON'T DO IF NOT AT CURSOR POS
INCF CHAR10,1 ; INCREMENT CHARCATER
MOVLW 0x26 ; MAX CHARACTER NUMBER
SUBWF CHAR10,0
BTFSC STATUS,Z
CLRF CHAR10 ;SET CHAR BACK TO
GOTO ENDEDIT
EJUMP23:
ENDEDIT:
GOTO DISPLAY
WRITEDATA:
CALL START
MOVLW C1307W ; WRITE TO 1307
MOVWF SENDBUF
CALL SENDBYTE
MOVLW 0 ; ADDRESS reg 0
MOVWF SENDBUF
CALL SENDBYTE
MOVF SEC,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF MIN,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF HOUR,0
MOVWF SENDBUF
CALL SENDBYTE
CLRF SENDBUF ; DUMMY DATA FOR DAY OF WEEK
CALL SENDBYTE
MOVF DAY,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF MONTH,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF YEAR,0
MOVWF SENDBUF
CALL SENDBYTE
CLRF SENDBUF ; DUMMY DTAA FOR CONTROL REG
CALL SENDBYTE
MOVF CHAR1,0 ; START CHAR DATA AT RAM ADDRESS 8
MOVWF SENDBUF
CALL SENDBYTE
MOVF CHAR2,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF CHAR3,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF CHAR4,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF CHAR5,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF CHAR6,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF CHAR7,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF CHAR8,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF CHAR9,0
MOVWF SENDBUF
CALL SENDBYTE
MOVF CHAR10,0
MOVWF SENDBUF
CALL SENDBYTE
CALL STOP
GOTO BEGIN ; RETURN TO NORMAL DISPLAY MODE
;*******************************************************************
; I2C ROUTINES
;***************************** SET SDA BIT HIGH (TRI-STATE)
SET_SDA:
BSF STATUS, RP0 ; select bank 1
BSF TRISB,P_SDA ; SET P_SDA BIT IN TRISB=1
BCF STATUS, RP0 ; SELECT BANK 0
RETURN
;***************************** SET SCL BIT HIGH (TRI-STATE)
SET_SCL:
BSF STATUS, RP0 ; select bank 1
BSF TRISB,P_SCL ; SET P_SCL BIT IN TRISB=1
BCF STATUS, RP0 ; SELECT BANK 0
RETURN
;***************************** SET SDA BIT LOW
CLR_SDA:
BCF PORTB,P_SDA
BSF STATUS, RP0 ; select bank 1
BCF TRISB,P_SDA ; CLEAR P_SDA BIT IN TRISB=0
BCF STATUS, RP0 ; SELECT BANK 0
RETURN
;***************************** SET SCL BIT LOW
CLR_SCL:
BCF PORTB,P_SCL
BSF STATUS, RP0 ; select bank 1
BCF TRISB,P_SCL ; CLEAR P_SCL BIT IN TRISB=0
BCF STATUS, RP0 ; SELECT BANK 0
RETURN
;******************************* I2C STABLE BUS CONDITION
STABLE:
CALL SET_SDA
CALL SET_SCL
RETURN
;******************************* I2C START CONDITION
START:
CALL SET_SCL
CALL SET_SDA
CALL CLR_SDA
CALL CLR_SCL
RETURN
;******************************* I2C STOP CONDITION
STOP:
CALL CLR_SDA
CALL SET_SCL
CALL SET_SDA
CALL SET_SCL
RETURN
;******************************* I2C SEND BYTE
; PASS BYTE TO SEND IN SENDBUF REG
SENDBYTE:
CLRWDT ;CLEAR WATCHDOG
CALL CLR_SCL
BTFSC SENDBUF,7 ; SET OR CLEAR BIT7 :
CALL SET_SDA
BTFSS SENDBUF,7
CALL CLR_SDA
CALL SET_SCL ; TOGGLE SCL :
CALL CLR_SCL
BTFSC SENDBUF,6 ; SET OR CLEAR BIT6 :
CALL SET_SDA
BTFSS SENDBUF,6
CALL CLR_SDA
CALL SET_SCL ; TOGGLE SCL :
CALL CLR_SCL
BTFSC SENDBUF,5 ; SET OR CLEAR BIT5 :
CALL SET_SDA
BTFSS SENDBUF,5
CALL CLR_SDA
CALL SET_SCL ; TOGGLE SCL :
CALL CLR_SCL
BTFSC SENDBUF,4 ; SET OR CLEAR BIT4 :
CALL SET_SDA
BTFSS SENDBUF,4
CALL CLR_SDA
CALL SET_SCL ; TOGGLE SCL :
CALL CLR_SCL
BTFSC SENDBUF,3 ; SET OR CLEAR BIT3 :
CALL SET_SDA
BTFSS SENDBUF,3
CALL CLR_SDA
CALL SET_SCL ; TOGGLE SCL :
CALL CLR_SCL
BTFSC SENDBUF,2 ; SET OR CLEAR BIT2 :
CALL SET_SDA
BTFSS SENDBUF,2
CALL CLR_SDA
CALL SET_SCL ; TOGGLE SCL :
CALL CLR_SCL
BTFSC SENDBUF,1 ; SET OR CLEAR BIT1 :
CALL SET_SDA
BTFSS SENDBUF,1
CALL CLR_SDA
CALL SET_SCL ; TOGGLE SCL :
CALL CLR_SCL
BTFSC SENDBUF,0 ; SET OR CLEAR BIT0 :
CALL SET_SDA
BTFSS SENDBUF,0
CALL CLR_SDA
CALL SET_SCL ; TOGGLE SCL :
CALL CLR_SCL
CALL SET_SDA ; ALLOW SLAVE TO RETURN ACK
CALL SET_SCL ; BUT JUST IGNORE IT.
CALL CLR_SCL
RETURN
;***************************** READ SINGLE BYTE
; RETURN BYTE IN GETBUF VARIABLE
READBYTE:
CLRWDT ;CLEAR WATCHDOG
CALL CLR_SCL
CALL SET_SDA
CALL SET_SCL
BTFSC PORTB,P_SDA
BSF GETBUF,7
BTFSS PORTB,P_SDA
BCF GETBUF,7
CALL CLR_SCL
CALL SET_SCL
BTFSC PORTB,P_SDA
BSF GETBUF,6
BTFSS PORTB,P_SDA
BCF GETBUF,6
CALL CLR_SCL
CALL SET_SCL
BTFSC PORTB,P_SDA
BSF GETBUF,5
BTFSS PORTB,P_SDA
BCF GETBUF,5
CALL CLR_SCL
CALL SET_SCL
BTFSC PORTB,P_SDA
BSF GETBUF,4
BTFSS PORTB,P_SDA
BCF GETBUF,4
CALL CLR_SCL
CALL SET_SCL
BTFSC PORTB,P_SDA
BSF GETBUF,3
BTFSS PORTB,P_SDA
BCF GETBUF,3
CALL CLR_SCL
CALL SET_SCL
BTFSC PORTB,P_SDA
BSF GETBUF,2
BTFSS PORTB,P_SDA
BCF GETBUF,2
CALL CLR_SCL
CALL SET_SCL
BTFSC PORTB,P_SDA
BSF GETBUF,1
BTFSS PORTB,P_SDA
BCF GETBUF,1
CALL CLR_SCL
CALL SET_SCL
BTFSC PORTB,P_SDA
BSF GETBUF,0
BTFSS PORTB,P_SDA
BCF GETBUF,0
CALL CLR_SCL
RETURN
;******************************** SEND ACK
SEND_ACK:
CALL CLR_SCL
CALL CLR_SDA ; SEND ACK TO SLAVE
CALL SET_SCL ; WHICH ENDS READ PROCESS
CALL CLR_SCL
RETURN
;******************************** SEND NEG ACK
SEND_NOTACK:
CALL CLR_SCL
CALL SET_SDA ; SEND NEG ACK TO SLAVE
CALL SET_SCL ; WHICH ENDS READ PROCESS
CALL CLR_SCL
RETURN
;***************************************** STV5730 BUS ROUTINES
SET_DATA_HIGH: ; SET DATA LINE HIGH
BSF PORTB,P_DATA
RETURN
SET_DATA_LOW: ; SET DATA LINE LOW
BCF PORTB,P_DATA
RETURN
SET_CSN_HIGH: ; SET CSN LINE HIGH
BSF PORTB,P_CSN
RETURN
SET_CSN_LOW: ; SET CSN LINE LOW
BCF PORTB,P_CSN
RETURN
SET_CLK_HIGH: ; SET CLK LINE HIGH
BSF PORTB,P_CLK
RETURN
SET_CLK_LOW: ; SET CLK LINE LOW
BCF PORTB,P_CLK
RETURN
SEND16BYTE: ; SEND A 16 BIT WORD TO 5730
CLRWDT ; CLEAR WATCHDOG
;********* DATA IS PASSED IN "BYTE1" & "BYTE2"
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CSN_HIGH
CALL SET_CSN_LOW
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE1,7 ; IF BIT7 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE1,6 ; IF BIT6 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE1,5 ; IF BIT5 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE1,4 ; IF BIT4 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE1,3 ; IF BIT3 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE1,2 ; IF BIT2 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE1,1 ; IF BIT1 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE1,0 ; IF BIT0 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE2,7 ; IF BIT7 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE2,6 ; IF BIT6 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE2,5 ; IF BIT5 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE2,4 ; IF BIT4 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE2,3 ; IF BIT3 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE2,2 ; IF BIT2 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE2,1 ; IF BIT1 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CLK_LOW
CALL SET_DATA_LOW ; ASSUME DATA IS LOW
BTFSC BYTE2,0 ; IF BIT0 IS HIGH THEN DO
CALL SET_DATA_HIGH
CALL SET_CLK_HIGH
CALL SET_CSN_HIGH ; END OF DATA
RETURN
END ; END OF PROGRAM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -