⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 picusb.asm

📁 A test program for PUCUSB project, there is a UARTOUT program, which can output RS232 BAUD 19200,n81
💻 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 + -