  Title "Mikrosis Elektronik Tutorial - SW_RS232"
  Subtitle "Revision 1.0 - Jan 2002"
;**********************************************************
; By Tanju TASCILAR
; (c)Mikrosis Elektronik
;**********************************************************
  Processor 12C509
  Include "P12C509.INC"
  Errorlevel 1,-207

  __CONFIG _XT_OSC&_WDT_ON&_CP_OFF&_MCLRE_OFF ; Set up config bits
  __IDLOCS 0F000			   ; Set up ID locations 0F000

; I/O pin naming

  #Define Tx		GPIO,4	;SCI Tx
  #Define Rx		GPIO,3	;SCI Rx

;RAM Area *************************************************
;Bank 0
  CBlock        0C
    S_Reg		;Serial work register
    S_Counter
    c_1			;Counter
  EndC

  #Define Out_Bit	S_Reg,MSB

; DDR values **********************************************
  GPIO_DDR	EQU	B'00101000'

; Port reset values ***************************************
  GPIO_RST	EQU	B'00010001'     ;GPIO reset value

; Control words *******************************************
  Option_RST	EQU	B'01000000'	;OPTION reset value

MSB     EQU     .7
LSB     EQU     .0

;**********************************************************
; Main
;**********************************************************
	MOVWF	OSCCAL		;Optional
        CALL    Init_All
	GOTO	Main_Loop

;**********************************************************
; Serial work delay
;**********************************************************
S_Delay
	CLRWDT
	MOVLW	.22
S_Delay_Half
	MOVWF	c_1
	NOP
S_D_Loop
	NOP
	DECFSZ	c_1,F
	GOTO	S_D_Loop
	RETURN
;**********************************************************
; Init All
;**********************************************************
Init_All
	MOVLW	GPIO_RST
	MOVWF	GPIO
	MOVLW	GPIO_DDR
	TRIS	GPIO
	MOVLW	Option_RST
	OPTION
        RETURN
;**********************************************************
; Main Loop
;**********************************************************
Main_Loop

;***SCI_Read

	MOVLW	.8		
	MOVWF	S_Counter
Rx_Start
	CLRWDT
	BTFSC	Rx
	GOTO	Rx_Start
	MOVLW	.10
	GOTO	$+1
	CALL	S_Delay_Half
	BTFSC	Rx		;? True start bit
	GOTO	Rx_Start	;No, false start bit
Rx_Loop
	CALL	S_Delay
	GOTO	$+1
	CLRC
	RRF	S_Reg,F
	BTFSC	Rx
	BSF	S_Reg,MSB
	DECFSZ	S_Counter,F
	GOTO	Rx_Loop
	MOVLW	.23
	CALL	S_Delay_Half	;For stop bit
	
	BTFSS	Rx
	GOTO	Main_Loop	;Receive error

;---SCI_Read

;***SCI_Write

	MOVWF	S_Reg
	MOVLW	.8
	MOVWF	S_Counter

	BCF	Tx		;Start bit
	GOTO	$+1
	GOTO	$+1
	GOTO	$+1
	GOTO	$+1
	CALL	S_Delay
Wr_Loop				;Send data bits
	BTFSS	S_Reg,LSB
	BCF	Tx
	BTFSC	S_Reg,LSB
	BSF	Tx
	RRF	S_Reg,F
	NOP
	CALL	S_Delay
	DECFSZ	S_Counter,F
	GOTO	Wr_Loop

	BSF	Tx		;Stop bit
	CALL	S_Delay

;---SCI_Write

	GOTO	Main_Loop

;**********************************************************
; Oscillator calibration values - Use only for windowed devices
;**********************************************************
;	ORG	01FF
;	MOVLW	070
;	ORG	03FF
;	MOVLW	070

        END
