亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bootldr3.asm

?? pic bootloader 用于PIC單片機的主程序下載
?? ASM
?? 第 1 頁 / 共 2 頁
字號:
;
;  bootldr3.asm      Flash-resident bootloader for the PIC 16f873
;
;  Derived from the original Microchip program, boot877.asm
;

;
;  This bootloader uses the state of PB1 to determine action.  If PB1 is
;  low on reset, the bootloader prepares to download a user file into
;  memory.  If PB1 is high on reset, the bootloader tests the value in
;  a reserved flash cell, CodeStatus, to see if memory contains a valid
;  code image.  If CodeStatus is zero, the code image is assumed valid
;  and control jumps to StartUserCode to run the downloaded image.
;

        list p=16f873, st=OFF, x=OFF, n=0
        errorlevel -302
        #include <p16f873.inc>

        #include  "bank.mac"

        __CONFIG _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _WRT_ENABLE_ON & _XT_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_OFF

;-----------------------------------------------------------------------------
;Constants
;

;
;  Define the version as a byte literal.  This will be displayed as part
;  of the user prompt, as two hex characters.
;

VERSION         equ     01

;
;  I changed the download selector input to PB1 from the original of
;  PB0.  I didn't want to tie up the valuable INT* pin for this selection.
;

TEST_INPUT      EQU     1       ;Port B Pin 1 input indicates download

;
;  The following baud rate constants assume a 4.0 MHz crystal.
;

BAUD_9600       equ     0x19
BAUD_19200      equ     0x0c

BAUD_DEFAULT    equ     BAUD_9600

;-----------------------------------------------------------------------------
;Variables in bank0

                CBLOCK  0x20
                AddressH:       1       ;flash program memory address high byte
                AddressL:       1       ;flash program memory address low byte
                NumWords:       1       ;number of words in line of hex file
                Checksum:       1       ;byte to hold checksum of incoming data
                Counter:        1       ;to count words being saved or programmed
                TestByte:       1       ;byte to show reset vector code received
                HexByte:        1       ;byte from 2 incoming ascii characters
                Temp:           1       ;temp byte for general use
                DataPointer:    1       ;pointer to data in buffer
                DataArray:      0x40    ;buffer for storing incoming data
                ENDC

;=============================================================================
;Reset vector code

                ORG     0x0000 

ResetVector:
                movlw   high Main
                movwf   PCLATH          ;set page bits for page3
                goto    Main            ;go to boot loader

;=============================================================================
;Start of boot code in upper memory traps accidental entry into boot code area

;               ORG     0x1e00          ;Use last part of page3 for PIC16F876/7
;               ORG     0x0e00          ;Use last part of page1 for PIC16F873/4
;               ORG     0x0600          ;Use last part of page0 for PIC16F870/1

        ORG     0xe00                   ;leave lots of room for loader

StartOfBoot:
        movlw   high TrapError  ;trap if execution runs into boot code
        movwf   PCLATH          ;set correct page
TrapError:
        goto    TrapError       ;trap error and wait for reset

;-----------------------------------------------------------------------------
;Relocated user reset code to jump to start of user code
;Must be in bank0 before jumping to this routine

StartUserCode:
                clrf    PCLATH          ;set correct page for reset condition 
                nop                     ;relocated user code replaces this nop
                nop                     ;relocated user code replaces this nop
                nop                     ;relocated user code replaces this nop
                nop                     ;relocated user code replaces this nop
                movlw   high TrapError1 ;trap if no goto in user reset code
                movwf   PCLATH          ;set correct page
TrapError1:
                goto    TrapError1      ;trap error and wait for reset

;-----------------------------------------------------------------------------
;Program memory location to show whether valid code has been programmed

CodeStatus:
                DA      0x3fff          ;0 for valid code, 0x3fff for no code

;-----------------------------------------------------------------------------
;Main boot code routine
;Tests to see if a load should occur and if valid user code exists

Main:
                Bank0                   ;change to bank0 in case of soft reset
                btfss   PORTB,TEST_INPUT ;check pin for boot load               
                goto    Loader          ;if low then do bootload
                call    LoadStatusAddr  ;load address of CodeStatus word
                call    FlashRead       ;read data at CodeStatus location
                Bank2                   ;change from bank3 to bank2
                movf    EEDATA,F        ;set Z flag if data is zero
                Bank0                   ;change from bank2 to bank0
                btfss   STATUS,Z        ;test Z flag
TrapError2:
                goto    TrapError2      ;if not zero then is no valid code
                goto    StartUserCode   ;if zero then run user code

;-----------------------------------------------------------------------------
;Start of routine to load and program new code

