历史上的今天

今天是:2024年11月18日(星期一)

2019年11月18日 | PC、PCL、PCLATCH三者之间的关系

发布者:BlossomSunrise 来源: 51hei关键字:PC  PCL  PCLATCH 手机看文章 扫描二维码
随时随地手机看文章

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 


关键字:PC  PCL  PCLATCH 引用地址:PC、PCL、PCLATCH三者之间的关系

上一篇:PIC单片机调试心得
下一篇:PIC单片机片内EEPROM运用方法

推荐阅读

  “警察叔叔,这个机器人好可爱啊,它叫什么名字?”“它叫安安警官,正在协助我们执勤。”广州海珠警方在广州塔景区启用的-2000警用机器人上岗执勤,不少市民群众前来围观。   这位名为“安安警官”的警用机器人高1.6米,重80公斤,白胖圆润,可爱呆萌,身上贴有“警察”“POLICE”等警方标识。   “安安警官”的投入使用,是广州海珠警方坚...
RapidIO总线的出现及其体系结构和应用传统总线多采用并线总线的工作方式,这类总线一般分为三组:数据线,地址线和控制线。实现此类总线互连的器件所需引脚数较多,例如对于64位数据宽的总线,一般由64根数据线,32-40根地址线以及30根左右的控制线,另外由于半导体制造工艺的限制还要加上一定数量的电源引线和地线,总共会有约200根左右的引线,这给器件...
集微网11月17日消息,今天,OPPO正式发布“卷轴屏”概念机OPPO X 2021,概念机采用了卷轴设计加上OLED柔性屏,以全新的方式对屏幕进行弯曲,屏幕能像画卷一样顺滑、平整的展开,实现了几乎“零折痕”的屏幕效果。OPPO X 2021卷轴屏概念机搭载一块伸缩自如,可大可小的无级OLED柔性卷轴屏,最小6.7英寸、最大可至7.4英寸。自研的双矩阵嵌入式离合结构、...
中国上海,2021年11月18日——东芝电子元件及存储装置株式会社(“东芝”)今日宣布,推出一款高压晶体管输出车载光耦---“TLX9188”,用于包括电动汽车在内的汽车设备的信号隔离通信。该产品于今日开始支持批量出货。 TLX9188的高压光电晶体管提供了200V的集电机-发射极额定电压,较东芝目前的TLX9185A高2.5倍,是东芝首款达到该水平的产品[1]。通过指定...

史海拾趣

问答坊 | AI 解惑

文章要求论点明确,论据可靠,数字准确,文字精练,引文及参考书目格式规范。

  文章要求论点明确,论据可靠,数字准确,文字精练,引文及参考书目格式规范。经验交流文章应力 求结合理论分析,文责自负。文稿采用word格式和txt格式两种格式,电子邮件投稿。投稿邮箱:lw82990065@126.com     &n ...…

查看全部问答∨

L298的1引脚(sense A)问题

请教:我把L298的1引脚直接与7805的地相连,同时连单片机的地,可有时候电机不转,测这两点电势竟然不为0,而且为3V多???还有为了能让小车爬上跷跷板,把L298驱动电压达到7V,这样对小车电机影响大?小车电机一般驱动电压为多 ...…

查看全部问答∨

基于DSP的PCI高速测控系统结构(2)

先进先出存储器 在DMA传输方式下,由于PCI9054内部的FIFO只有32级深度,实时传送高速数据时,PCI9054内部的FIFO会很快存满,而DSP内的数据仍会源源不断的传送过来,易造成数据的丢失,因此必须要扩展外部FIFO。 本系统采用I D T公司高速CMOS同步F ...…

查看全部问答∨

怎么让机械表省电←省电精灵

怎么让机械表省电←省电精灵c卡预付费电表控制器※电表倒转QQ:272208552 电话:13115998303 如何让插卡电表倒走,【网站打不开请点百度快照】如何使电表慢走 电表倒转的原因 ic卡电表偷电方法 电表节电器控制器电表控制器,电表干扰器:微电脑控表器 ...…

查看全部问答∨

新手求助,Win CE的问题~~

各位前辈高手:   我用vb.net2005开发Win CE程序   请问怎么读取文件,读取文件的路径是什么?   我用下面的代码,可以走到第3行就挂了。    Dim fi As FileInfo    fi = New FileInfo(" ...…

查看全部问答∨

新手聊CM3学习

首先声明,我不是专业做开发的,有过理想,但是始终没有实现,只是一个业余爱好者,如有说得不好不对的,还请斧正。才接触CM3,我是打算从外设库入手的。从以往8位16位单片机到32位,寄存器控制是不现实的,而大量的库函数以及各种定义又让咱这些身 ...…

查看全部问答∨

3.5库中SYSTICK的使用

如题,SYSTICK的使用看起来似乎很简单,但编译时总是提示错误,请教各位STM32的前辈了。…

查看全部问答∨

问个关于UART的基础问题

想要用中断数据,FIFO的深度设置为1/8。比如我想要发送8个字符数据时,先在其他函数里面用UARTCharPut发送2个字符,引起UART_INT_RX中断,接下来应该在中断中发送剩余的6个字符还是完整的8个字符?…

查看全部问答∨

学模拟+RS-232至RS-485转换器

本帖最后由 dontium 于 2015-1-23 11:46 编辑 看过好多讲RS-232至RS-485转换器的文章,都是迷迷糊糊的,可能是我水平不够,不过看完这篇文章,脑子有点想法了,解释的很是到位。好文章。顶deyisupport./blog/b/analogwire/archive/2013/11/22/rs-2 ...…

查看全部问答∨

Sensor Tag活动搭建环境-安装IAR for 8051过程分享,,,

本帖最后由 qwqwqw2088 于 2014-3-16 23:28 编辑 Sensor Tag活动遇到的麻烦太多了,除了收到Sensor Tag后,用的TI提供的APK,找了ipad mini平板演示了几个传感器,然后下载各种开发套件的硬件资料,CC2540DK-MIN的PDF,看TI的视频等等,,,,不 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved