#include "p16f84.inc"
LIST P=16f84A
__CONFIG _WDT_OFF & _XT_OSC & _CP_OFF & _PWRTE_ON
;9600波特率
;STATUS EQU 3
RA EQU 5 ;RB5为输出,RB6为输入
RB EQU 6
BUFFER EQU 8
COUNT EQU 9
BYTE EQU 10
PIC55 EQU 1FFH
SUB EQU 0
BITNUM EQU 8 ;每字节8位数据
C EQU 0
RxData EQU 0EH
;------------------------
ORG 0 ;PIC55
GOTO MAIN
;------------------
ORG 000a ;SUB
;-----------------------
DELAY
MOVLW 0x22 ;接收时延时常数
MOVWF BUFFER ;在4MHZ下,9600波特率延时常数为23
LOOP DECFSZ BUFFER
GOTO LOOP
RETLW 0
DELAYRx
MOVLW 0x21 ;接收时延时常数
MOVWF BUFFER ;在4MHZ下,9600波特率延时常数为23
LOOPRx DECFSZ BUFFER
GOTO LOOPRx
RETLW 0
DELAY52
MOVLW 0x11 ;接收时延时常数
MOVWF BUFFER ;在4MHZ下,9600波特率延时常数为23
LOOP52 DECFSZ BUFFER
GOTO LOOP52
RETLW 0
DELAY1 MOVLW 0x30 ;发送时的延时常数30
MOVWF BUFFER
LOOP1 DECFSZ BUFFER
GOTO LOOP1
RETLW 0
DY MOVLW 0x80
MOVWF BUFFER
LP1 DECFSZ BUFFER
GOTO LP1
RETLW 0
;----------------
MAIN MOVLW 40H
TRIS RB ;置RB5输出,RB6输入
;---------------
MOVLW 0
TRIS RA
CLRF PORTA
MOVLW B'11111111'
MOVWF PORTA
call DELAY1
call DELAY1
call DELAY1
call DELAY1
MOVLW B'11111111'
MOVWF PORTA
MOVLW 0x05
MOVWF BYTE
MOVLW BITNUM
MOVWF COUNT
BEGIN0 BCF RB,5
;CALL DELAY1
MOVLW 0x11 ;发送时的延时常数30
MOVWF BUFFER
LOOPy1x DECFSZ BUFFER
GOTO LOOPy1x
L20 RRF BYTE
BTFSC STATUS,C
BSF RB,5
BTFSS STATUS,C
BCF RB,5
CALL DELAY
DECFSZ COUNT
GOTO L20
BSF RB,5
CALL DELAY
CALL DELAY
MOVLW 0x06
MOVWF BYTE
MOVLW BITNUM
MOVWF COUNT
BCF RB,5
MOVLW 0x11 ;发送时的延时常数30
MOVWF BUFFER
LOOPx1 DECFSZ BUFFER
GOTO LOOPx1
L252 RRF BYTE
BTFSC STATUS,C
BSF RB,5
BTFSS STATUS,C
BCF RB,5
CALL DELAY52
CALL DELAY52
DECFSZ COUNT
GOTO L252
BSF RB,5
CALL DELAY52
CALL DELAY52
call DELAY
;===========================
MOVLW 0x07
MOVWF BYTE
MOVLW BITNUM
MOVWF COUNT
BCF RB,5
;CALL DELAY1
MOVLW 0x11 ;发送时的延时常数30
MOVWF BUFFER
LOOPy1 DECFSZ BUFFER
GOTO LOOPy1
L201 RRF BYTE
BTFSC STATUS,C
BSF RB,5
BTFSS STATUS,C
BCF RB,5
CALL DELAY
DECFSZ COUNT
GOTO L201
BSF RB,5
CALL DELAY
;===========================
;===========================
MOVLW 0x08
MOVWF BYTE
MOVLW BITNUM
MOVWF COUNT
BCF RB,5
;CALL DELAY1
MOVLW 0x11 ;发送时的延时常数30
MOVWF BUFFER
LOOPy2 DECFSZ BUFFER
GOTO LOOPy2
L202 RRF BYTE
BTFSC STATUS,C
BSF RB,5
BTFSS STATUS,C
BCF RB,5
CALL DELAY
DECFSZ COUNT
GOTO L202
BSF RB,5
CALL DELAY
;===========================
;===========================
MOVLW 0xAA
MOVWF BYTE
MOVLW BITNUM
MOVWF COUNT
BCF RB,5
;CALL DELAY1
MOVLW 0x11 ;发送时的延时常数30
MOVWF BUFFER
LOOPy3 DECFSZ BUFFER
GOTO LOOPy3
L203 RRF BYTE
BTFSC STATUS,C
BSF RB,5
BTFSS STATUS,C
BCF RB,5
CALL DELAY
DECFSZ COUNT
GOTO L203
BSF RB,5
CALL DELAY
call DY
call DY
;===========================;----------
;===========================
MOVLW 0xAB
MOVWF BYTE
MOVLW BITNUM
MOVWF COUNT
BCF RB,5
;CALL DELAY1
MOVLW 0x11 ;发送时的延时常数30
MOVWF BUFFER
LOOPy4 DECFSZ BUFFER
GOTO LOOPy4
L204 RRF BYTE
BTFSC STATUS,C
BSF RB,5
BTFSS STATUS,C
BCF RB,5
CALL DELAY
DECFSZ COUNT
GOTO L204
BSF RB,5
CALL DELAY
call DY
call DY
;===========================
;===========================
MOVLW 0xAC
MOVWF BYTE
MOVLW BITNUM
MOVWF COUNT
BCF RB,5
;CALL DELAY1
MOVLW 0x11 ;发送时的延时常数30
MOVWF BUFFER
LOOPy5 DECFSZ BUFFER
GOTO LOOPy5
L205 RRF BYTE
BTFSC STATUS,C
BSF RB,5
BTFSS STATUS,C
BCF RB,5
CALL DELAY
DECFSZ COUNT
GOTO L205
BSF RB,5
CALL DELAY
call DY
call DY
;===========================
;===========================
MOVLW 0xAD
MOVWF BYTE
MOVLW BITNUM
MOVWF COUNT
BCF RB,5
;CALL DELAY1
MOVLW 0x11 ;发送时的延时常数30
MOVWF BUFFER
LOOPy6 DECFSZ BUFFER
GOTO LOOPy6
L206 RRF BYTE
BTFSC STATUS,C
BSF RB,5
BTFSS STATUS,C
BCF RB,5
CALL DELAY
DECFSZ COUNT
GOTO L206
BSF RB,5
CALL DELAY
call DY
;===========================
;===========================
MOVLW 0xAE
MOVWF BYTE
MOVLW BITNUM
MOVWF COUNT
BCF RB,5
;CALL DELAY1
MOVLW 0x11 ;发送时的延时常数30
MOVWF BUFFER
LOOPy7 DECFSZ BUFFER
GOTO LOOPy7
L207 RRF BYTE
BTFSC STATUS,C
BSF RB,5
BTFSS STATUS,C
BCF RB,5
CALL DELAY
DECFSZ COUNT
GOTO L207
BSF RB,5
CALL DELAY
call DY
call DY
;===========================
CLRF BYTE
MOVLW BITNUM
MOVWF COUNT
TEST BTFSC RB,6 ;起始位为一低电平
GOTO TEST
CALL DELAY
CALL DELAY52
; call DELAY52
;=========================接收数据
START BTFSC RB,6
BSF BYTE,7 ;收到高电平
BTFSS RB,6
BCF BYTE,7 ;收到低电平
DECFSZ COUNT
GOTO L1 ;一个字节未收完,收下一位
CALL DELAYRx
; call DELAY52
bcf STATUS,C ;;参考网站PIC16的程序 ===========
MOVLW BYTE
MOVWF RxData
GOTO TRANSMIT ; 准备发送
L1 RRF BYTE
;CALL DELAYRx ; DELAY 应延时1B=104US
MOVLW 0x20 ;接收时延时常数
MOVWF BUFFER ;在4MHZ下,9600波特率延时常数为23
LPPRx DECFSZ BUFFER
GOTO LPPRx
GOTO START
;=========================发送数据
TRANSMIT
MOVLW BITNUM
MOVWF COUNT
BEGIN BCF RB,5
;CALL DELAY1
call DELAY52
L2 RRF BYTE
BTFSC STATUS,C
BSF RB,5
BTFSS STATUS,C
BCF RB,5
CALL DELAY
DECFSZ COUNT
GOTO L2
BSF RB,5
CALL DELAY
; CALL EEPROM_Write
GOTO MAIN ;TEST
EEPROM_Write
BCF STATUS,RP0
MOVLW 00H
; movfw wd
MOVWF EEADR
;incf wd,w
; movwf wd
; movfw 0H
; movwf RxBuf
; MOVF RxBuf,W
MOVF RxData,W
MOVWF EEDATA
BSF STATUS,RP0
BSF EECON1,WREN
NOP
BCF INTCON,GIE
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
BSF INTCON,GIE
; incf FSR
; decfsz R8
; MOVFW BYTE
; MOVWF PORTA
RETLW 0
;-------
END
;-------