为什么在 16F84 中使用 porta 而不是 trisa 功能?

Why the use of porta in stead of trisa functions works in a 16F84?

还在学习PIC编程。

我遇到了清单顶部所示的以下操作代码。在此代码中,初始化期间使用 PORT 寄存器,TRIS 寄存器作出反应。我不明白为什么这有效并且无法弄清楚为什么?根据我目前所学,这段代码应该无法正常工作。

代码的第二部分包含我所做的更改。

我在初始化期间使用 TRIS 寄存器而不是 PORT 寄存器。 根据我目前所学,我的代码应该是正确的。

过程中使用了MPLAB模拟器。寄存器信息来自特殊功能寄存器。

INIT       

            MOVLW H'C0'                ; PB6 & PB7 inputs all others outputs
            MOVWF PORTB                ;  TRISB is changing. WHY?
            MOVLW H'10'                ; Port RA4 input, others outputs
            MOVWF PORTA                ;  TRISA is changing. WHY? 
            MOVLW H'03'                ; prescaler on TMR0 and 1:16
            OPTION                     
            MOVLW H'A0'                ; GIE & T0IE set T0IF cleared
            MOVWF INTCON               
            MOVLW H'F4'                ; initialize INTCNT
            MOVWF INTCNT               
            MOVLW H'06'                ; initialize FUDGE
            MOVWF FUDGE                
            CLRF OFFSET                ; initialize OFFSET
            RETURN                     

;阅读手册后,似乎需要进行一些更改才能正确初始化

INIT        BSF   STATUS,RP0            ;Change to Bank1 
            MOVLW B'11000000'          ; PB6 & PB7 inputs all others outputs
            MOVWF TRISB
            MOVLW B'00010000'          ; Port RA4 input, others outputs
            MOVWF TRISA                 
            MOVLW H'03'                ; prescaler on TMR0 and 1:16
            MOVWF OPTION_REG
            MOVLW H'A0'                ; GIE & T0IE set T0IF cleared
            MOVWF INTCON               
            MOVLW H'F4'                ; initialize INTCNT
            MOVWF INTCNT               
            MOVLW H'06'                ; initialize FUDGE
            MOVWF FUDGE                
            CLRF OFFSET                ; initialize OFFSET
            RETURN 

一切都在datasheet第 2.2 节:数据存储器组织中进行了描述

The data memory is partitioned into two areas. The first is the Special Function Registers (SFR) area, while the second is the General Purpose Registers (GPR) area.The SFRs control the operation of the device. Portions of data memory are banked. This is for both the SFR area and the GPR area.

因此,当我们编写单个 CPU 指令时,您可以看到 SFR/GPR 地址长 7 位!地址的第 8 位是存储器 Bank 选择位,该位不是单个 14 位指令的一部分。 另请检查:PIC16CXXX 指令集!例如,您可以检查 DECF 指令。它由14位组成:b'00 0011 dfff ffff' 其中'd'是方向,'fff ffff'是7位地址。 要寻址超过 7 位,您需要 PIC16F84 的分页机制,这是存储在 STATUS SFR 中的单个位 RP0。因为PIC16F84只有8位数据存储器地址space.

检查PORTATRISA7位地址,可以看到是一样的(0x05),但是第8位不同。并且必须通过 RP0 位使用另一条指令设置该位,您在示例中使用的是:BSF STATUS,RP0 指令。

请记住 MPLAB 编译器不知道设置了哪个存储区,因此两个标签 PORTATRISA 都是正确的。