Loader:
        Bank0                           ; entry from vector at end of ROM
        clrf    TestByte                ; indicate no reset vector code yet

        call    LoadStatusAddr          ; load address of CodeStatus word
        movlw   0x3f                    ; load data to indicate no program
        movwf   EEDATH
        movlw   0xff                    ; load data to indicate no program
        movwf   EEDATA
        call    FlashWrite              ; write new CodeStatus word

        call    SerialSetup             ; set up serial port
        goto    GetCmd                  ; skip initial prompt

;-----------------------------------------------------------------------------
;Get new line of hex file starting with ':'
;Get first 8 bytes after ':' and extract address and number of bytes

GetNewLine:
        call    SendCRLF        ; make it pretty
        movlw   VERSION         ; get version number
        call    SendByte        ; send as two hex digits
        movlw   '>'             ; issue prompt
        call    SerialTransmit
GetCmd:
        call    SerialReceive   ; get new byte from serial port
        xorlw   0x0a            ; linefeed?
        btfsc   STATUS,Z
        goto    GetCmd          ; yes, just skip silently
        xorlw   0x0a            ; restore char
        call    SerialTransmit  ; echo char
        xorlw   ':'             ; check if ':' received
        btfsc   STATUS,Z
        goto    GetRec          ; got :, start processing record
        xorlw   ':'             ; restore the char
        xorlw   0dh             ; not :, is it CR?
        btfsc   STATUS,Z
        goto    GetNewLine      ; got CR, just start over
        xorlw   0dh             ; restore the char
        xorlw   'G'             ; was it GO command?
        btfsc   STATUS,Z
        goto    DoGoCmd         ; do the GO


;
;  Control reaches this point if the user sent an unknown command.
;  Receive and echo all characters until CR.
;

EatLine:
        call    SerialReceive   ; get char from serial port
        xorlw   0ah             ; line-feed?
        btfsc   STATUS,Z
        goto    EatLine         ; yes, ignore it
        xorlw   0ah             ; recover char
        xorlw   0dh             ; CR?
        btfsc   STATUS,Z
        goto    GetNewLine      ; yes, done with this line
        xorlw   0dh             ; recover char
        call    SerialTransmit  ; echo the char
        goto    EatLine         ; loop until hit CR

;
;  Control reaches this point after user enters a semicolon, marking
;  the start of a HEX record.  Note that the leading semi has already
;  been echoed.
;

GetRec:
        clrf    Checksum        ; start with checksum zero
        call    GetHexByte      ; get number of program data bytes in line
        andlw   0x1F            ; limit number in case of error in file
        movwf   NumWords
        bcf     STATUS,C
        rrf     NumWords,F      ; divide by 2 to get number of words
        call    GetHexByte      ; get upper half of program start address
        movwf   AddressH

        call    GetHexByte      ; get lower half of program start address
        movwf   AddressL

        bcf     STATUS,C
        rrf     AddressH,F      ;divide address by 2 to get word address
        rrf     AddressL,F

        call    GetHexByte      ;get record type
        xorlw   0x01
        btfsc   STATUS,Z        ;check if end of file record (0x01)
        goto    FileDone        ;if end of file then all done

        movf    HexByte,W
        xorlw   0x00
        btfss   STATUS,Z        ;check if regular line record (0x00)
        goto    LineDone        ;if not then ignore line and send '.'

        movlw   0xe0
        addwf   AddressH,W      ;check if address >= 0x2000 (was <)
        btfsc   STATUS,C        ;which is ID locations and config bits
        goto    LineDone        ;if so then ignore line and send '.'

;-----------------------------------------------------------------------------
;Get data bytes and checksum from line of hex file

        movlw   DataArray
        movwf   FSR             ;set pointer to start of array
        movf    NumWords,W
        movwf   Counter         ;set counter to number of words

GetData:
        call    GetHexByte      ;get low data byte
        movwf   INDF            ;save in array
        incf    FSR,F           ;point to high byte

        call    GetHexByte      ;get high data byte
        movwf   INDF            ;save in array
        incf    FSR,F           ;point to next low byte

        decfsz  Counter,F
        goto    GetData

        call    GetHexByte      ;get checksum
        movf    Checksum,W      ;check if checksum correct
        btfss   STATUS,Z
        goto    ErrorMessage

;
;  Get saved data one word at a time to program into flash 
;

        movlw   DataArray
        movwf   FSR             ;point to start of array
        movf    NumWords,W
        movwf   Counter         ;set counter to half number of bytes

;
;  Check if address is in reset code area
;

