📄 picusb.asm
字号:
;===============================================================;
; File Name: PICUSB.asm ;
; written by Max TchenKov 11/16/2007 ;
; ;
; MCU type: Microchip PIC 16F505 ;
;===============================================================;
; Function : Test program for USB HID interface
; use 16F505 MCU, 24M crystal
; 8 instruction for 1uS
;===============================================================;
; PICUSB header file ;
;===============================================================;
#include <p16f505.inc>
#include PICUSB.inc
;1us=1000ns
;===============================================================;
; Data Memory Define ;
sram udata ;0x8..0x0F ;
;===============================================================;
rCount res 1
rCountH res 1
rIOByte res 1
rDelay res 1
rDelayH res 1
rFSRptr res 1
rGenSw res 1 ;=0 default
;===============================================================;
; Data Memory Define ;
gpr0 udata ;0x10 ;..0x1F ;
;===============================================================;
rPortBDir res 1
rPortCDir res 1
__config _MCLRE_OFF & _CP_OFF & _WDT_OFF & _HS_OSC
;===============================================================;
; MCU reset rolover instruction ;
PROG0 code ;0x0 ;
;===============================================================;
goto f_Reset
DelaySub_100MS: goto fDelaySub_100MS
DelaySub_1MS: goto fDelaySub_1MS
EscapeUSBHID: goto fEscapeUSBHID
UARTOUT: goto fUARTOUT
;===============================================================;
; Cold Start ;
;===============================================================;
ColdStart:
movlw 0x75
call UARTOUT
_cold0:
movf PORTB,W
andlw B'11'
btfss STATUS,Z
goto _cold0
clrf TMR0
_cold1:
btfss PORTB,ioUSBMinus
goto _cold1
;TME0=12 or 15
clrf TMR0
nop
_cold2:
movf TMR0,W
btfsc STATUS,Z
goto _cold0
btfsc PORTB,ioUSBMinus
goto _cold2
; movf TMR0,W
call UARTOUT
call DelaySub_100MS
goto _cold0
DisplayDelay:
movlw .20
movwf rCount
_dis0:
call DelaySub_100MS
decfsz rCount,F
goto _dis0
retlw 0x0
;================================================================
; Search for K mode ;
; USB- normal high, USB+ normal low ;
;================================================================
EscapeJMode:
clrf rCount
_jmode1:
btfss STATUS,Z
goto _jmode0
_jmode0:
incf rCount,F
movf rCount,W
xorlw 0x5
btfss STATUS,Z
goto _jmode1
retlw 0x0
;================================================================
; Get one byte from USB ;
;================================================================
USB_1Byte:
movlw 0x4 ;(1)
movwf rDelay ;(2)
_usb0:
decfsz rDelay,F ;(3)
goto _usb0 ;(4,5)
; 2+3*2(counter) delay
nop
nop
bsf PORTB,oTest
bcf PORTB,oTest
nop
nop
bsf PORTB,oTest
bcf PORTB,oTest
; movf PORTB,W
; andlw B'11'
; xorlw B'01'
; btfsc STATUS,Z
; goto _usb1byte0
; movf PORTB,W
; andlw B'11'
; xorlw B'01'
; btfsc STATUS,Z
; goto _usb1byte0
; movf PORTB,W
; andlw B'11'
; xorlw B'01'
; btfsc STATUS,Z
; goto _usb1byte0
retlw 0x1
;_usb1byte0:
; bsf PORTB,oTest
; bcf PORTB,oTest
; retlw 0x0
;================================================================
; sleep for wake up and disable TOCKI ;
;================================================================
gosleep:
call EscapeUSBHID
SleepNow:
movlw B'11011111' ;enable weak pull high
option
sleep
;===============================================================;
; Pin Change Wake Up program ;
;===============================================================;
WakePinChange:
movf PORTB,W
andlw B'11'
btfss STATUS,Z
goto gosleep
bsf PORTB,oTest
call EscapeUSBHID
bcf PORTB,oTest
goto SleepNow
;==================================================================================================
;****************************************************************
PROG1 code ;0x100 ;
;****************************************************************
;================================================================
; UART Output, for Debug 19200 BPS,call by Page 2 only ;
; 1 Time Pulse for 52uS ;
; use rDelay,rDelayH,rIOByte ;
;================================================================
fUARTOUT:
clrwdt
movwf rIOByte
movlw 0x8
movwf rDelayH ;total 8 bit
;low for 51uS
bcf PORTC,oUART ;start bit
movlw cUart19200 ;102uS/TIME(9-9600)
movwf rDelay ;start bit + data (8 bits)
_uart_delay0 ;
decfsz rDelay,F ;delay for 19200 bps
goto _uart_delay0 ;If counter out
; 8 bit loop
_uart_delay3
rrf rIOByte,F ;next bit
btfss STATUS,C ;If bit=1
goto _uart_delay4 ;YES =>bit set txd
bsf PORTC,oUART ;NO =>bit clr txd
goto _uart_delay1 ;next bit
_uart_delay4
bcf PORTC,oUART ;bit set txd
_uart_delay1
movlw cUart19200-6
movwf rDelay
_uart_delay2
decfsz rDelay,F
goto _uart_delay2
decfsz rDelayH,F ;If finish sent data
goto _uart_delay3 ;YES =>PALM_SENDBIT
movlw cUart19200
movwf rDelay
bsf PORTC,oUART ;parity bit
_uart_delay5
decfsz rDelay,F ;delay for 19200 bps
goto _uart_delay5 ;If finish
movlw cUart19200 ;mov delay value
movwf rDelay
_uart_delay6
decfsz rDelay,F ;stop bit
goto _uart_delay6 ;delay for 9600 bps
retlw 0x0 ;return
;================================================================
; Delay program for 100 MS ;
;================================================================
fDelaySub_100MS:
movlw c100MS&0xff
movwf rDelay
movlw c100MS>>8
goto DelaySub_16
;================================================================
; Delay program for 1 MS ;
;================================================================
fDelaySub_1MS:
movlw c1MS&0xff
movwf rDelay
movlw c1MS>>8
goto DelaySub_16
;================================================================
; for escape USB Hid command, delay maxinum for 45uS ;
;================================================================
fEscapeUSBHID:
movlw c45US&0xff
movwf rDelay
movlw c45US>>8
goto DelaySub_16
;================================================================
; Delay program for 16 bit, input Acc ;
;================================================================
DelaySub_16:
movwf rDelayH
_delay0:
decfsz rDelay,f
goto _delay0
clrwdt
decf rDelayH,f
movf rDelayH,w
xorlw 0xFF
btfss STATUS,Z
goto _delay0
retlw 0x0
;================================================================
; Reset Program ;
;================================================================
f_Reset:
clrf FSR
movwf rPortBDir
tris PORTB
; btfsc STATUS,RBWUF ;1 = Reset due to wake-up from Sleep on pin change
; goto WakePinChange
; btfss STATUS,NOT_TO ;clear for time out
; goto WDTTimeOut
;
; btfss STATUS,NOT_PD ;set for Powen On
; goto gosleep ;clear for power down
;------------------------------------------------
;for power on
movlw B'11011111' ;disable wake up and pull high
option
movlw cPortBDir
movwf rPortBDir
tris PORTB
movlw B'111011' ;oTest=0;
movwf PORTB
movlw cPortCDir
movwf rPortCDir
tris PORTC
movlw B'111111' ;oUart high
movwf PORTC
goto ColdStart
;================================================================
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -