;******************************************************************
;* *
;* Filename: 16F88 USART Test.asm *
;* Author: Mike McLaren, K8LH *
;* (C)2010: Micro Application Consultants *
;* Date: 19-Aug-06 *
;* *
;* 16F88 USART Test Program *
;* *
;* *
;* MPLab: 7.40 (tabs=8) *
;* MPAsm: 5.03 *
;* *
;******************************************************************
processor PIC16F88
include P16F88.INC
errorlevel -302
list st=off
__CONFIG _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF&_FCMEN_OFF
;
; _CP_OFF ; default, no code protect
; _CCP1_RB0 ; default, CCP1 on RB0 pin
; _DEBUG_OFF ; default, debug mode off
; _WRT_PROTECT_OFF ; default, write protect off
; _CPD_OFF ; default
; _LVP_OFF ; -- low voltage programming off
; _BODEN_ON ; default, brown out detect on
; _MCLR_ON ; default,
; _PWRTE_ON ; -- power up timer enabled
; _WDT_OFF ; -- watch dog timer off
; _INTRC_IO or _HS_OSC ; -- INTOSC
;
PtrL equ h'20' ; PutString routine
PtrH equ h'21' ; PutString routine
;
; PutStr macro - print in-line character string
;
PutStr macro str ;
local String, Print
movlw low String ;
movwf PtrL ;
movlw high String ;
movwf PtrH ;
goto Print ;
String dt str,0
Print call PutString ; print string
endm
;******************************************************************
;* *
;******************************************************************
org 0x000
v_reset
clrf STATUS ; force bank 0, IRP 0 |B0
clrf PORTA ; clear PORT A latches |B0
clrf PORTB ; clear PORT B latches |B0
bsf STATUS,RP0 ; bank 1 |B1
clrf ANSEL ; setup PORT A digital I/O |B1
clrf TRISA ; setup PORT A all outputs |B1
movlw b'00100100' ; |B1
movwf TRISB ; set RB5/TX & RB2/RX as inputs |B1
movlw b'01110000' ; |B1
movwf OSCCON ; select 8-MHz INTOSC clock |B1
Stable btfss OSCCON,IOFS ; Int Osc Freq Stable bit set? |B1
goto Stable ; no, branch and wait |B1
movlw d'25' ; 25 (8-MHz) or 64 (20-MHz) |B1
movwf SPBRG ; 19200 baud |B1
movlw b'00100100' ; TXEN=1, SYNC=0, BRGH=1, TX9=0 |B1
movwf TXSTA ; Async, 8, 1, none |B1
bcf STATUS,RP0 ; select Bank 0 |B0
movlw b'10010000' ; SPEN=1, TX9=0, CREN=1, ADDEN=0 |B0
movwf RCSTA ; enable serial port |B0
movf RCREG,W ; flush Rx Buffer |B0
movf RCREG,W ; |B0
PutStr "\x1b[2J" ; home cursor, clear screen |B0
PutStr "K8LH 16F88 UART Test v1.0\r\n\n\n"
Loop call Get232 ; |B0
call Put232 ; |B0
goto Loop ; |B0
;******************************************************************
;
Get232 btfss PIR1,RCIF ; character available? |B0
goto Get232 ; no, branch, else |B0
movf RCREG,W ; get character |B0
return ; |B0
;
Put232 btfss PIR1,TXIF ; transmit buffer empty? |B0
goto Put232 ; no, branch, else |B0
movwf TXREG ; send character |B0
return ; |B0
;
PutString
call GetTable ; get a table character |B0
andlw b'11111111' ; |B0
skpnz ; 00 byte, last character? |B0
return ; yes, return |B0
pagesel Put232 ; |B0
call Put232 ; else,output character |B0
incf PtrL,F ; increment pointer |B0
skpnz ; |B0
incf PtrH,F ; |B0
pagesel PutString ; |B0
goto PutString ; |B0
GetTable
movf PtrH,W ; |B0
movwf PCLATH ; |B0
movf PtrL,W ; |B0
movwf PCL ; |B0
end