CheckAddress:
        movf    AddressH,W      ;checking for boot location code
        btfss   STATUS,Z        ;test if AddressH is zero 
        goto    CheckAddress1   ;if not go check if reset code received

        movlw   0xfc    
        addwf   AddressL,W      ;add 0xfc (-4) to address
        btfsc   STATUS,C        ;no carry means address < 4
        goto    CheckAddress1   ;if not go check if reset code received

        bsf     TestByte,0      ;show that reset vector code received
        movf    AddressL,W      ;relocate addresses 0-3 to new location
        addlw   low (StartUserCode + 1) ;add low address to new location
        Bank2                   ;change from bank0 to bank2
        movwf   EEADR           ;load new low address
        movlw   high (StartUserCode + 1) ;get new location high address
        movwf   EEADRH          ;load high address
        goto    LoadData        ;go get data byte and program into flash

;-----------------------------------------------------------------------------
;Check if reset code has been received
;Check if address is too high and conflicts with boot loader

CheckAddress1:
        btfss   TestByte,0      ;check if reset vector code received first
        goto    ErrorMessage    ;if not then error

        movlw   high StartOfBoot ;get high byte of address
        subwf   AddressH,W
        btfss   STATUS,C        ;test if less than boot code address 
        goto    LoadAddress     ;yes so continue with write
        btfss   STATUS,Z        ;test if equal to boot code address 
        goto    ErrorMessage    ;no so error in high byte of address

        movlw   low StartOfBoot ;get low byte of address
        subwf   AddressL,W
        btfsc   STATUS,C        ;test if less than boot code address 
        goto    ErrorMessage    ;no so error in address

;-----------------------------------------------------------------------------
;Load address and data and write data into flash

LoadAddress:
        movf    AddressH,W      ;get high address
        Bank2                   ;change from bank0 to bank2
        movwf   EEADRH          ;load high address
        Bank0                   ;change from bank2 to bank0
        movf    AddressL,W      ;get low address
        Bank2                   ;change from bank0 to bank2
        movwf   EEADR           ;load low address

