打印

查表寄存器TBR的用法请教

[复制链接]
3807|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mugangzhu|  楼主 | 2009-9-9 11:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PORT_INT_SET:
LDI TBR,0FH;????????????
STA PPBCR,07H ;PORTB 内部上拉电阻使能
LDI PORTB,0FH ;打开PORTB 内部上拉电阻
NOP ;等待稳定
NOP
NOP
LDI TBR,00H
STA PBIF,07H ;清PORTB 中断请求标志????????????
LDI TBR,0FH
STA PBIEN,07H ;PORTB 中断使能?????????????????
LDI IRQ,00H ;清中断请求标志
LDI IE,0001B ;打开PORT 中断
STOP ;进入STOP 模式
NOP ;单片机从STOP 模式被PORT 中断唤醒, PBIF 被写入了中断请求标志
NOP
想请教一下上面程序中查表寄存器TBR是如何运用的?
沙发
warm_ice| | 2009-9-9 11:31 | 只看该作者
其实书上写的很清楚,你认真看会找到答案的,在第28页.

内容如下:
RTNW
指令格式        RTNW H,L
指令描述        从子程序中返回上一层程序,H参数赋值给TBR,L参数赋值给累加器A,同时将堆栈的内容弹栈
表达式        PC   ST,TBR  H,A  L
指令编码        11010 000h hhh LLLL
影响的标志位        无
RTNW指令用于从子程序中返回上一层程序,执行此条指令时,CPU首先进行现场恢复,将保存在堆栈中最顶层的PC+1值弹出,同时将该指令的操作数H赋值给TBR寄存器,将参数L赋值给累加器A。

这一指令的主要作用有两点,一点可以实现固定数据表中数据的读取,第二点是可以实现程序的散转。
           注意:执行此条指令时,弹栈的只是PC值,不包括CY。
               
                例2-4-41:读取位于$302 处的数据表中的数据
                TBR        EQU        OEH
                TEMP        EQU        20H
                        :
                        :
                001A          LDI      TBR,00H   ;put index value (high nibble) 0 into TBR.
                001B          LDI      TEMP,02   ;put index value (low nibble) 2 into AC
                001C          CALL     300H       ;call subprogram.
                001D           :
                        :
                    :
                          ORG      300H
                0300          TJMP                ; get destination address $0302H according to (PC11~PC8),TBR,AC
                0301           RTNW     00H,01H
                0302            RTNW     00H,02H    ;return to main program, HTBR,LAC
                0303            RTNW     04H,05H
                0304           RTNW     09H,08H
                0305        :

使用特权

评论回复
板凳
mugangzhu|  楼主 | 2009-9-9 11:48 | 只看该作者
是啊,我也注意到这一点了,可是上面程序中
STA PPBCR,07H ;PORTB 内部上拉电阻使能
直接写成LDI  PPBCR,0FH;不就行了,为什么还要用查表寄存器TBR呢?

使用特权

评论回复
地板
warm_ice| | 2009-9-9 12:03 | 只看该作者
是啊,我也注意到这一点了,可是上面程序中
STA PPBCR,07H ;PORTB 内部上拉电阻使能
直接写成LDI  PPBCR,0FH;不就行了,为什么还要用查表寄存器TBR呢?
mugangzhu 发表于 2009-9-9 11:48

这又是另外一个问题了,呵呵.
RAM也是分区的,00H~7FH为bank0,所有指令可直接操作,80H~FFH为bank1,以此类推,非bank0的寄存器有很多指令是无法直接操作的.
以您问的这条指令中的PPBCR,即为非bank0寄存器,不能像您说的直接用LDI指令进行赋值.

使用特权

评论回复
5
mugangzhu|  楼主 | 2009-9-9 12:24 | 只看该作者
谢谢啊,ROM分区和RAM分区的方式不一样吗?ROM中是000-7FFH为bank0,还有就是通过LDI TBR,0FH
STA PPBCR,07H ;PPBCR就成了0FH,中间这个过程是怎么回事?bank7中那么多地址很多啊

使用特权

评论回复
6
warm_ice| | 2009-9-9 13:21 | 只看该作者
谢谢啊,ROM分区和RAM分区的方式不一样吗?ROM中是000-7FFH为bank0,还有就是通过LDI TBR,0FH
STA PPBCR,07H ;PPBCR就成了0FH,中间这个过程是怎么回事?bank7中那么多地址很多啊 ...
mugangzhu 发表于 2009-9-9 12:24

ROM也有分区,跟RAM不一样.
你举的这个例子是RAM分区的例子,不是ROM的.
如果您是初学者,建议您先不用关注ROM分区的事,以免造成混淆.

使用特权

评论回复
7
mugangzhu|  楼主 | 2009-9-9 13:40 | 只看该作者
好的,谢谢啊
LDI TBR,0FH;
STA PPBCR,07H ORTB 内部上拉电阻使能;????????????????????
LDI PORTB,0FH ;打开PORTB 内部上拉电阻
问号部分,PPBCR怎么就成了0FH呢?

使用特权

