LIST P=16F84
__CONFIG 0x3FFB ;RC,
NO WDT, PWR-UP, NO CP.
RA EQU 05H ;PORT A
RB EQU 06H ;PORT B
COUNT1 EQU 0CH ;COUNT FOR DELAY
COUNT2 EQU 0DH ; "
FLAG EQU 0EH ;USER FLAGS
DIT_FLG EQU 00H ;DOT FLAG
DIT_SW EQU 00H ;DOT SWITCH (ON PADDLE KEY)
DAH_SW EQU 01H ;DASH SWITCH (ON PADDLE KEY)
KEY EQU 00H ;KEYING OUTPUT
ORG 00H ;PROGRAM EXECUTION BEGINS FROM HERE
GOTO START
DAH MOVLW 0x1E ;MAIN DOT/DASH DELAY
LOOP
GOTO CONT
DIT MOVLW 0x0A
CONT MOVWF COUNT1
LP2 MOVLW 0x6E
MOVWF COUNT2
LP1 DECFSZ COUNT2,1
GOTO LP1
DECFSZ COUNT1,1
GOTO LP2
RETLW 0 ;END OF DELAY
START BSF 3,5 ;SWITCH
TO F REGISTER PAGE 1
MOVLW 0FFH ;PORT A ALL INPUTS
MOVWF RA
MOVLW 00H ;PORT B ALL OUTPUTS
MOVWF RB
BCF 3,5 ;SWITCH TO F REGISTER
PAGE 0
MOVLW 0
MOVWF RB ;MAKE SURE TX IS
NOT KEYED ON POWER UP
MOVWF FLAG ;CLEAR DOT AND DASH
FLAGS
NEXT BTFSS RA,DIT_SW ;IS THE DIT PADDLE PRESSED?
GOTO DOT
BTFSS RA,DAH_SW ;IS THE DAH PADDLE PRESSED
GOTO DASH
GOTO NEXT ;LOOP UNTIL NEXT PADDLE PRESS
DOT BTFSS RA,DAH_SW ;ARE BOTH PADDLES PRESSED
GOTO IAMBIC ;YES
DOT2 BSF RB,KEY ;KEY TRANSMITTER
CALL DIT ;DELAY FOR 1 DOT LENGTH
BCF RB,KEY ;UNKEY TRANSMITTER
CALL DIT ;DELAY FOR 1 DOT LENGTH
BSF FLAG,DIT_FLG ;LAST MORSE ELEMENT SENT WAS A DOT (FOR
IAMBIC ACTION)
GOTO NEXT ;BACK AND WAIT UNTIL NEXT PADDLE PRESS
DASH BTFSS RA,DIT_SW ;ARE BOTH PADDLES PRESSED
GOTO IAMBIC ;YES
DASH2 BSF RB,KEY ;KEY TRANSMITTER
CALL DAH ;DELAY FOR 1 DASH LENGTH (3 DOT LENGTHS)
BCF RB,KEY ;UNKEY TRANSMITTER
CALL DIT ;DELAY FOR 1 DOT LENGTH
BCF FLAG,DIT_FLG ;LAST MORSE ELEMENT SENT WAS A DASH (FOR
IAMBIC ACTION)
GOTO NEXT ;BACK AND WAIT UNTIL NEXT PADDLE PRESS
IAMBIC BTFSC FLAG,DIT_FLG ;CHECK TO SEE IF LAST CHAR SENT WAS A DOT OR A DASH
GOTO DASH2 ;IT WAS A DOT, SEND A DASH
GOTO DOT2 ;IT WAS A DASH, SEND A DOT
END