LoadData:
        movf    INDF,W          ;get low byte from array
        movwf   EEDATA          ;load low byte
        incf    FSR,F           ;point to high data byte
        movf    INDF,W          ;get high byte from array
        movwf   EEDATH          ;load high byte
        incf    FSR,F           ;point to next low data byte

        call    FlashWrite      ;write data to program memory

        Bank0                   ;change from bank3 to bank0
        incfsz  AddressL,F      ;increment low address byte

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久精品tv| 日韩亚洲欧美在线观看| 成人午夜电影久久影院| 国产一区二区免费视频| 国内精品免费在线观看| 国产一区视频导航| 懂色av中文一区二区三区 | 亚洲综合视频在线观看| 亚洲码国产岛国毛片在线| 亚洲欧美乱综合| 亚洲超碰97人人做人人爱| 偷拍一区二区三区| 精品一区二区在线视频| 国产成人精品亚洲777人妖| 成人av电影免费观看| 99re热视频这里只精品| 欧美日韩成人在线一区| 精品久久久久久久久久久久久久久久久| 日韩无一区二区| 中文字幕欧美日韩一区| 亚洲综合激情小说| 激情五月婷婷综合| 99re66热这里只有精品3直播| 在线亚洲高清视频| 日韩欧美二区三区| 亚洲男帅同性gay1069| 日韩高清不卡一区二区三区| 国产九色精品成人porny| 日本电影欧美片| 久久尤物电影视频在线观看| 综合久久国产九一剧情麻豆| 日韩成人免费电影| 丁香亚洲综合激情啪啪综合| 欧美主播一区二区三区美女| 精品国产欧美一区二区| 亚洲免费看黄网站| 国产另类ts人妖一区二区| 欧美午夜免费电影| 国产精品女同一区二区三区| 日韩专区一卡二卡| av亚洲精华国产精华精华| 日韩一区二区精品| 亚洲最新视频在线播放| 国产成人综合在线播放| 制服丝袜日韩国产| 亚洲与欧洲av电影| 波多野结衣的一区二区三区| 亚洲精品在线电影| 奇米精品一区二区三区在线观看 | 日韩视频一区二区在线观看| 中文字幕精品一区二区三区精品 | 日韩免费一区二区三区在线播放| 国产精品久久久久天堂| 久久 天天综合| 欧美色老头old∨ideo| 国产精品视频你懂的| 久久99国产精品麻豆| 91精品国产综合久久精品图片| 亚洲欧美在线观看| 成人小视频在线观看| 久久色.com| 国产麻豆视频一区二区| 91精品国产全国免费观看| 一区二区在线电影| 91亚洲精品久久久蜜桃网站| 中文字幕精品一区二区三区精品| 国产在线视视频有精品| 精品动漫一区二区三区在线观看| 欧美aa在线视频| 91精品国产综合久久蜜臀| 亚洲第一二三四区| 欧美精品日韩精品| 日韩成人一区二区三区在线观看| 欧美日产国产精品| 日韩国产欧美一区二区三区| 7777女厕盗摄久久久| 美女久久久精品| 精品国产乱码久久久久久影片| 日本美女一区二区| 精品福利在线导航| 国产成人在线色| 亚洲欧洲综合另类在线| 色狠狠av一区二区三区| 婷婷成人激情在线网| 欧美一区二区三区在线视频| 狠狠色综合播放一区二区| 日本一区二区三区国色天香 | 欧美精品精品一区| 蜜桃久久久久久| 国产免费观看久久| 一本大道久久a久久精二百| 亚洲丶国产丶欧美一区二区三区| 欧美日韩在线直播| 狠狠色丁香婷婷综合| 亚洲天堂中文字幕| 7777精品伊人久久久大香线蕉经典版下载| 亚洲电影在线免费观看| 精品国产乱码久久久久久牛牛| 成人免费福利片| 视频在线在亚洲| 日本一区二区三级电影在线观看| 色哟哟亚洲精品| 美女视频第一区二区三区免费观看网站 | 国产91高潮流白浆在线麻豆| 国产精品久久福利| 欧美精品乱码久久久久久按摩| 久久99国产精品尤物| 1区2区3区精品视频| 精品视频999| 国产成人精品影视| 图片区日韩欧美亚洲| 中文字幕一区免费在线观看| 7777精品伊人久久久大香线蕉的| 国产电影一区二区三区| 亚洲一区影音先锋| 国产精品视频线看| 日韩欧美黄色影院| 91国模大尺度私拍在线视频| 国产一区二区三区四区五区入口| 亚洲激情中文1区| 国产欧美日韩激情| 日韩视频免费观看高清完整版 | 欧美亚洲禁片免费| 粉嫩嫩av羞羞动漫久久久| 日韩va欧美va亚洲va久久| 国产精品国产精品国产专区不蜜 | 亚洲一级不卡视频| 国产精品福利影院| 久久综合五月天婷婷伊人| 欧美视频中文字幕| 99久久精品国产一区| 国产美女主播视频一区| 蜜桃av一区二区三区| 亚洲成a人片综合在线| 一区二区三区国产精品| 国产精品大尺度| 26uuu国产一区二区三区| 欧美一级搡bbbb搡bbbb| 欧美日本乱大交xxxxx| 在线欧美日韩国产| 一本久久a久久精品亚洲 | 一区二区三区高清不卡| 日本一区二区免费在线观看视频| 日韩精品最新网址| 91精品国产综合久久久久久久| 欧美视频你懂的| 欧美日韩日日骚| 精品视频一区二区不卡| 欧美狂野另类xxxxoooo| 欧美人狂配大交3d怪物一区 | 热久久一区二区| 日本在线播放一区二区三区| 午夜国产精品影院在线观看| 亚洲福中文字幕伊人影院| 性久久久久久久久久久久| 五月综合激情婷婷六月色窝| 午夜免费欧美电影| 美女视频黄久久| 国产真实乱偷精品视频免| 国产一区二区h| www.66久久| 色噜噜久久综合| 欧美日韩精品欧美日韩精品一 | 国产成人亚洲精品青草天美 | 欧美日韩亚洲丝袜制服| 欧美日韩亚洲另类| 日韩一区二区三区免费看| 欧美一级国产精品| 国产日韩欧美制服另类| 亚洲欧美日韩久久| 午夜精品视频在线观看| 激情五月激情综合网| 成人免费毛片高清视频| 91浏览器入口在线观看| 69p69国产精品| 久久久国产综合精品女国产盗摄| 国产精品高潮久久久久无| 五月婷婷色综合| 紧缚捆绑精品一区二区| av在线一区二区三区| 91精品在线免费| 国产精品视频在线看| 一级特黄大欧美久久久| 麻豆精品精品国产自在97香蕉| 国产经典欧美精品| 在线观看日产精品| 精品免费一区二区三区| 亚洲人成精品久久久久| 首页亚洲欧美制服丝腿| yourporn久久国产精品| 在线播放中文字幕一区| 欧美激情资源网| 日韩专区在线视频| 国产99精品国产| 在线观看91精品国产麻豆| 久久蜜桃一区二区| 五月天一区二区三区| 国产ts人妖一区二区| 欧美一二三区在线观看| 一区二区三区在线不卡|