;	Elmer 160 Lesson 14b - 9 June 2004
;	Send digits in Morse 

		processor	pic16f84a
		include		<p16f84a.inc>
		__config	_XT_OSC & _WDT_OFF & _PWRTE_ON
		list		b=4,n=70

XMTR	equ			H'02'
KEY		equ			H'07'
Output	equ			PORTB

		cblock		H'20'
;			Output			; Output byte to transmitter
			L1				; Outer timing counter
			L2				; Inner timing counter
			DigToSend		; Digit currently being sent
			BitCount		; How far we are decoding Morse
		endc

		goto		Start	; Skip to mainline

Digit
		movwf		DigToSend	; Save digit
		movlw		H'5'		; 5 elements per digit
		movwf		BitCount
		movlw		H'03'		; Select page with
		movwf		PCLATH		; digit table
		movf		DigToSend,W	; Pick up the digit
		call		Table		; And get it's Morse
		movwf		DigToSend	; Save it off
		clrf		PCLATH		; and restore PCLATH
DigLoop
		rlf			DigToSend,F	; Get next element
		btfsc		STATUS,C	; Is it a dah?
		goto		SendDah		; Yes, send a dah
		call		Dit			; No, send a dit
		goto		EndLoop
SendDah	call		Dah
EndLoop
		decfsz		BitCount,F	; Decrement element count
		goto		DigLoop		; Not done? Do it again
		call		DahTime		; Inter-char space
		return

;	Delay a dit time
DitTime
		movlw		H'47'
		movwf		L1
DitTime1
		movlw		H'00'
		movwf		L2
DitTime2
		decfsz		L2,F
		goto		DitTime2
		decfsz		L1,F
		goto		DitTime1
		return
;	Delay a dah time
DahTime
		call		DitTime
		call		DitTime
		call		DitTime
		return
;	Delay a letter space
LetSpc
		call		DahTime		; OK, this is a tiny bit long
		return
;	Delay a word space
WordSpace
		call		DahTime
		call		DahTime
		return
;	Turn on the transmitter
XmitOn
		bcf			Output,XMTR
		bsf			Output,KEY
		return
;	Turn off the transmitter
XmitOff
		bsf			Output,XMTR
		bcf			Output,KEY
		return
;	Send a Dah
Dah
		call		XmitOn
		call		DahTime
		call		XmitOff
		call		DitTime
		return
;	Send a Dit
Dit
		call		XmitOn
		call		DitTime
		call		XmitOff
		call		DitTime
		return

;	Main program starts here
;
;	Initialization
Start
		clrf		Output		; Initialize output off
		banksel		TRISB
		bcf			TRISB,XMTR
		bcf			TRISB,KEY
		banksel		PORTB

;	Main loop here
Loop
		movlw		D'1'
		call		Digit
		movlw		D'2'
		call		Digit
		movlw		D'4'
		call		Digit
		movlw		D'8'
		call		Digit
		call		WordSpace
		goto		Loop

		org			h'300'
;	Convert a digit, 0-9, to Morse
Table
		addwf		PCL,F
		retlw		H'f8'	; 0
		retlw		H'78'	; 1
		retlw		H'38'	; 2
		retlw		H'18'	; 3
		retlw		H'08'	; 4
		retlw		H'00'	; 5
		retlw		H'80'	; 6
		retlw		H'c0'	; 7
		retlw		H'e0'	; 8
		retlw		H'f0'	; 9

		end

