LIST P=16F877,W=-302
#INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_ON & _WRT_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
ram0 equ 14 ; EMPETY RAM0 SLOT
ram1 equ 15 ; EMPETY RAM1 SLOT
ram2 equ 16 ; EMPETY RAM2 SLOT
cnt500u equ 17 ; 500usec counter Address
cnt1m equ 18 ; 1msec counter Address
#DEFINE BANK0 BCF STATUS,RP0 ;SET BANK0
#DEFINE BANK1 BSF STATUS,RP0 ;SET BANK1
BAUD_RATE_SPBRG EQU D'25' ;SPBRG
CBLOCK 0X70
DATA_BYTE ;RECEIVED BYTE
ENDC
ORG 0X0000
GOTO SERIAL_INIT
CLRF DATA_BYTE
CLRF PORTC
BCF STATUS,RP1
SERIAL_INIT
BANK1
MOVLW B'10000000'
MOVWF TRISC ;TX RC6 AND RX RC7'
movlw b'00000000' ; RB7-RB4 and RB1(RX)=input, others output
movwf TRISB
movlw b'00000000' ; RB7-RB4 and RB1(RX)=input, others output
movwf TRISD
movlw b'00000000' ; RB7-RB4 and RB1(RX)=input, others output
movwf TRISE
movlw b'10001111'
movwf ADCON1 ;ALL analog I/O
MOVLW BAUD_RATE_SPBRG
MOVWF SPBRG ;BAUD RATE CONFIG
MOVLW B'00000000'
MOVWF INTCON ;NO INTERRUPTIONS
MOVLW B'00100100'
MOVWF TXSTA ;ACTIVATE TX AND HIGHT BAUD RATE
BANK0
MOVLW B'10010000'
MOVWF RCSTA ;ACTIVATE SERIAL AND RX
movf RCREG,W
movf RCREG,W
movf RCREG,W
CLRF PORTB
;
; ---------
; MAIN LOOP
; ---------
;
start CALL TEST
clrf ram1
clrf ram2
CLRF PORTE
CLRF PORTD
goto address
address
btfss PIR1,RCIF ; (5) check for addressd data
goto address
;movf ram2,W ;addressd data{ A=65 >> 255-65=190 }
MOVLW D'190'
MOVWF ram0
MOVF RCREG,W
addwf ram0,F
incfsz ram0,F
goto NOT_OK
goto OK
stbyte
btfss PIR1,RCIF
goto stbyte
movlw D'162' ;addressd data{ 93 }
MOVWF ram0
MOVF RCREG,W
addwf ram0,F
incfsz ram0,F
goto stbyte
; btfsc ram1,0
; call send ;IN RECIEVER ONLY
; bcf ram1,0
goto address
recdata btfss PIR1,RCIF
goto recdata
movf RCREG,W
return
;
; -------------------------------------------------------------
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING
; -------------------------------------------------------------
;
send movwf TXREG ; send data in W
TransWt bsf STATUS,RP0 ; RAM PAGE 1
WtHere btfss TXSTA,TRMT ; (1) transmission is complete if hi
goto WtHere
bcf STATUS,RP0 ; RAM PAGE 0
return
OK call send
CLRF PORTE
CALL READ_ADCON
CALL DELAY
movlw ']'
call send
goto stbyte
NOT_OK
clrf ram0
goto stbyte
READ_ADCON
movlw B'01000001'
movwf ADCON0
bsf ADCON0,GO ;Start A/D conversion
Wait
btfsc ADCON0,GO ;Wait for conversion to complete
goto Wait
bsf STATUS,RP0 ; Bank 1
movf ADRESL,W
bcf STATUS,RP0 ; Bank 0.
MOVWF ram0
ADDLW D'255'
MOVWF ram1
INCFSZ ram1,F
GOTO NOT_ZE
INCF ram0,F
NOT_ZE MOVF ram0,W
MOVWF PORTB
movwf TXREG ; send data in W
bsf STATUS,RP0 ; RAM PAGE 1
WtHereL btfss TXSTA,TRMT ; (1) transmission is complete if hi
goto WtHereL
bcf STATUS,RP0 ; RAM PAGE 0
movf ADRESH,W
MOVWF ram0
ADDLW D'255'
MOVWF ram1
INCFSZ ram1,F
GOTO NOT_ZR
BSF ram0,7
NOT_ZR MOVF ram0,W
MOVWF PORTD
movwf TXREG ; send data in W
bsf STATUS,RP0 ; RAM PAGE 1
WtHereH btfss TXSTA,TRMT ; (1) transmission is complete if hi
goto WtHereH
bcf STATUS,RP0 ; RAM PAGE 0
RETURN
TEST
MOVLW 'T'
CALL send
MOVLW 'E'
CALL send
MOVLW 'S'
CALL send
MOVLW 'T'
CALL send
RETURN
DELAY MOVLW D'100'
MOVWF ram2
LOOP NOP
NOP
DECFSZ ram2
GOTO LOOP
RETURN
END