;*******************************Tool-Relay-MAIN KVM Switch*************************************
; DATE 2007/5/8
; 作者 李瑞
TITLE "TOOL-RELAY-MAIN"
PROCESSOR 16F73
;**********************************************************************************************
;* BANK SPECIAL REGISTERS
;* (特殊 暂存器 库)
;**********************************************************************************************
INDEX EQU 00H ;INDEX ADDRESS FILE
RTC EQU 01H ;REAL TIME COUNTER
PCL EQU 02H ;PROGRAM COUNTER LOW BYTE
;**********************************************************************************************
PSW EQU 03H ;PROGRAM STATUS WORD
CF EQU 0 ;CARRY FLAG
AF EQU 1 ;AUXILIARY CARRY FLAG
ZF EQU 2 ;ZERO FLAG
PDF EQU 3 ;POWER DOWN FLAG
TOF EQU 4 ;TIME-OUT FLAG
RP0 EQU 5 ;REGISTER BANK SELECT BIT 0 (DIRECT ADDRESSING 直接寻址)
RP1 EQU 6 ;REGISTER BANK SELECT BIT 1 (DIRECT ADDRESSING 直接寻址)
IRP EQU 7 ;REGISTER BANK SELECT BIT (INDIRECT ADDRESSING 间接寻址)
;***********************************************************************************************
FSR EQU 04H ;FILE SELECT REGISTER
BK0 EQU 5 ;BANK SELECTION BIT0
BK1 EQU 6 ;BANK SELECTION BIT1
;***********************************************************************************************
RA EQU 05H ;A PORT "XX00,0010 "B 00H
C1 EQU 0 ;OUTPUT
C2 EQU 1 ;OUTPUT
C3 EQU 2 ;OUTPUT
C4 EQU 3 ;OUTPUT
@RA4 EQU 4 ;OUTPUT
@RA5 EQU 5 ;OUTPUT
_RAVAL EQU b'00000000'
;************************************************************************************************
; MODIFY WILLIAM.LI
;************************************************************************************************
RB EQU 06H ;B PORT "1111,1111"B FFH
BUP_W EQU 0 ;INPUT
HBUP_W EQU 1 ;INPUT
BDP_W EQU 2 ;INPUT
HBDP_W EQU 3 ;INPUT
AUP_W EQU 4 ;INPUT
HAUP_W EQU 5 ;INPUT
ADP_W EQU 6 ;INPUT
HADP_W EQU 7 ;INPUT
_RBVAL EQU b'11111111'
;************************************************************************************************
RC EQU 07H ;C PORT "1000,0010"B 02H
SP EQU 0
BOTTON_SELECT EQU 1
SEG_DAT EQU 2
SEG_CLK EQU 3
SEG_CLR EQU 4
TEST1 EQU 5
TX EQU 6
RX EQU 7
_RCVAL EQU b'10000010'
;************************************************************************************************
PCLATH EQU 0AH ;PROGRAM COUNTER HIGH BYTE
SUB_0 EQU 0 ;SUBROUTINE SELECT BIT 0
SUB_1 EQU 1 ;SUBROUTINE SELECT BIT 1
SUB_2 EQU 2 ;SUBROUTINE SELECT BIT 2
PG0 EQU 3 ;PAGE SELECT BIT 0
PG1 EQU 4 ;PAGE SELECT BIT 1
INTCON EQU 0BH
;***********************************************************************************************
;* BANK0 GENERAL PURPOSE REGISTERS ADD 020-06F
; 普通 用途 暂存器 库0
;* START 20-6F ADDRESS
;***********************************************************************************************
; ALL BANKS COMMON REGISTERS
; 所有的 库 共同的 暂存器
;***********************************************************************************************
COMSTA EQU 70H
LEADER EQU 0
ERR_F EQU 1
DATA_F EQU 2
SCAN_F EQU 3
CODE3_F EQU 4
F0_F EQU 5
SPEAKER EQU 6
;***********************************************************************************************
HEXLED EQU 71H
SNDLED EQU 72H
TEMP2 EQU 73H
TEMP3 EQU 74H
PORT_NUMBER EQU 75H
TEMP5 EQU 76H
;***********************************************************************************************
@RCTEMP EQU 77H
TIMER1 EQU 78H
TIMER2 EQU 79H
TIMER3 EQU 7AH
TIMER_S EQU 7BH
;************************************************************************************************
@RB_STATUS EQU 7CH
@RC_STATUS EQU 7DH
;************************************************************************************************
@RBTEMP EQU 7EH ;PORTREG
PRESENT EQU 7FH
;************************************************************************************************
;* BANK1 SPECIAL REGISTERS
;* 库1 特殊 暂存器
;************************************************************************************************
OPT_R EQU 81H
PS0 EQU 0 ;PRESCALER RATE SELECT BIT 0
PS1 EQU 1 ;PRESCALER RATE SELECT BIT 1
PS2 EQU 2 ;PRESCALER RATE SELECT BIT 2
PSA EQU 3 ;PRESCALER ASSIGNMENT BIT (0 = RTCC,1=WDT)
TOSE EQU 4 ;TMR0 SOURCE EDGE SELECT BIT (0 = RISE,1 = FALL)
TOCS EQU 5 ;TMR0 CLOCK SOURCE SELECT BIT (0 = INTERNAL 1 = RA4)
INTEDG EQU 6 ;INTERRUPT EDGE SELECT BIT (0 = FALL, 1 = RISE)
RBPU EQU 7 ;PORTB PULL-UP ENABLE BIT (0 = ENABLE,1 = DISABLE)
;**************************************************************************************************
TRISA EQU 85H ;PORT A DIRECTION CONTROLLER
TRISB EQU 86H ;PORT B DIRECTION CONTROLLER
TRISC EQU 87H ;PORT C DIRECTION CONTROLLER
;**************************************************************************************************
TXSTA EQU 98H ;TXSRA
TX9D EQU 0 ;PRINTER PORT DATA
TRMT EQU 1
BRGH EQU 2
STATONLEMENTED EQU 3
SYNC EQU 4
TXEN EQU 5
TX9 EQU 6
CSRC EQU 7
;**************************************************************************************************
PIE1 EQU 8CH ;TXSRA
TXIE EQU 4
RCIE EQU 5
;**************************************************************************************************
PIR1 EQU 0CH ;RXSRA
TXIF EQU 4
RCIF EQU 5
;**************************************************************************************************
RCSTA EQU 18H ;RXSRA
RX9D EQU 0 ;PRINTER PORT DATA
OERR EQU 1
FERR EQU 2
ADDEN EQU 3
CREN EQU 4
SREN EQU 5
RX9 EQU 6
SPEN EQU 7
;**************************************************************************************************
TXREG EQU 19H
SPBRG EQU 99H
RCREG EQU 1AH
;**************************************************************************************************
ADCON1 EQU 9FH ;PORT A ANALOG/DIGITAL DEFINE CONTROLLER
BIT_0 EQU 0
BIT_1 EQU 1
BIT_2 EQU 2
BIT_3 EQU 3
BIT_4 EQU 4
BIT_5 EQU 5
BIT_6 EQU 6
BIT_7 EQU 7
;*************************************************************************************************
;* RTCC TABLE
;*************************************************************************************************
RF0 EQU 0
RF1 EQU 1
RF2 EQU 2
RF3 EQU 3
RF4 EQU 4
RF5 EQU 5
RF6 EQU 6
RF7 EQU 7
;************************************************************************************************
PAGE0 EQU 0005H
PAGE1 EQU 0400H ;MAIN PROGRAM PIC 16F873
PAGE2 EQU 0800H
PAGE3 EQU 0C00H ;MAIN PROGRAM PIC 16F877
RST_87 EQU 0000H ;STARTING REGISTER AT 0000H
;************************************************************************************************
;** TEST PORT NUMBER
;************************************************************************************************
PORT_MAIN EQU 08H
;************************************************************************************************
;*** MACRO ***
;************************************************************************************************
SEL_REG_BIT MACRO X
LOCAL SELREG1,SELREG2
SELREG1
; BTFSS @RBTEMP,7
;CALL SHOW7A_MAIN ;如果为1说明是初始化状态。
;CALL ONE_SECOND
MOVF RC,W
MOVWF @RCTEMP ;@RCTEMP为F77H
BTFSS @RCTEMP,X
GOTO SELREG2
;BTFSS @RBTEMP,7
;CALL SHOW7B_MAIN
;CALL ONE_SECOND
MOVF RC,W
MOVWF @RCTEMP ;@RCTEMP为F77H
BTFSS @RCTEMP,X
GOTO SELREG2
GOTO SELREG1
SELREG2
MOVF RC,W
MOVWF @RCTEMP
BTFSS @RCTEMP,X
GOTO SELREG2
ENDM
;*************************************************************************************************
GOTO POWERON_INITION
ORG PAGE0
;*************************************************************************************************
;** TABLE HEX TO 7-SEGMENT LED SUBROUTINE
;** 7节 LED 子程式
;*************************************************************************************************
SCODE
CLRF PCLATH
ADDWF PCL
RETLW 0C0H ;0
RETLW 0F9H ;1
RETLW 0A4H ;2
RETLW 0B0H ;3
RETLW 99H ;4
RETLW 92H ;5
RETLW 82H ;6
RETLW 0F8H ;7
RETLW 80H ;8
RETLW 98H ;9
RETLW 88H ;A
RETLW 83H ;B&8
RETLW 0C6H ;C
RETLW 0C0H ;D&0
RETLW 86H ;E
RETLW 8EH ;F
SHOWDISPLAY7
MOVF @RC_STATUS,W
ANDLW 0FH
CALL SHOWDISPLAY70
SWAPF @RC_STATUS,1
MOVF @RC_STATUS,W
ANDLW 0FH
CALL SHOWDISPLAY70
SWAPF @RC_STATUS,1
RETLW 0
SHOWDISPLAY99
MOVF PRESENT,W
ANDLW 0FH
CALL SHOWDISPLAY70
SWAPF PRESENT,1
MOVF PRESENT,W
ANDLW 0FH
CALL SHOWDISPLAY70
RETLW 0
SHOWDISPLAY70
CALL SCODE
MOVWF TEMP5
MOVLW 08H
MOVWF TEMP3
SHOWDISPLAY71
BSF RC,SEG_DAT ;turn off
BTFSS TEMP5,7 ;btfss temp5,7
BCF RC,SEG_DAT ;turn on
BCF RC,SEG_CLK
BSF RC,SEG_CLK
RLF TEMP5
DECFSZ TEMP3
GOTO SHOWDISPLAY71
RETLW 0
;***************************************************************************************************
; PAGE0 SUBROUTINE
; 0页 子程式
;***************************************************************************************************
BEEP
BSF RC,SP ;set speaker on5k
BEP0
CLRF RTC
BEP1
BTFSS RTC,RF7
GOTO BEP1 ;set speaker 16ms
BCF RC,SP
RETLW 0
;***************************************************************************************************
; PORT() SELECT
; 1.C1,C2,C3 PORT()
; 2.PORT_MAIN(PORT ) = PORT_NUMBER PORT_NUMBER=0
;***************************************************************************************************
SELECTABLE
BSF RA,C1
BTFSS PORT_NUMBER,0
BCF RA,C1
BSF RA,C2
BTFSS PORT_NUMBER,1
BCF RA,C2
BSF RA,C3
BTFSS PORT_NUMBER,2
BCF RA,C3
BSF RA,C4
BTFSS PORT_NUMBER,3
BCF RA,C4
MOVLW PORT_MAIN
XORWF PORT_NUMBER,0
BTFSS PSW,ZF
RETLW 0
MOVLW 00H
MOVWF PORT_NUMBER
GOTO SELECTABLE
;****************************************************************************************************
DELAY_MS
CLRF RTC
DELAY_MS2
BTFSS RTC,RF7
GOTO DELAY_MS2
DECFSZ TEMP2
GOTO DELAY_MS
RETLW 0
;***************************************************************************************************
SHOW7A_MAIN
CALL SHOW7A
MOVWF PRESENT
CALL SHOWDISPLAY99
CALL SHOWDISPLAY7
RETLW 0
SHOW7B_MAIN
CALL SHOW7B
MOVWF PRESENT
CALL SHOWDISPLAY99
CALL SHOWDISPLAY7
RETLW 0
;***************************************************************************************************
SHOW7B
BTFSS @RBTEMP,0
RETLW 0BFH
RETLW 0B0H
SHOW7A
BTFSS @RBTEMP,1
RETLW 0AFH
RETLW 0A0H
;**********************************************************************************************
ONE_SECOND
MOVLW 07H
MOVWF TIMER1
LOOP1 MOVLW 0FFH
MOVWF TIMER2
LOOP2 MOVLW 0FFH
MOVWF TIMER3
LOOP3 DECFSZ TIMER3
GOTO LOOP3
DECFSZ TIMER2
GOTO LOOP2
DECFSZ TIMER1
GOTO LOOP1
RETLW 0H
;****************************************************************************************************
;****************************************************************************************************
;初始化工作开始
POWERON_INITION
CLRF PSW ;SET REGISTERS IN BANK0
CLRF FSR ;SET REGISTERS IN BANK0
CLRF PCLATH ;SET PROGRAMS IN PAGE0
BSF PSW,RP0 ;CHANGE REGISTERS BANK TO 2ND
MOVLW 07H ;10000111
MOVWF OPT_R ;SET RTCC TIMER SCALE TO 128US EACH STEP0
MOVLW 07H
MOVWF ADCON1 ;DEFINE PORTA IS DIGITAL I/O
MOVLW _RAVAL
MOVWF TRISA
MOVLW _RBVAL
MOVWF TRISB
MOVLW _RCVAL
MOVWF TRISC
;RS-232 PORT ,CYTEL =8 , SET RATE 9600,N,8,1
MOVLW D'51'
MOVWF SPBRG
CLRF TXSTA
BSF TXSTA,BRGH
BSF TXSTA,TXEN
BCF PSW,RP0 ;CHANGE REGISTERS BANK TO 1ST
;****************************************************************************************************
POWERON_HAREWARE
CLRF INTCON
BCF RC,SP ;spk
BSF RCSTA,CREN
BSF RCSTA,SPEN
BSF RC,SEG_DAT ;CLEAR DISPLAY
BCF RC,SEG_CLR
BSF RC,SEG_CLR
BSF RC,TEST1
MOVLW 00H ;PORT_EQU=0
MOVWF PORT_NUMBER ;用于致能PORT数的暂存器
MOVWF @RC_STATUS ;用于7节显示器的暂存器
CALL SELECTABLE ;致能当前PORT数为PORT_NUMBER暂存器中的值。
CALL SHOWDISPLAY7 ;使7节显示器显示数字00
CALL SHOWDISPLAY7 ;使7节显示器显示数字00
CLRF @RBTEMP
BSF @RBTEMP,7
CALL BEEP ;初始化结束.
;初始化工作结束.
;****************************************************************************************************
;开始进行主循环
LPT_MAIN
SEL_REG_BIT 1
CLRF @RBTEMP
MOVF PORT_NUMBER,0
MOVWF @RC_STATUS ;POR_NUMBER的值放入@RC_MAIN2中
INCF @RC_STATUS,1
CLRF PSW
CALL CHECK_ERRR1 ;TEST A SIDE
CLRF PSW
CALL CHECK_ERRR2 ;TEST B SIDE
CALL SHOW7A_MAIN
CALL ONE_SECOND
CALL ONE_SECOND
CALL SHOW7B_MAIN
CALL ONE_SECOND
LPT_MAIN1
INCF PORT_NUMBER,1 ;PORT_NUMBER+1放入PORT_NUMBER中
CALL SELECTABLE
GOTO LPT_MAIN
;主循环结束处
;**************************************************************************************************
;**************************************************************************************************
CHECK_ERRR1
BCF RC,TEST1 ;READLY ON
MOVF RB,W
MOVWF @RB_STATUS ;A SIDE BAD?
ANDLW 0FH ;0BBH
XORLW 0EH
BTFSS PSW,ZF
CALL ERRBEEPLOB1_NG ;如果不为0,则不设置@RBTEMP暂存器,继续执行下一测试。
BTFSC PSW,ZF
CALL ERRBEEPLOB1_OK ;DISPLAY 7-SEGMENT
CLRF PSW
SWAPF @RB_STATUS
MOVF @RB_STATUS,0
ANDLW 0FH
XORLW 0EH
BTFSS PSW,ZF
CALL ERRBEEPLOA1_NG
BTFSC PSW,ZF
CALL ERRBEEPLOA1_OK
RETLW 0 ;TEST1测试完,返回调用处。
ERRBEEPLOB1_OK
BSF @RBTEMP,0
RETLW 0
ERRBEEPLOB1_NG
BCF @RBTEMP,0
RETLW 0
ERRBEEPLOA1_OK
BSF @RBTEMP,1
RETLW 0
ERRBEEPLOA1_NG
BCF @RBTEMP,1
RETLW 0
;***************************************************************************************************
CHECK_ERRR2
BSF RC,TEST1 ;READLY OFF
MOVF RB,W
MOVWF @RB_STATUS ;
ANDLW 0FH
XORLW 0BH
BTFSS PSW,ZF ;B SIDE BAD?
CALL ERRBEEPLOB1_NG
BTFSC PSW,ZF
CALL ERRBEEPLOB1_OK ;DISPLAY 7SEGMENT
CLRF PSW
SWAPF @RB_STATUS
MOVF @RB_STATUS,0
ANDLW 0FH
XORLW 0BH
BTFSS PSW,ZF
CALL ERRBEEPLOA1_NG
BTFSC PSW,ZF
CALL ERRBEEPLOA1_OK
RETLW 0
;**********************************************************************************************
END