评论回复
8
warm_ice| | 2009-9-9 15:03 | 只看该作者
好的,谢谢啊
LDI TBR,0FH;
STA PPBCR,07H ORTB 内部上拉电阻使能;????????????????????
LDI PORTB,0FH ;打开PORTB 内部上拉电阻
问号部分,PPBCR怎么就成了0FH呢?
mugangzhu 发表于 2009-9-9 13:40

STA指令是把累加器的值赋给寄存器PPBCR,经过LDI TBR,0FH后,累加器的值为F,再使用STA指令对PPBCR赋值,所以PPBCR的值也为F.

使用特权

评论回复
9
mugangzhu|  楼主 | 2009-9-9 15:56 | 只看该作者
那直接用STA PPBCR, 00H就可以了啊,为什么要用STA PPBCR, 07H呢?

使用特权

评论回复
10
warm_ice| | 2009-9-9 16:35 | 只看该作者
那直接用STA PPBCR, 00H就可以了啊,为什么要用STA PPBCR, 07H呢?
mugangzhu 发表于 2009-9-9 15:56

呵呵,问题又回到了4楼我的回复上。
PPBCR寄存器在RAM的BANK7内,所以用07H,或者根据不用写07H及其前面的逗号,编译器会自动处理

使用特权

评论回复
11
mugangzhu|  楼主 | 2009-9-9 16:47 | 只看该作者
谢谢啊,真是麻烦你了,可是我还是感觉疑惑如果不写连07H都不写的话他怎么就知道把0FH给PPBCR呢,
难道系统早就定义好了吗?!

使用特权

评论回复
12
warm_ice| | 2009-9-9 16:50 | 只看该作者
谢谢啊,真是麻烦你了,可是我还是感觉疑惑如果不写连07H都不写的话他怎么就知道把0FH给PPBCR呢,
难道系统早就定义好了吗?!
mugangzhu 发表于 2009-9-9 16:47

定义寄存器的时候会定义它的地址,编译的时候编译器会自动处理。

使用特权

评论回复
13
mugangzhu|  楼主 | 2009-9-10 07:41 | 只看该作者
谢谢啊!非常感谢你的帮助!
PDINE实际地址为384H
PDIF实际地址为385H,
为什么定义时是这样定义的
;************************************************
; 系统寄存器(Bank7)
;************************************************
PDIEN EQU 04H ;PORTD 口中断使能标志
PDIF EQU 05H ;PORTD 口中断请求标志
而实际的Bank7应该为310-38F这个区间啊,
要是按这样的算法310H应该是Bank7的00H,38F应该是Bank7的7FH,那么就应该这样定义啊
PDIEN EQU  74H ;PORTD 口中断使能标志????????
PDIF EQU  75H ;PORTD 口中断请求标志?????????

使用特权

评论回复
14
warm_ice| | 2009-9-10 09:10 | 只看该作者
1.PDINF和PDIF等系统寄存器的地址是芯片定义好的,查询芯片的规格书即可了解。
2.PDIEN,PDIF像你这样定义也没有错,只是这样定义后,您对这2个寄存器操作时,在相应的指令中RAM的BANK值及前面的逗号就不能省略不写,如果省略掉,则编译器会误认为是对RAM的BANK0中的74H,75H进行操作。

使用特权

评论回复
15
mugangzhu|  楼主 | 2009-9-10 09:21 | 只看该作者
规格书中是这样定义的啊
PDIEN的地址为384H
PDIF的地址是385H

使用特权

评论回复
16
warm_ice| | 2009-9-10 09:26 | 只看该作者
规格书中是这样定义的啊
PDIEN的地址为384H
PDIF的地址是385H
mugangzhu 发表于 2009-9-10 09:21

是啊,所以通常你按规格书中的实际地址定义即可。
当然,像你前面定义的方式也是对的,那个地址是在BANK7的相对地址,两种定义方式的区别我刚在回帖中已经说明了。

使用特权

评论回复
17
mugangzhu|  楼主 | 2009-9-10 09:49 | 只看该作者
可是我还有点模糊384H、385H和04H、05H有什么关系啊,
还有下面这个如果不写可不可以?
;************************************************
; 系统寄存器BANK6(LCD)
;************************************************

;************************************************
; 程序
;************************************************

;*******************************************
; 子程序: BASETIEMR 中断服务程序
;*******************************************

;*******************************************
; 上电程序
;*******************************************

使用特权

评论回复
18
warm_ice| | 2009-9-10 10:13 | 只看该作者
例如384H,写成2进制就是11  1000  0100,最前面的3位是RAM的BANK值,此例中为111,即7,把BANK值去掉,后面剩下的0000100,即为04H。

程序中带";"的为注释语句,是为了方便理解程序,可以不写。

使用特权

评论回复
19
mugangzhu|  楼主 | 2009-9-10 10:18 | 只看该作者
好的,我明白了,谢谢啊!
我还有一个问题想请教一下
就是在时基定时器中定时时间和时钟源之间是什么一个关系?
教程中第99页那个例子我怎么就算不明白啊?

使用特权

评论回复
20
warm_ice| | 2009-9-10 10:23 | 只看该作者
这个看一下规格书应该就清楚了。规格书中没有说明的是振荡源进来后先要4分频。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

358

帖子

1

粉丝