list p=12f629 ; list directive to define processor
#include ‹p12f629.inc› ; processor specific variable definitions
errorlevel -302
__CONFIG _CP_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _MCLRE_OFF
coreg equ 0x20
delcnt equ 0x21
cobit equ 0x22
TM1 EQU 024H
reg0 equ 025h
reg1 equ 026h
reg2 equ 027h
reg3 equ 028h
reg4 equ 029h
shreg equ 02Ah
ORG 0x3FF
ORG 0x000 ; coding begins here
goto RUN
ORG 0x04
Int
btfss INTCON, T0IF ; флаг прерывания по таймеру?
return
movlw B'10000000' ;прерывания по таймеру отключаем
movwf INTCON ;
bcf INTCON, T0IF
return
RUN
bcf STATUS,RP0
movlw b'00000111' ;
movwf CMCON ;Вsкл компаратор
bsf STATUS,RP0 ;
movlw b'00111111' ;все порты на вход
movwf TRISIO ;
movlw 0x00 ;
movwf IOCB ;
movlw b'10000001' ;
movwf OPTION_REG ;
call 3FFh
MOVWF OSCCAL ;
movlw B'10100000' ;прерывания только по таймеру
movwf INTCON ;
bcf STATUS, RP0 ;
clrf GPIO ;
Next
btfsc INTCON, T0IE ;ждем заряда емкости
goto Next ;
nop
main
bsf STATUS,RP0 ;
MOVLW B'00101111' ;переводим порт на выход
movwf TRISIO ;
bcf STATUS, RP0 ;
movlw 0x10 ;01 start
movwf reg0
movlw 0xBD ;1-ый байт кода
movwf reg1
movlw 0xBB ;2-ой
movwf reg2
movlw 0xBE ;3-ий
movwf reg3
movlw 0xBE ;4-ый
movwf reg4
bcf GPIO , 4
movlw 0x04
movwf coreg
movlw reg0
movwf FSR
movlw 0x04
call word_emu
incf FSR , f
ask movlw 0x08
call word_emu
incf FSR , f
decfsz coreg , f
goto ask
; MOVLW B'00101111'
; TRIS GPIO
goto main
DEL50 movlw 0x10
movwf delcnt
del_loop decfsz delcnt , f
goto del_loop
RETURN
word_emu movwf cobit ; ---- вывод слова (эмуляция)
MOVF INDF , W
MOVWF shreg
bit_loop BCF GPIO , 4 ; используем ra6 для выхода - вывели "0"
CALL DEL50 ; первые 50 мкс выводим "0"
BTFSC shreg , 07 ; проверяем старший разряд
BSF GPIO , 4 ; если единица, вторые 50 мкс выводим
CALL DEL50 ; "1"(011), в противном случае "0" (001)
BSF GPIO , 4
CALL DEL50 ; третие 50 мкс выводим "0"
RLF shreg , f
DECFSZ cobit , f
GOTO bit_loop ; выводим следующий бит
BCF GPIO , 4 ;
RETURN
END
|