📄 vcg21.asm
字号:
;**********************************************************************
; TITLE : Video Clock Generator Rev2.1
;**********************************************************************
; Filename : VCG21.ASM
; Date Started : 24/8/99
; Last edit : 24/8/99
; File Version : 2.1
;
; Author : David L. Jones - Tronnort Technology
;**********************************************************************
;
; Files required:
; p16F84.inc
;
;**********************************************************************
; CHANGES FROM Rev2.0 :
; - TURNED TEXT BORDERS ON
;**********************************************************************
; Notes:
; USES APPROX 40KHz RC OSC.
; For use with the Rev2.0 STV5730 design.
; as published in Electronics Australia Aug'99
;**********************************************************************
list p=16F84 ; list directive to define processor
#include <p16F84.inc> ; processor specific variable definitions
__CONFIG _CP_ON & _WDT_ON & _PWRTE_ON & _RC_OSC
;***** VARIABLE DEFINITIONS
#DEFINE WRITE 0 ; I2C WRITE BIT
#DEFINE READ 1 ; I2C READ BIT
#DEFINE C1307W 0xD0 ; DS1307 WRITE ADDRESS
#DEFINE C1307R 0xD1 ; DS1307 READ ADDRESS
;PORT PIN DEFINITIONS
#DEFINE P_MODE 0 ; MODE BUTTON
#DEFINE P_SCL 2 ; SCL PORT NUMBER
#DEFINE P_SDA 3 ; SDA PORT NUMBER
#DEFINE P_CSN 4 ; CSN PORT NUMBER
#DEFINE P_CLK 5 ; CLK PORT NUMBER
#DEFINE P_DATA 6 ; DATA PORT NUMBER
#DEFINE P_SET 7 ; SET BUTTON
SENDBUF EQU 0x10 ; BYTE TO BE SENT
GETBUF EQU 0x11 ; BYTE RECEIVED
HOUR EQU 0x12
MIN EQU 0x13
SEC EQU 0x14
DAY EQU 0x15
MONTH EQU 0x16
YEAR EQU 0x17
TEMP EQU 0x18 ; TEMP VARIABLE
CURSOR EQU 0x19 ; SCREEN CURSOR POSITION (>0=EDIT MODE)
BYTE2 EQU 0x1A ; FIRST BYTE (MSB) OF 5730 DATA
BYTE1 EQU 0x1B ; SECOND BYTE (LSB) OF 5730 DATA
CHAR1 EQU 0x1C ; 1ST USER DEFINED CHARACTER
CHAR2 EQU 0x1D ; 2ND USER DEFINED CHARACTER
CHAR3 EQU 0x1E ; 3RD USER DEFINED CHARACTER
CHAR4 EQU 0x1F ; 4TH USER DEFINED CHARACTER
CHAR5 EQU 0x20 ; 5TH USER DEFINED CHARACTER
CHAR6 EQU 0x21 ; 6TH USER DEFINED CHARACTER
CHAR7 EQU 0x22 ; 7TH USER DEFINED CHARACTER
CHAR8 EQU 0x23 ; 8TH USER DEFINED CHARACTER
CHAR9 EQU 0x24 ; 9TH USER DEFINED CHARCATER
CHAR10 EQU 0x25 ; 10TH USER DEFINED CHARACTER
TEMP2 EQU 0x26
;**********************************************************************
ORG 0 ; processor reset vector - start of code
;******************************* INITIALISATION STUFF
CLRF PORTB ; reset portb
BSF STATUS, RP0 ; select bank 1
MOVLW B'10000001' ; PINS RB4=INPUT & ALL OTHERS=OUTPUT
MOVWF TRISB ; UPDATE TRISB REGISTER TO DEFINE I/O PINS
BCF OPTION_REG,NOT_RBPU ;ENABLE PULLUPS ON PORTB
BCF STATUS, RP0 ; SELECT BANK 0
BCF INTCON, GIE ; DISABLE ALL INTERRUPTS
CLRF PORTB ; SET ALL PORTB PINS LOW
CLRF CURSOR ; TURN CURSOR OFF
CALL STABLE
MOVLW 0x0B ; DEFAULT SPACE CHARACTER
MOVWF CHAR1 ; CLEAR ALL OF THE USER CHARCATERS
MOVWF CHAR2
MOVWF CHAR3
MOVWF CHAR4
MOVWF CHAR5
MOVWF CHAR6
MOVWF CHAR7
MOVWF CHAR8
MOVWF CHAR9
MOVWF CHAR10
;************************ SETUP 1307 CLOCK CHIP
; MUST GET SECONDS TO BE ABLE TO SET ENABLE BIT WITHOUT CLEARING
CALL START
MOVLW C1307R ; ADDRESS DS1307 FOR READING
MOVWF SENDBUF
CALL SENDBYTE
CALL READBYTE ; GET SECONDS
CALL SEND_ACK
MOVF GETBUF,0
MOVWF SEC
CALL STOP
CALL START
MOVLW C1307W ; WRITE TO 1307
MOVWF SENDBUF
CALL SENDBYTE
MOVLW 0 ; ADDRESS reg 0
MOVWF SENDBUF
CALL SENDBYTE
MOVF SEC,0 ; LOAD SECONDS
BCF W,7 ; ENABLE OSCILLATOR
MOVWF SENDBUF
CALL SENDBYTE
CALL STOP
;******************************* STV5730 CHIP INITIALISATION
MOVLW 0x30
MOVWF BYTE1
CLRF BYTE2
CALL SEND16BYTE
MOVLW 0x30
MOVWF BYTE1
CLRF BYTE2
CALL SEND16BYTE
CLRF BYTE1 ;SEND RESET BYTE
MOVLW 0xDB
MOVWF BYTE2
CALL SEND16BYTE
MOVLW 0x10
MOVWF BYTE1
CLRF BYTE2
CALL SEND16BYTE
CLRF BYTE1 ;SELECT ZOOM REGISTER (1ST CONTROL REG)
MOVLW B'11001100'
MOVWF BYTE2
CALL SEND16BYTE
MOVLW B'00010000' ;SEND ZOOM DATA
MOVWF BYTE1
CLRF BYTE2
CALL SEND16BYTE
MOVLW B'00010000' ;SEND COLOR DATA
MOVWF BYTE1
CLRF BYTE2
CALL SEND16BYTE
MOVLW B'00010011' ;SEND CONTROL DATA
MOVWF BYTE1
MOVLW B'11101110'
MOVWF BYTE2
CALL SEND16BYTE
MOVLW B'00010111' ;SEND POSITION DATA
MOVWF BYTE1
MOVLW B'11001111'
MOVWF BYTE2
CALL SEND16BYTE
MOVLW B'00010001' ;SEND MODE DATA
MOVWF BYTE1
MOVLW B'00100000' ; SET OUTPUT FOR 6dB GAIN
MOVWF BYTE2
CALL SEND16BYTE
CLRF BYTE1 ;SELECT ROW 1 ATTRIBUTE
MOVLW B'11000000'
MOVWF BYTE2
CALL SEND16BYTE
MOVLW B'00010000' ;SEND ROW1 ATTRIB DATA
MOVWF BYTE1
MOVLW B'11000000' ;ENABLE ROW & DISPLAY BORDER
MOVWF BYTE2
CALL SEND16BYTE
MOVLW B'00010000' ;SEND ROW2 ATTRIB DATA
MOVWF BYTE1
MOVLW B'11000000' ;ENABLE ROW & DISPLAY BORDER
MOVWF BYTE2
CALL SEND16BYTE
MOVLW 8 ; NUMBER OF TIMES TO LOOP
MOVWF TEMP
ROWLOOP: ;CLEAR ALL OTHER ROWS
MOVLW B'00010000' ;SEND ROW ATTRIB DATA
MOVWF BYTE1
MOVLW B'00000000'
MOVWF BYTE2
CALL SEND16BYTE
DECFSZ TEMP,1
GOTO ROWLOOP
;*****************************************************************
BEGIN: ; BEGIN MAIN LOOP
CLRWDT ; RESET WATCHDOG TIMER
;*********** CLOCK DATA READ
CALL START
MOVLW C1307W ; ADDRESS DS1307 FOR WRITING
MOVWF SENDBUF
CALL SENDBYTE
MOVLW 0
MOVWF SENDBUF
CALL SENDBYTE ; SET ADDRESS ZERO
CALL STOP
CALL START
MOVLW C1307R ; ADDRESS DS1307 FOR READING
MOVWF SENDBUF
CALL SENDBYTE
CALL READBYTE ; GET SECONDS
CALL SEND_ACK
MOVF GETBUF,0
MOVWF SEC
CALL READBYTE ; GET MINUTES
CALL SEND_ACK
MOVF GETBUF,0
MOVWF MIN
CALL READBYTE ; GET HOURS
CALL SEND_ACK
MOVF GETBUF,0
MOVWF HOUR
CALL READBYTE ; GET DAY OF WEEK (BUT JUST IGNORE)
CALL SEND_ACK
CALL READBYTE ; GET DAY
CALL SEND_ACK
MOVF GETBUF,0
MOVWF DAY
CALL READBYTE ; GET MONTH
CALL SEND_ACK
MOVF GETBUF,0
MOVWF MONTH
CALL READBYTE ; GET YEAR
CALL SEND_ACK
MOVF GETBUF,0
MOVWF YEAR
CALL READBYTE ; GET CONTROL REG AND IGNORE
CALL SEND_ACK
CALL READBYTE ; GET CHAR1
CALL SEND_ACK
MOVF GETBUF,0
MOVWF CHAR1
SUBLW 0x25
BTFSS STATUS,C ; IS CHAR > MAX THEN CLEAR
CLRF CHAR1
CALL READBYTE ; GET CHAR2
CALL SEND_ACK
MOVF GETBUF,0
MOVWF CHAR2
SUBLW 0x25
BTFSS STATUS,C ; IS CHAR > MAX THEN CLEAR
CLRF CHAR2
CALL READBYTE ; GET CHAR3
CALL SEND_ACK
MOVF GETBUF,0
MOVWF CHAR3
SUBLW 0x25
BTFSS STATUS,C ; IS CHAR > MAX THEN CLEAR
CLRF CHAR3
CALL READBYTE ; GET CHAR4
CALL SEND_ACK
MOVF GETBUF,0
MOVWF CHAR4
SUBLW 0x25
BTFSS STATUS,C ; IS CHAR > MAX THEN CLEAR
CLRF CHAR4
CALL READBYTE ; GET CHAR5
CALL SEND_ACK
MOVF GETBUF,0
MOVWF CHAR5
SUBLW 0x25
BTFSS STATUS,C ; IS CHAR > MAX THEN CLEAR
CLRF CHAR5
CALL READBYTE ; GET CHAR6
CALL SEND_ACK
MOVF GETBUF,0
MOVWF CHAR6
SUBLW 0x25
BTFSS STATUS,C ; IS CHAR > MAX THEN CLEAR
CLRF CHAR6
CALL READBYTE ; GET CHAR7
CALL SEND_ACK
MOVF GETBUF,0
MOVWF CHAR7
SUBLW 0x25
BTFSS STATUS,C ; IS CHAR > MAX THEN CLEAR
CLRF CHAR7
CALL READBYTE ; GET CHAR8
CALL SEND_ACK
MOVF GETBUF,0
MOVWF CHAR8
SUBLW 0x25
BTFSS STATUS,C ; IS CHAR > MAX THEN CLEAR
CLRF CHAR8
CALL READBYTE ; GET CHAR9
CALL SEND_ACK
MOVF GETBUF,0
MOVWF CHAR9
SUBLW 0x25
BTFSS STATUS,C ; IS CHAR > MAX THEN CLEAR
CLRF CHAR9
CALL READBYTE ; GET CHAR10
CALL SEND_NOTACK ; END OF DATA READ
MOVF GETBUF,0
MOVWF CHAR10
SUBLW 0x25
BTFSS STATUS,C ; IS CHAR > MAX THEN CLEAR
CLRF CHAR10
CALL STOP
;************************ DISPLAY DATA
DISPLAY:
MOVLW 0x00 ; SET WRITE POINTER TO ROW1 FIRST CHAR
MOVWF BYTE1
CLRF BYTE2
CALL SEND16BYTE
MOVLW B'00011111'
MOVWF BYTE1 ; SET BYTE1 FOR ALL SUBSEQUENT WRITES
SWAPF HOUR,0 ; GET 10'S HOURS FROM HOURS
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVF HOUR,0 ; GET HOURS
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVLW 0x26 ; ":" CHARACTER
MOVWF BYTE2
CALL SEND16BYTE
SWAPF MIN,0 ; GET 10'S MINUTES FROM MINUTES
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVF MIN,0 ; GET MINUTES
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVLW 0x26 ; ":" CHARACTER
MOVWF BYTE2
CALL SEND16BYTE
SWAPF SEC,0 ; GET 10'S SECONDS FROM SECONDS
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVF SEC,0 ; GET SECONDS
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVLW 0x0B ; SPACE CHARACTER
MOVWF BYTE2
CALL SEND16BYTE
SWAPF DAY,0 ; GET 10'S DAYS
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVF DAY,0 ; GET DAYS
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVLW 0x28 ; SLASH CHARACTER
MOVWF BYTE2
CALL SEND16BYTE
SWAPF MONTH,0 ; GET 10'S MONTHS
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVF MONTH,0 ; GET MONTHS
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVLW 0x28 ; SLASH CHARACTER
MOVWF BYTE2
CALL SEND16BYTE
SWAPF YEAR,0 ; GET 10'S YEARS
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVF YEAR,0 ; GET YEAR
ANDLW 0x0F
MOVWF BYTE2
CALL SEND16BYTE
MOVLW 0x0B ; SPACE CHARACTER
MOVWF BYTE2
CALL SEND16BYTE
MOVF CHAR1,0
MOVWF BYTE2
CALL SEND16BYTE
MOVF CHAR2,0
MOVWF BYTE2
CALL SEND16BYTE
MOVF CHAR3,0
MOVWF BYTE2
CALL SEND16BYTE
MOVF CHAR4,0
MOVWF BYTE2
CALL SEND16BYTE
MOVF CHAR5,0
MOVWF BYTE2
CALL SEND16BYTE
MOVF CHAR6,0
MOVWF BYTE2
CALL SEND16BYTE
MOVF CHAR7,0
MOVWF BYTE2
CALL SEND16BYTE
MOVF CHAR8,0
MOVWF BYTE2
CALL SEND16BYTE
MOVF CHAR9,0
MOVWF BYTE2
CALL SEND16BYTE
MOVF CHAR10,0
MOVWF BYTE2
CALL SEND16BYTE
MOVLW 0x01 ; SET WRITE POINTER TO ROW2 FIRST CHAR
MOVWF BYTE1
CLRF BYTE2
CALL SEND16BYTE
MOVLW B'00011111'
MOVWF BYTE1 ; SET BYTE1 FOR ALL SUBSEQUENT WRITES
MOVLW 1
MOVWF TEMP ; LOOP COUNT VARIABLE
CURSORLOOP: ;*** DISPLAY CURSOR LINE
MOVF CURSOR,0
SUBWF TEMP,0
BTFSC STATUS,Z
GOTO CJUMP1 ; AT CURSOR POSITION
MOVLW 0x0B ; DISPLAY SPACE CHAR INSTEAD
GOTO CJUMP2
CJUMP1: ; DISPLAY CURSOR
MOVLW 0x7C ; DISPLAY UP-ARROW
CJUMP2:
MOVWF BYTE2
CALL SEND16BYTE ; DISPLAY CHARACTER
INCF TEMP,1
MOVLW 28 ; MAX NUMBER OF CHARS ON LINE
SUBWF TEMP,0
BTFSS STATUS,Z ; END OF LINE ?
GOTO CURSORLOOP ; CONTINUE WITH CURSOR DISPLAY
BTFSS PORTB,P_MODE ; CHECK FOR MODE BUTTON PRESSED
GOTO EDITLOOP ; MODE BUTTON PRESSED, ENTER EDIT MODE
MOVF CURSOR,1 ; CHECK FOR CURSOR=0
BTFSS STATUS,Z
GOTO EDITLOOP ; EDIT MODE IS ON SO RETURN TO EDIT LOOP
GOTO BEGIN ; END OF MAIN DISPLAY LOOP
;****** MODE BUTTON HAS BEEN PRESSED, ENTER EDIT MODE
EDITLOOP:
CLRWDT ; CLEAR WATCHDOG
BTFSC PORTB,P_MODE ; MODE BUTTON PRESSED ?
GOTO EJUMP1 ; MODE BUTTON NOT PRESSED
BTFSC PORTB,P_SET ; IS SET BUTTON PRESSED AS WELL
GOTO EJUMP0
CLRF CURSOR ; EXIT EDIT MODE
GOTO WRITEDATA ; WRITE THE DATA TO 1307 AND EXIT
EJUMP0:
INCF CURSOR,1 ; INCREMENT CURSOR POSITION
MOVLW .29 ; MAX NUMBER OF CHARS ON LINE
SUBWF CURSOR,0
BTFSS STATUS,Z ; IS CURSOR AT END OF LINE ?
GOTO EJUMP1 ; CURSOR IS NOT AT END OF LINE
MOVLW 1 ; PUT CURSOR BACK AT START OF LINE
MOVWF CURSOR
EJUMP1: ;****** ADJUST 10'S HOURS
BTFSC PORTB,P_SET ; SET BUTTON PRESSED ?
GOTO ENDEDIT ; SET BUTTON NOT PRESSED
MOVLW 1
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP2
; CURSOR AT 1ST POSITION
SWAPF HOUR,0 ; GET 10'S HOURS
ANDLW 0x0F
ADDLW 1 ; INCREMENT 10'S HOURS
MOVWF TEMP
SUBLW 3
BTFSC STATUS,Z ; IS 10'S HOURS=3 ?
CLRF TEMP ; RESET 10'S HOURS
SWAPF TEMP,1
MOVF HOUR,0
ANDLW 0x0F
ADDWF TEMP,0
MOVWF HOUR ; SET 10'S HOURS
GOTO ENDEDIT
EJUMP2: ;****** ADJUST HOURS
MOVLW 2
SUBWF CURSOR,0 ; CURSOR AT 2ND POSITION
BTFSS STATUS,Z
GOTO EJUMP3
MOVF HOUR,0 ; GET HOURS
ANDLW 0x0F
ADDLW 1 ; INCREMENT HOURS
MOVWF TEMP
SUBLW 0x0A
BTFSC STATUS,Z ; IS HOURS=10 ?
CLRF TEMP ; RESET HOURS
MOVF HOUR,0
ANDLW 0xF0
ADDWF TEMP,0
MOVWF HOUR ; SET HOURS
GOTO ENDEDIT
EJUMP3: ;****** ADJUST 10'S MINUTES
MOVLW 4
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP4
; CURSOR AT 4TH POSITION
SWAPF MIN,0 ; GET 10'S MIN
ANDLW 0x0F
ADDLW 1 ; INCREMENT 10'S MIN
MOVWF TEMP
SUBLW 6
BTFSC STATUS,Z ; IS 10'S MIN=6 ?
CLRF TEMP ; RESET 10'S MIN
SWAPF TEMP,1
MOVF MIN,0
ANDLW 0x0F
ADDWF TEMP,0
MOVWF MIN ; SET 10'S MIN
GOTO ENDEDIT
EJUMP4: ;****** ADJUST MINUTES
MOVLW 5
SUBWF CURSOR,0 ; 5TH CURSOR POSITION
BTFSS STATUS,Z
GOTO EJUMP5
MOVF MIN,0 ; GET MIN
ANDLW 0x0F
ADDLW 1 ; INCREMENT MIN
MOVWF TEMP
SUBLW 0x0A
BTFSC STATUS,Z ; IS MIN=10 ?
CLRF TEMP ; RESET MIN
MOVF MIN,0
ANDLW 0xF0
ADDWF TEMP,0
MOVWF MIN ; SET MIN
GOTO ENDEDIT
EJUMP5: ;****** ADJUST 10'S SECONDS
MOVLW 7
SUBWF CURSOR,0
BTFSS STATUS,Z
GOTO EJUMP6
; CURSOR AT 7TH POSITION
SWAPF SEC,0 ; GET 10'S SEC
ANDLW 0x0F
ADDLW 1 ; INCREMENT 10'S SEC
MOVWF TEMP
SUBLW 6
BTFSC STATUS,Z ; IS 10'S SEC=6 ?
CLRF TEMP ; RESET 10'S SEC
SWAPF TEMP,1
MOVF SEC,0
ANDLW 0x0F
ADDWF TEMP,0
MOVWF SEC ; SET 10'S SEC
GOTO ENDEDIT
EJUMP6: ;****** ADJUST SECONDS
MOVLW 8
SUBWF CURSOR,0 ; 8TH CURSOR POSITION
BTFSS STATUS,Z
GOTO EJUMP7
MOVF SEC,0 ; GET SEC
ANDLW 0x0F
ADDLW 1 ; INCREMENT SEC
MOVWF TEMP
SUBLW 0x0A
BTFSC STATUS,Z ; IS SEC=10 ?
CLRF TEMP ; RESET SEC
MOVF SEC,0
ANDLW 0xF0
ADDWF TEMP,0
MOVWF SEC ; SET SEC
GOTO ENDEDIT
EJUMP7: ;****** ADJUST 10'S DAYS
MOVLW .10
SUBWF CURSOR,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -