<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

PIC16系列單片機的查表

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏
1 PC、PCL、PCLATCH三者之間的關(guān)系

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

本文引用地址:http://dyxdggzs.com/article/201611/322590.htm

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

  PCL是程序計數器的低8位,可讀寫(xiě)。在程序執行過(guò)程中, 因PC會(huì )不斷改變, 所以PCL也會(huì )跟著(zhù)改變。同樣,改變PCL的值會(huì )改變PC的值, 從而實(shí)現程序的跳轉。

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

2程序跳轉

(1)PC絕對跳轉

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

  例:

  CALL SUB1
  GOTO SUB2

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

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

  例:

  PAGESEL SUB1   
  CALL SUB1

(2)PC相對跳轉

  用ADDWF 指令可實(shí)現程序的相對跳轉。

  例:

  ADDWF PCL,F  
  RETLW 0x01
  RETLW 0X02

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

3查表的實(shí)現

  雖然PIC16單片機沒(méi)有專(zhuān)用的查表指令,但可利用ADDWF PCL,F指令實(shí)現查表,下面舉例說(shuō)明。

(1)簡(jiǎn)單的查表程序

  程序說(shuō)明: OFFSET為偏移地址, 假設程序起始地址為0X20, PCL與W相加后不會(huì )有進(jìn)位。

  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)通用的的查表程序

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

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個(gè)數據的查表程序

  程序說(shuō)明: OFFSETH、OFFSETL為偏移地址的高8位和低8位??蓪AIN、LOOK_UP、TABLE三個(gè)子程序置于程序區任意位置。

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



關(guān)鍵詞: PIC16系列單片機查

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>