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

📄 vcg21.asm

📁 DS1307 with PIC16F84A application
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;**********************************************************************
; 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 + -