; IAMBIC KEYER FOR PIC16C84 (c)1898 E SKELTON EI9GQ 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 LOOP 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