DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 194|回复: 0
打印 上一主题 下一主题

PIC16C5X单片机程序存储器

[复制链接]
跳转到指定楼层
楼主
发表于 2011-4-30 16:25:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC16C5X系列单片机内部有一定容量的程序存储器和数据存储器,程序存储器的字节宽度为12位,用于存放用户程序和数据表格。PIC16C52有384字节的程序存储空间,PIC16C54/55的ROM空间为512字节,PIC16C56的地址空间为1024字节,PIC16C57/58则为2048个字节。PIC16C5X单片机采用的是分页寻址方式,每页位512字节,页面地址由状态寄存器f3的PA0、PA1选择。512字节的12位页内可直接寻址,较大的程序存储器可通过选择4个页、每页512字节页面来寻址,如下图所示。

但当页面之间跳转(GOTO CALL指令)必须先把f3的PA0、PA1设置为相应的页面。需要注意的是:在系统复位时,程序计数器PC将指向程序存储器最后一个页面的最后一个单元。例如PIC16C54/55指向1FFH,PIC16C56指向3FFH,PIC16C57/58则指向7FFH。状态寄存器f3的PA0、PA1指向零页空间,所以程序员在编程时需要在程序存储器底部放置一条跳转指令,跳到程序入口。

单片机执行程序时,程序计数器(PC)自动加1,程序操作支持直接、间接、相对寻址方式,能由测试、跳转指令、子程序调用指令、转移指令或把算出的地址装入PC来实现程序的跳转。片内两级堆栈为子程序嵌套提供服务。









堆栈

PIC16C5X系列单片机提供两级堆栈,参考上图。CALL指令把程序计数器加1压入堆栈1,栈1自动压入栈2,当多于两级子程序调用指令执行时,堆栈中只有存储最近两个返回地址,所以主程序中调用的子程序最多只能嵌套一次,当执行一条CALL指令,PIC16C56/57/58的f3之页面选择位PA1、PA0被装入程序计数器的最高两位,第9位清“0”,也就是子程序入口地址必须位于存储页的低半页000-0FF、200-2FF、400-4FF、600-6FF地址。但这里指的是子程序主体的起始位置,而子程序体是可以延伸到下半页面的。

PIC16C56/57/58,由于程序空间分别为1k和2k,可能存在跨页面子程序调用,所以调用子程序前须先把f3的PA1、PA0设置成该子程序所在页面地址。诚然,如果子程序与调用程序同在一个页面,则无需这个步骤。由于堆栈和PC的宽度是一样的,所以可在程序的任何地方执行CALL指令来调用子程序。当然跨页面的调用还须考虑页面地址PA1、PA0。

RETLW(子程序返回指令)把栈1内容送到程序计数器PC,同时栈2内容复制到栈1,多于两个RETLW指令运行时,栈1只会装入先前存在栈2的地址,对于PIC16C56/57,程序总是返回调用它的同一页面,不管它是处在哪个页面,也不管f3的页面选择位的设置状态如何。但是执行RETLW指令并不会改变f3中的PA1、PA0的值。w寄存器会被装入RETLW指令中所指向的数值,即立即数。这在程序存储器中实现数据查表时就非常有用。 [/td]
[tr][/tr]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-8-28 02:19 , 耗时 0.091854 秒, 19 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表