新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC16系列單片機的查表

        PIC16系列單片機的查表

        作者: 時間:2016-11-28 來源:網絡 收藏
        1 PC、PCL、PCLATCH三者之間的關系

          許多讀者對 PCL、PCLATH與PC之間的關系不是十分明了, 因此在調用子程序或執行程序跳轉時,對出現的程序跑飛現象束手無策。

        本文引用地址:http://www.104case.com/article/201611/322590.htm

          PC是程序計數器, 在PIC16中檔單片機中是13位寬。

          PCL是程序計數器的低8位,可讀寫。在程序執行過程中, 因PC會不斷改變, 所以PCL也會跟著改變。同樣,改變PCL的值會改變PC的值, 從而實現程序的跳轉。

          PCLATH是程序計數器的高5位鎖存器, 但并不等于PC的高5位。PC的改變并不直接映射到PCLATH,同樣,改變PCLATH并不直接改變PC。只有特定的指令PCLATH才會裝載到PC中,即CALL、GOTO、ADDWF、PCL及F 指令。

        2程序跳轉

        (1)PC絕對跳轉

          CALL 或 GOTO 指令可實現程序的絕對跳轉。

          例:

          CALL SUB1
          GOTO SUB2

          說明: PC的低11位地址來自于操作碼,高2位來自于PCLATH的第5位和第4位。因為操作碼只包含11位子程序的地址,高2位來自于PCLATH,因此在調用子程序前必須正確設置PCLATH。當然不是每次調用子程序前都要設置PCLATH,但要保證調用子程序前,PCLATH已包含正確的值。

          設置PCLATH可使用宏命令:PAGESEL。

          例:

          PAGESEL SUB1   
          CALL SUB1

        (2)PC相對跳轉

          用ADDWF 指令可實現程序的相對跳轉。

          例:

          ADDWF PCL,F  
          RETLW 0x01
          RETLW 0X02

          說明:PC的低8位地址等于當前的PCL與W相加后的值,高5位來自于PCLATH的低5位。因此在使用這條指令之前必須正確設置PCLATH,特別注意PCL與W相加后如果有進位,必須相應地對PCLATH加1。

        3查表的實現

          雖然PIC16單片機沒有專用的查表指令,但可利用ADDWF PCL,F指令實現查表,下面舉例說明。

        (1)簡單的查表程序

          程序說明: OFFSET為偏移地址, 假設程序起始地址為0X20, PCL與W相加后不會有進位。

          ORG 0X20
        MAIN:
          MOVLW 0X01
          MOVWF OFFSET
          CLRF PCLATH
          CALL LOOK_UP
          MOVWF VALUE
          GOTO $
        LOOK_UP
          MOVF OFFSET,W
          ADDWF PCL,F
          RETLW 0X01
          RETLW 0X02
          RETLW 0X03
          RETLW 0X04
          RETLW 0X05
          RETLW 0X06
          ……

        (2)通用的的查表程序

          程序說明: OFFSET為偏移地址,可將MAIN、LOOK_UP、TABLE三個子程序置于程序區任意位置。

        MAIN
          MOVLW 0X05
          MOVWF OFFSET
          PAGESEL LOOK_UP
          CALL LOOK_UP
          MOVWF VALUE
          GOTO $
        LOOK_UP
          MOVLW HIGH(TABLE)
          MOVWF PCLATH
          MOVLW LOW(TABLE)
          ADDWF OFFSET,W
          BTFSC STATUS,C
          INCF PCLATH,F
          MOVF OFFSET,W
        TABLE
          ADDWF PCL,F
        dt 0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x0a,0x0b,0x0c,0x0D,0x0E,0x0F ……

        (3)大于256個數據的查表程序

          程序說明: OFFSETH、OFFSETL為偏移地址的高8位和低8位。可將MAIN、LOOK_UP、TABLE三個子程序置于程序區任意位置。

        MAIN
          MOVLW 0X00
          MOVWF OFFSETH
          MOVLW 0X10
          MOVWF OFFSETL
          PAGESEL LOOK_UP
          CALL LOOK_UP
          MOVWF VALUE
        LOOK_UP
          MOVLW HIGH(TABLE)
          ADDWF OFFSETH,W
          MOVWF PCLATH
          MOVLW LOW(TABLE)
          ADDWF OFFSETL,W
          BTFSC STATUS,C
          INCF PCLATH,F
          MOVF OFFSETL,W
        TABLE
          ADDWF PCL,F
          dt 0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x0a,0x0b,0x0c,0x0D,0x0E,0x0F
          dt 0x00,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x0a,0x0b,0x0c,0x0d,0x0e
          dt 0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x0a,0x0b,0x0c,0x0d,0x0e,0x00
          dt 0x00,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x0a,0x0b,0x0c,0x0d,0x0e



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 怀仁县| 辽阳县| 都兰县| 东至县| 南漳县| 柳林县| 苏尼特右旗| 新营市| 巴林右旗| 金川县| 讷河市| 鄢陵县| 万全县| 珲春市| 江陵县| 安陆市| 都匀市| 南充市| 余干县| 原平市| 蒲城县| 垫江县| 郯城县| 新绛县| 万宁市| 唐海县| 南华县| 四平市| 长沙县| 正蓝旗| 日照市| 嘉义县| 扬中市| 陆川县| 古浪县| 广平县| 高邑县| 漠河县| 怀远县| 繁昌县| 宿迁市|