📄 pic21.htm
字号:
<font face="宋体">存储器的页。这些页位来自于</font>PCLATH<font face="宋体"><</font>4<font face="宋体">:</font>3<font face="宋体">>。当执行</font>CALL<font face="宋体">、</font>GOTO<font face="宋体">指令时,用户必须确保这些页位的编程等指向要求的程序存储器的页。</font></p>
<p align="justify" class="lh15"><font face="宋体">如果执行</font>CALL<font face="宋体">指令,整个</font>13<font face="宋体">位被压入堆栈。所以对于返回指令不要求</font>
<font face="宋体">对</font>PCLATH<font face="宋体"><</font>4<font face="宋体">:</font>3<font face="宋体">>位的管理。因为</font>PC<font face="宋体">的值将会由退栈而获得。注意:</font>PIC16C84<font face="宋体">忽略了</font>PCLATH<font face="宋体"><</font>4<font face="宋体">:</font>3<font face="宋体">>位,这些位用于程序存储页</font>1<font face="宋体">,</font>2<font face="宋体">,</font>3<font face="宋体">(</font>0800H<font face="宋体">-</font>1FFFH<font face="宋体">),不可以把</font>PIC16C84<font face="宋体">的</font>PCLATH<font face="宋体"><</font>4<font face="宋体">:</font>3<font face="宋体">>位用作通用读/写位,这会影响将来产品的向上兼容。</font></p>
<p align="justify" class="lh15">4<font face="宋体">-</font>3<font face="宋体">间接寻址,</font>INDF<font face="宋体">和</font>FSR<font face="宋体">的作用</font></p>
<p align="justify" class="lh15">INDF<font face="宋体">寄存器不是物理寄存器,只是被用来与</font>FSR<font face="宋体">寄存器连接以执行间接寻址。</font></p>
<p align="justify" class="lh15"><font face="宋体">使用</font>INDF<font face="宋体">寄存器,就可以实现间接寻址。</font></p>
<p align="justify" class="lh15"><font face="宋体">使用</font>INDF<font face="宋体">寄存器的任何指令,实际寻址数据是由文件选择寄存器(</font>FSR<font face="宋体">)所决定的。读</font>INDF<font face="宋体">自身(</font>FSR<font face="宋体">=</font>0<font face="宋体">),将产生</font>00H<font face="宋体">。向</font>INDF<font face="宋体">写,结果无操作(显然可以提供状态位)。</font>8<font face="宋体">位</font>FSR<font face="宋体">寄存器同状态寄存器</font>STATUS<font face="宋体"><</font>7<font face="宋体">>(</font>IRP<font face="宋体">)组合可以得到</font>9<font face="宋体">位地址。</font></p>
<p align="justify" class="lh15"><font face="宋体">然而</font>PIC16C84<font face="宋体">是不用</font>IRP<font face="宋体">的。使用下面的例程序,通过间接寻址清零。</font>2OH<font face="宋体">~</font>2FH<font face="宋体">单位。</font></p>
<p align="justify" class="lh15">MOVLW 20H <font face="宋体">;初始化</font>RAM<font face="宋体">的指针</font></p>
<p align="justify" class="lh15">MOVF FSR <font face="宋体">;到</font>FSR</p>
<p align="justify" class="lh15">NEXT CLRF INDF <font face="宋体">;通过间接寻址清</font>0<font face="宋体">,由</font>FSR<font face="宋体">的内容所指问的寄存器。</font></p>
<p align="justify" class="lh15">INCF FSR <font face="宋体">;(</font>FSR<font face="宋体">)+</font>1<font face="宋体">→</font>FSR</p>
<p align="justify" class="lh15">BIFSS FSR<font face="宋体">,</font>4<font face="宋体">;当</font>FSR<font face="宋体">的第</font>4<font face="宋体">位为</font>1<font face="宋体">跳过下一条指令</font></p>
<p align="justify" class="lh15">GOTO NEXT <font face="宋体">;否则入。</font></p>
<p align="justify" class="lh15"><font face="宋体">五</font> I<font face="宋体">/</font>O<font face="宋体">端口</font></p>
<p align="justify" class="lh15">PIC16C84<font face="宋体">具有两个</font>I<font face="宋体">/</font>O<font face="宋体">端口,</font>PORTA<font face="宋体">,</font>PORTB<font face="宋体">。某些端口的引脚用来与另外一些功能复用。</font></p>
<p align="justify" class="lh15">5<font face="宋体">-</font>1 PORTA<font face="宋体">和</font>TRISA<font face="宋体">寄存器</font></p>
<p align="justify" class="lh15">PIC16C84<font face="宋体">的</font> PORTH<font face="宋体">是</font>5<font face="宋体">位宽度的锁存器。</font>RA4<font face="宋体">是施密特触发器输入,一个集电极开路输出。端口</font>A<font face="宋体">的所有其它的引脚为</font>TTL<font face="宋体">电平输入,含</font>CMOS<font face="宋体">输出驱动。所有引脚有数据方向位(</font>TRISA<font face="宋体">寄存器),可通过</font>TRI
SA<font face="宋体">来配置</font>PORTA<font face="宋体">的引脚是输入式输出。设置</font>TRISA<font face="宋体">的某位为</font>1<font face="宋体">,则对应的</font>
PORTA<font face="宋体">的位为输入,若设置为</font>0<font face="宋体">,对应的</font>PORTA<font face="宋体">的某位为输出。</font></p>
<p align="justify" class="lh15"><font face="宋体">读</font>PORTA<font face="宋体">寄存器,读入引脚的状态,向</font>PORTA<font face="宋体">写入,则写到</font>PORTA<font face="宋体">的锁存器。所有的写操作都是读--修改--写操作。当向端口写时,它首先读端口引脚,然后修改其位,再写入端口的数据锁存器。下面这段程序是对端口</font>A<font face="宋体">的初始化:</font></p>
<p align="justify" class="lh15">CLRF PORTA<font face="宋体">;初始化端口</font>A</p>
<p align="justify" class="lh15">BSF STATUS<font face="宋体">,</font>RPO<font face="宋体">;选择</font>1<font face="宋体">块</font></p>
<p align="justify" class="lh15">MovLW CFH <font face="宋体">;用于初始化数据方向的值</font></p>
<p align="justify" class="lh15">MOVWF TRISA<font face="宋体">;设置</font>RA<font face="宋体"><</font>3<font face="宋体">:</font>0<font face="宋体">>为输入;</font>RA<font face="宋体"><</font>5<font face="宋体">:</font>4<font face="宋体">>为输出</font>
<font face="宋体">;<</font> 7<font face="宋体">:</font>6<font face="宋体">>总是为</font>0<font face="宋体">(无用)</font></p>
<p align="justify" class="lh15">RA4<font face="宋体">是为</font>TMRO<font face="宋体">的时钟输入复用。即如果这一位用作</font>TMRO<font face="宋体">的时钟输入,则端口</font>A<font face="宋体">就不能用</font>RA4<font face="宋体">。</font></p>
<p align="justify" class="lh15">5<font face="宋体">-</font>2 PROTB<font face="宋体">和</font>TRISB<font face="宋体">寄存器</font></p>
<p align="justify" class="lh15">PORTB<font face="宋体">是</font>8<font face="宋体">位宽度的双向端口。相应的数据由</font>TRISB<font face="宋体">决定,方法用端口</font>A<font face="宋体">。</font></p>
<p align="justify" class="lh15"><font face="宋体">端口</font>B<font face="宋体">的每一个引脚都具有内部弱的上拉电阻。通过一个控制位可以打开所有上拉电阻。这可通过对</font>OPTION<font face="宋体"><</font>7<font face="宋体">></font>RBPU<font face="宋体">位的置</font>1<font face="宋体">,清</font>0<font face="宋体">来控制。当端口引脚配置成输出时,内部弱上拉电阻被自动关闭。上位是</font>
<font face="宋体">端口需要的。</font>PORTB<font face="宋体">的</font>4<font face="宋体">个引脚</font>RBT<font face="宋体">~</font>RB4<font face="宋体">具有信号改变中断的功能,只要将这几个引脚配置为输入,就可能引起中断的发生。在输入方式下,引脚的位与最后一次读</font>PORTB<font face="宋体">的值进行比较,这四个引脚中有任何一个或多个不相同,产生</font>RBIF<font face="宋体">中端(置</font>INTCON<font face="宋体"><</font>0<font face="宋体">>)。这个中断可能将</font>
<font face="宋体">器件由</font>SLEEP<font face="宋体">状态下唤醒。用户在中断服务程序中可以用这样的两个方法之一来清除中断。①通过清</font>0RBIE<font face="宋体">(</font>INT
CON<font face="宋体"><</font>3<font face="宋体">>位)关闭中断,②</font> <font face="宋体">读端口</font>B<font face="宋体">,则清</font>0
RBIF<font face="宋体">位。</font></p>
<p align="justify" class="lh15"><font face="宋体">不相等的条件将继续配置</font>1RBIF<font face="宋体">位为止。读</font>PORTB<font face="宋体">将结束不相等条件,并允许</font>RBIF<font face="宋体">被清</font>0<font face="宋体">。这一特征为软件可配置上拉一起允许用户非常容易的使用</font>PORTB<font face="宋体">作为键盘输入的接口。也就可以通过按键来唤醒系统。</font></p>
<p align="justify" class="lh15"><font face="宋体">注意:如果正在执行敛僮鳎琁/</font>O<font face="宋体">引脚改变了信号,</font>RBIF<font face="宋体">中断标志不可能被置成</font>1<font face="宋体">。</font></p>
<p align="justify" class="lh15"><font face="宋体">建议用改变信号中断作为按键唤醒操作,</font>PORTB<font face="宋体">只不用改变信号中断,建议不要用查询方式。图</font>4<font face="宋体">-</font>7<font face="宋体">是用端口作键盘接口的原理图其</font>R1<font face="宋体">为</font>ESD<font face="宋体">保护而新选择的电阻。使用此接口时,通过软件选择保持内部上拉,即</font>RB4<font face="宋体">~</font>RB7<font face="宋体">为高,设置为输入方式。</font>RB0<font face="宋体">~</font>RB3<font face="宋体">输出。任何键被按下,</font>RB4<font face="宋体">~</font>RB7<font face="宋体">的某一根线将改变从而产生中断。这个中断可以唤醒芯片,用这种方法可以节省计时器资源。</font></p>
<p align="justify" class="lh15">16<font face="宋体">个键</font></p>
<p align="justify" class="lh15">RB4 100</p>
<p align="justify" class="lh15">RB5</p>
<p align="justify" class="lh15">RB6</p>
<p align="justify" class="lh15">RB7</p>
<p align="justify" class="lh15">RB0</p>
<p align="justify" class="lh15">RB1</p>
<p align="justify" class="lh15">RB2</p>
<p align="justify" class="lh15">BR3</p>
<p align="justify" class="lh15">Rf</p>
<p align="justify" class="lh15"><font face="宋体">图</font>4<font face="宋体">-</font>7<font face="宋体">利用端口</font>B<font face="宋体">的键盘接口图。</font></p>
<p align="justify" class="lh15">5<font face="宋体">-</font>3 I<font face="宋体">/</font>O<font face="宋体">编程的考虑</font></p>
<p align="justify" class="lh15"><font face="宋体">任何对端口的写操作,在内部都是读-修改-写。例如</font>BCF<font face="宋体">,</font>BSF
<font face="宋体">指令,先将寄存器读入</font>CPU<font face="宋体">,执行位操作,将结果写回寄存器。例如对</font>
PORTB<font face="宋体">执行</font>BSF<font face="宋体">操作,首先将</font>PORTB<font face="宋体">的</font>8<font face="宋体">位读入</font>CPU<font face="宋体">,在</font>Bit5<font face="宋体">上进行</font>BSF<font face="宋体">操</font>
<font face="宋体">作,将这一位置</font>1<font face="宋体">,将</font>PORTB<font face="宋体">写回输出锁存器,如果这个时候</font>PORTB<font face="宋体">的</font>bit0<font face="宋体">用作输入引脚,则先将</font>PORTB<font face="宋体">读入</font>CPU<font face="宋体">,然后进行有关操作,结果写回</font>PORTB<font face="宋体">的锁存器,并复盖了先前的内容,如果</font>bit0<font face="宋体">一直保持在输入方式,这一操作是没有问题,但如果</font>bit0<font face="宋体">在销后又改变成输出方式,数据锁存器的内容是未知的。</font></p>
<p align="justify" class="lh15"><font face="宋体">实际写</font>I<font face="宋体">/</font>O<font face="宋体">端口发生在一个指令周期的结束,而读一个</font>I<font face="宋体">/</font>O<font face="宋体">端口,其有效的数据必须在指令周期的开始就出现。因此,对一个</font>I<font face="宋体">/</font>O<font face="宋体">通道相断执行读,写操作,要考虑数据的可靠性。为此,应在这两条指令之间加入一条</font>NOP<font face="宋体">指令就可以保证数据的可靠性。</font></p>
<p align="justify" class="lh15"><font face="宋体">六、计时器。</font></p>
<p align="justify" class="lh15"><font face="宋体">(</font>TMRO<font face="宋体">)模式</font>
TMRO<font face="宋体">计时/计数器模式具有如下特点:</font></p>
<p align="justify" class="lh15"><font face="宋体">·</font>8<font face="宋体">位计时计数器</font></p>
<p align="justify" class="lh15"><font face="宋体">·可读,可写</font></p>
<p align="justify" class="lh15"><font face="宋体">·</font>8<font face="宋体">位软件可编程的预分配器</font></p>
<p align="justify" class="lh15"><font face="宋体">·从</font>FFH<font face="宋体">到</font>00H<font face="宋体">产生溢出中断</font></p>
<p align="justify" class="lh15"><font face="宋体">·具有外部时钟的边沿选择</font></p>
<p align="justify" class="lh15">TMRO<font face="宋体">模式的简单框图与</font>PIC16C6X<font face="宋体">系列相同。它可以经过清</font>0
TOCs <font face="宋体">位(即</font>TION<font face="宋体"><</font>5<font face="宋体">>)来选择计时器方式。在计时器方式,</font>TMRO<font face="宋体">模式对每个指令周期加</font>1<font face="宋体">(没有预分频器),如果对</font>TMRO<font face="宋体">写操作,则计时器为加</font>
<font face="宋体">(操作后两个周期被禁止。)</font></p>
<p align="justify" class="lh15"><font face="宋体">量</font>TOCS<font face="宋体">为</font>1<font face="宋体">(</font>OPTION<font face="宋体"><</font>5<font face="宋体">>)选择</font>TMRO<font face="宋体">为计数器方式。这种方式下</font>
TM<font face="宋体">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -