__config 3f79 ; Morse Decoder using 16F73 ; ; Display on Port B (ASCII) ; Enable on RC7 ; R/W on RC6 ; Data/Command on RC5 ; ; POT on A/D input to RA0 to provide speed ; Input from LM567 on RA2 ; ;******************************************************* ;PIC Registers PCL EQU 0x02 STATUS EQU 0x03 ;Used for Zero and Carry bits PORTA EQU 0x05 PORTB EQU 0x06 PORTC EQU 0x07 PCLATH EQU 0x0A ADRES EQU 0x1E ADCON EQU 0x1F ;User Registers MARKREG EQU 0x20 SPACEREG EQU 0x21 MORSE EQU 0x24 MORSELEN EQU 0x25 SPEED EQU 0x28 LOOPD EQU 0x29 T1 EQU 0x2C T2 EQU 0x2D ;PIC Bits W EQU 0 F EQU 1 ZERO EQU 2 CARRY EQU 0 ADON EQU 0 GO EQU 2 ;User Bits ENABLE EQU 7 RW EQU 6 DC EQU 5 INPUT EQU 2 SWITCH EQU 4 ;******************************************************* ; Program starts here ;******************************************************* ORG 0x00 GOTO START NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP START BSF 3, 5 MOVLW 0xFF ; MOVWF PORTA ;Set Port A to all inputs CLRF PORTB ;Set Port B to all outputs CLRF PORTC ;Set Port C to all outputs ;Initialise A/D MOVLW 0x04 MOVWF ADCON BCF 3, 5 MOVLW 0x40 MOVWF ADCON BSF ADCON, 0 ;Initialise Display MOVLW 0x28 ;Initial delay (40mS) MOVWF T2 I2 CALL DELAY DECFSZ T2, F GOTO I2 MOVLW 0x30 ;Function Set CALL WC MOVLW 0x0F ;Display On CALL WC MOVLW 0x01 ;Clear Display CALL WC CALL DELAY CALL DELAY MOVLW 0x07 ;Entry Mode CALL WC MOVLW 0x8F ;Set Cursor Position CALL WC ;Display initial text MOVLW 0x43 ;Letter C CALL WD CALL DELAY MOVLW 0x57 ;Letter W CALL WD CALL DELAY MOVLW 0x20 ;Space CALL WD CALL DELAY MOVLW 0x44 ;Letter D CALL WD CALL DELAY MOVLW 0x65 ;Letter e CALL WD CALL DELAY MOVLW 0x63 ;Letter c CALL WD CALL DELAY MOVLW 0x6F ;Letter o CALL WD CALL DELAY MOVLW 0x64 ;Letter d CALL WD CALL DELAY MOVLW 0x65 ;Letter e CALL WD CALL DELAY MOVLW 0x72 ;Letter r CALL WD CALL DELAY MOVLW 0x20 ;Space CALL WD CALL DELAY MOVLW 0x20 ;Space CALL WD CALL DELAY CLRF MORSE CLRF MORSELEN GETNE BTFSS PORTA, INPUT ;Wait for negative edge (key down) GOTO GETNE CALL MSPEED BTFSS PORTA, INPUT ;Is key still down GOTO GETNE ;No - must have been a glitch! DOWN CALL MSPEED ;Yes - so its a dot or dash CALL MSPEED INCF MORSELEN, F ;Must be dot or dash so increment length RRF MORSE, W ;Move morse character left ANDLW 0xFE MOVWF MORSE BTFSS PORTA, INPUT ;Is key still down GOTO GAP2 ;No, DOT *********************CHANGED from GAP INCF MORSE, F ;Yes, DASH, so add a "1" to morse character DASH BTFSC PORTA, INPUT ;Wait for an edge (key released) GOTO DASH CALL MSPEED BTFSC PORTA, INPUT ;Is key still up GOTO DASH ;No - must have been a glitch GOTO GAP ;******************ADDED GAP2 MOVLW 0x2E CALL WD GOTO GAP3 GAP MOVLW 0x2D CALL WD GAP3 MOVF SPEED, W ;GAP MOVF SPEED, W ;Yes MOVWF LOOPD M2 CALL DELAY DECF LOOPD, F ;Wait for speed * 1mS BTFSC STATUS, ZERO ;Have we reached end of loop GOTO M3 ;Yes - so may be intercharacter gap BTFSS PORTA, INPUT ;Is key still up GOTO M2 ;Yes - Keep going CALL MSPEED ;No - down, so probably interbit gap BTFSS PORTA, INPUT ;Is key still down GOTO DOWN ;Yes, so another dot or dash M3 MOVF SPEED, W ;No, possible glitch so keep waiting MOVWF LOOPD M4 CALL DELAY DECF LOOPD, F ;Wait for speed * 1mS BTFSC STATUS, ZERO ;Have we reached end of loop GOTO DECODE ;Yes - so must be intercharacter gap BTFSS PORTA, INPUT ;Is key still up GOTO M4 ;Yes - Keep going CALL MSPEED ;No - down, so interbit gap BTFSS PORTA, INPUT ;Is key still down GOTO DOWN ;Yes, so another dot or dash DECODE INCF MORSELEN, W ;No so must be intercharacter gap ANDLW 0xF8 BTFSS STATUS, ZERO GOTO ERR ;More than six bits! MOVF MORSELEN, W CALL TABLE ;On return, W hold ASCII character MOVWF PORTB CALL WD ;**************************** CLRF MORSE CLRF MORSELEN CALL MSPEED BTFSC PORTA, INPUT ;Is key pressed? GOTO GETNE ;Yes CALL MSPEED ;No so may be char or word gap BTFSC PORTA, INPUT ;Is key pressed? GOTO GETNE ;Yes CALL MSPEED BTFSC PORTA, INPUT ;Is key pressed? GOTO GETNE ;Yes CALL MSPEED BTFSC PORTA, INPUT ;Is key pressed? GOTO GETNE ;Yes CALL MSPEED BTFSC PORTA, INPUT ;Is key pressed? GOTO GETNE ;Yes MOVLW 0x20 ;No, so must be interword gap MOVWF PORTB CALL WD GOTO GETNE ERR MOVLW 0xFF MOVWF PORTB CALL WD CLRF MORSE CLRF MORSELEN GOTO GETNE FINISH GOTO FINISH ;The idea is to: ; detect a key down edge ; wait X and test - still down = must be OK / up = glitch ; wait 2*X - still down = must be dash / up = dot ; If dash, wait for key up edge ; If dot, wait 2*X. If Down again = interbit gap so goto line 3 ; If still up = interchar gap so go back to start ;********************************************************** ; ; Write Command routine ; ;********************************************************** WC MOVWF PORTB CLRF PORTC BSF PORTC, ENABLE NOP BCF PORTC, ENABLE CALL DELAY BSF PORTC, RW BSF PORTC, DC RETURN ;********************************************************** ; ; Write Data routine ; ;********************************************************** WD MOVWF PORTB MOVLW 0x20 MOVWF PORTC BSF PORTC, ENABLE NOP BCF PORTC, ENABLE BSF PORTC, RW RETURN ;******************************************************** ; ; This file contains a 1ms Delay, which includes a read ; of the A/D convertor. ; ;******************************************************** DELAY MOVLW 0xA6 MOVWF T1 D1 DECFSZ T1, F GOTO D1 BSF ADCON, GO MOVLW 0xA5 MOVWF T1 D2 DECFSZ T1, F GOTO D2 RRF ADRES, W ANDLW 0x7F ADDLW 0x0C MOVWF SPEED RETURN ORG 0x100 ;*********************************************************** ; ; Morse to ASCII translation tables ; ; On entry, W contains character length (0 - 6 bits) ; MORSE contains actual morse character ; ;*********************************************************** MSPEED MOVF SPEED, W MOVWF LOOPD M1 CALL DELAY DECFSZ LOOPD, W ;Wait for speed * 1mS GOTO M1 RETURN TABLE MOVLW 0x01 MOVWF PCLATH MOVF MORSELEN, W ANDLW 0x07 ADDWF PCL, F RETLW 0x00 GOTO TABLE1 GOTO TABLE2 GOTO TABLE3 GOTO TABLE4 GOTO TABLE5 GOTO TABLE6 RETLW 0x00 TABLE1 MOVF MORSE, W ANDLW 0x01 ADDWF PCL, F RETLW 0x45 ;E RETLW 0x54 ;T TABLE2 MOVF MORSE, W ANDLW 0x03 ADDWF PCL, F RETLW 0x49 ;I RETLW 0x41 ;A RETLW 0x4E ;N RETLW 0x4D ;M TABLE3 MOVF MORSE, W ANDLW 0x07 ADDWF PCL, F RETLW 0x53 ;S RETLW 0x55 ;U RETLW 0x52 ;R RETLW 0x57 ;W RETLW 0x44 ;D RETLW 0x4B ;K RETLW 0x47 ;G RETLW 0x4F ;O TABLE4 MOVF MORSE, W ANDLW 0x0F ADDWF PCL, F RETLW 0x48 ;H RETLW 0x56 ;V RETLW 0x46 ;F RETLW 0xFF ;..-- RETLW 0x4C ;L RETLW 0xFF ;.-.- RETLW 0x50 ;P RETLW 0x4A ;J RETLW 0x42 ;B RETLW 0x58 ;X RETLW 0x43 ;C RETLW 0x59 ;Y RETLW 0x5A ;Z RETLW 0x51 ;Q RETLW 0xFF ;---. RETLW 0xFF ;---- TABLE5 MOVF MORSE, W ANDLW 0x1F ADDWF PCL, F RETLW 0x35 ;5 RETLW 0x34 ;4 RETLW 0xFF ;...-. RETLW 0x33 ;3 RETLW 0xFF ;..-.. RETLW 0xFF ;..-.- RETLW 0xFF ;..--. RETLW 0x32 ;2 RETLW 0x3D ;WAIT (=) RETLW 0xFF ;.-..- RETLW 0x7F ;EOM (<-) RETLW 0xFF ;.-.-- RETLW 0xFF ;.--.. RETLW 0xFF ;.--.- RETLW 0xFF ;.---. RETLW 0x31 ;1 RETLW 0x36 ;6 RETLW 0x3D ;BREAK (=) RETLW 0x2F ;/ RETLW 0xFF ;-..-- RETLW 0xFF ;-.-.. RETLW 0x7E ;CALL (->) RETLW 0x3C ;(<) RETLW 0xFF ;-.--- RETLW 0x37 ;7 RETLW 0xFF ;--..- RETLW 0xFF ;--.-. RETLW 0xFF ;--.-- RETLW 0x38 ;8 RETLW 0xFF ;---.- RETLW 0x39 ;9 RETLW 0x30 ;0 TABLE6 MOVF MORSE, W ANDLW 0x3F ADDWF PCL, F RETLW 0xFF ;...... RETLW 0xFF ;.....- RETLW 0xFF ;....-. RETLW 0xFF ;....-- RETLW 0xFF ;...-.. RETLW 0x7F ;EOM(<-) RETLW 0xFF ;...--. RETLW 0xFF ;...--- RETLW 0xFF ;..-... RETLW 0xFF ;..-..- RETLW 0xFF ;..-.-. RETLW 0xFF ;..-.-- RETLW 0x3F ;? RETLW 0xFF ;..--.- RETLW 0xFF ;..---. RETLW 0xFF ;..---- RETLW 0xFF ;.-.... RETLW 0xFF ;.-...- RETLW 0xFF ;.-..-. RETLW 0xFF ;.-..-- RETLW 0xFF ;.-.-.. RETLW 0x2E ;STOP RETLW 0xFF ;.-.--. RETLW 0xFF ;.-.--- RETLW 0xFF ;.--... RETLW 0xFF ;.--..- RETLW 0xFF ;.--.-. RETLW 0xFF ;.--.-- RETLW 0xFF ;.---.. RETLW 0xFF ;.---.- RETLW 0xFF ;.----. RETLW 0xFF ;.----- RETLW 0xFF ;-..... RETLW 0xFF ;-....- RETLW 0xFF ;-...-. RETLW 0xFF ;-...-- RETLW 0xFF ;-..-.. RETLW 0xFF ;-..-.- RETLW 0xFF ;-..--. RETLW 0xFF ;-..--- RETLW 0xFF ;-.-... RETLW 0xFF ;-.-..- RETLW 0xFF ;-.-.-. RETLW 0xFF ;-.-.-- RETLW 0xFF ;-.--.. RETLW 0xFF ;-.--.- RETLW 0xFF ;-.---. RETLW 0xFF ;-.---- RETLW 0xFF ;--.... RETLW 0xFF ;--...- RETLW 0xFF ;--..-. RETLW 0x2C ;COMMA RETLW 0xFF ;--.-.. RETLW 0xFF ;--.-.- RETLW 0xFF ;--.--. RETLW 0xFF ;--.--- RETLW 0xFF ;---... RETLW 0xFF ;---..- RETLW 0xFF ;---.-. RETLW 0xFF ;---.-- RETLW 0xFF ;----.. RETLW 0xFF ;----.- RETLW 0xFF ;-----. RETLW 0xFF ;------ END