📄 pic16cxxx-8.htm
字号:
CHS2 EQU 5 ;-┘<br>
ADCS0 EQU 6 ;-┐A/D频率<br>
ADCS1 EQU 7 ;-┘选择<br> <br>
;ADCON1位定义 <br>
PCFG0 EQU 0 ;-┐<br>
PCFG1 EQU 1 ; │A/D口设置<br>
PCFG2 EQU 2 ;-┘<br> <br>
;PIR1位定义<br>
TMR1IF EQU 0 ;TMR1中断标志<br>
TMR2IF EQU 1 ;TMR2中断标志<br>
CCP1IF EQU 2 ;CCP1中断标志<br>
SSPIF EQU 3 ;SSP中断标志<br>
TXIF EQU 4 ;SCI发送中断标志<br>
RCIF EQU 5 ;SCI接收中断标志<br>
ADIF EQU 6 ;A/D中断标志<br>
PSPIF EQU 7 ;并行口中断标志<br> <br>
;PIR2位定义<br>
CCP2IF EQU 0 ;CCP2中断标志<br> <br>
;SSPCON位定义<br>
SSPM0 EQU 0 ;-┐<br>
SSPM1 EQU 1 ; │SPI或I2C模式及<br>
SSPM2 EQU 2 ; │分频比设置 <br>
SSPM3 EQU 3 ;-┘<br>
CKP EQU 4 ;时钟上升/下降沿选择<br>
SSPEN EQU 5 ;串行口使能<br>
SSPOV EQU 6 ;接收到数据标志位<br>
WCOL EQU 7 ;准备好发送数据标志位<br> <br>
;CCP1CON位定义<br>
CCP1M0 EQU 0 ;-┐<br>
CCP1M1 EQU 1 ; │CCP1模式选择及<br>
CCP1M2 EQU 2 ; │分频比设置<br>
CCP1M3 EQU 3 ;-┘<br>
CCP1Y EQU 4 ;-┐PWM模式中10位脉宽<br>
CCP1X EQU 5 ;-┘系数的低2位<br> <br>
;CCP2CON位定义<br>
CCP2M0 EQU 0 ;-┐<br>
CCP2M1 EQU 1 ; │CCP2模式选择<br>
CCP2M2 EQU 2 ; │及分频比设置<br>
CCP2M3 EQU 3 ;-┘<br>
CCP2Y EQU 4 ;-┐PWM模式中10位<br>
CCP2X EQU 5 ;-┘脉宽系数的低2位<br> <br>
;TRISE位定义<br>
PSPMODE EQU 4 ;并行口模式选择<br>
IBOV EQU 5 ;读、写并行口冲突标志<br>
OBF EQU 6 ;准备好发送并行口数据<br>
IBF EQU 7 ;接收到并行口数据<br> <br>
;RCSTA位定义<br>
RCD8 EQU 0 ;接收到数据的第9bit<br>
OERR EQU 1 ;溢出错误标志<br>
FERR EQU 2 ;传输间断错误标志<br>
CREN EQU 4 ;连续接收位<br>
SREN EQU 5 ;单个接收位<br>
RC8/9 EQU 6 ;8bit/9bit选择<br>
SPEN EQU 7 ;串行口使能<br> <br>
;PIE1位定义<br>
TMR1IE EQU 0 ;T1中断允许<br>
TMR2IE EQU 1 ;T2中断允许<br>
CCP1IE EQU 2 ;CCP1中断允许<br>
SSPIE EQU 3 ;SSP中断允许<br>
TXIE EQU 4 ;T2中断允许<br>
RCIE EQU 5 ;RC中断允许<br>
ADIE EQU 6 ;A/D中断允许(16C72/73/74)<br>
PSPIE EQU 7 ;PSP中断允许<br> <br>
;PIE2位定义<br>
CCP2IE EQU 0 ;CCP2中断允许<br>
;上电寄存器PCON<br>
POR EQU 1 ;上电复位标志<br> <br>
;SSPSTAT位定义<br>
BF EQU 0 ;接收完标志<br>
UA EQU 1 ;要求更新地址标志<br>
R/W EQU 2 ;读写控制<br>
S EQU 3 ;I2C模式起始位<br>
P EQU 4 ;I2C模式停止位<br>
D/A EQU 5 ;数据/地址标志<br> <br>
;TXSTA位定义<br>
TXD8 EQU 0 ;发送数据的第9bit<br>
TRMT EQU 1 ;传输寄存器空标志<br>
BRGH EQU 2 ;速率选择<br>
SYNC EQU 4 ;同步/异步选择<br>
TXEN EQU 5 ;发送选通<br>
TX8/9 EQU 6 ;8bit/9bit格式选择<br>
CSRC EQU 7 <br> </td>
</tr>
</table>
<p> 另外像PIC16C8X、PIC16C62X等一些功能寄存器及其位的定义用户也可以自己加进这个文件中。</p>
<p>§8.2 程序设计基础<br>
<br>
一、设置I/O口的输入/输出方向<br>
<br>
PIC16CXX的I/O口一般为双向可编程,即每一根I/O端线都可分别单独地由程序设置为输入或输出。这个过程由写I/O控制寄存器TRISf来实现,写入值为"1",则为输入;写入值为
"0",则为输出。</p>
<p><img src="image/a372.gif" width="378" height="211" hspace="30"></p>
<p> <br>
二、检查寄存器是否为零<br>
<br>
如果要判断一个寄存器内容是否为零,很简单:<br>
</p>
<p><img src="image/a373.gif" width="461" height="211" hspace="30"></p>
<p>三、比较二个寄存器的大小</p>
<p> 要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位C来判断。注意,相减的结果放入W,则不会影响二寄存器原有的值。<br>
例如F8和F9二个寄存器要比较大小:<br>
<img src="image/c6.gif" width="381" height="180" hspace="30"> </p>
<p>四、循环n次的程序<br>
<br>
如果要使某段程序循环执行n次,可以用一个寄存器作计数器。下例以F10做计数器,使程序循环8次。<br>
<img src="image/a374.gif" width="506" height="262" hspace="30">
</p>
<p>五、"IF......THEN......"格式的程序<br>
<br>
下面以"IF X=Y THEN GOTO NEXT"格式为例。</p>
<p><img src="image/a376.gif" width="425" height="226" hspace="30"></p>
<p>六、"FOR......NEXT"格式的程序<br>
<br>
"FOR......NEXT"程序使循环在某个范围内进行。下例是"FOR
X=0 TO 5"格式的程序。F10放X的初值,F11放X的终值。</p>
<p><img src="image/a379.gif" width="484" height="361" hspace="30"></p>
<p>七、"DO WHILE......END"格式的程序<br>
<br>
"DO WHILE......END"程序是在符合条件下执行循环。下例是"DO
WHILE X=1"格式的程序。F10放X的值。</p>
<p><img src="image/a380.gif" width="423" height="277" hspace="30"></p>
<p>八、查表程序<br>
<br>
查表是程序中经常用到的一种操作。下例是将十进制0~9转换成7段LED数字显示值。若以B口的RB0~RB6来驱动LED的a~g线段,则有如下关系:</p>
<p><img src="image/a381.gif" width="420" height="146" hspace="30"></p>
<p> 设LED为共阳,则0~9数字对应的线段值如下表:<br>
PIC的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入W,接着调用子程序,子程序的第一条指令将W置入PC,则程序跳到数据地址的地方,再由"RETLW"指令将数据放入W返回到主程序。</p>
<p><img src="image/a382.gif" width="344" height="120" hspace="50"></p>
<p> 下面程序以F10放表头地址。</p>
<p><img src="image/a383.gif" width="448" height="339" hspace="30"></p>
<p>九、"READ......DATA,RESTORE"格式程序<br>
<br>
"READ......DATA"程序是每次读取数据表的一个数据,然后将数据指针加1,准备下一次取下一个数据。下例程序中以F10被数据表起始地址,F11做数据指针。</p>
<p><img src="image/a384.gif" width="436" height="396" hspace="30"></p>
<p> 如果要执行"RESTORE",只要执行一条"CLRF
POINTER"即可。</p>
<p>十、延时程序<br>
<br>
如果延时时间较短,可以让程序简单地连续执行几条空操作指令"NOP"。如果延时时间长,可以用循环来实现。下例以F10计算,使循环重复执行100次。</p>
<p><img src="image/a385.gif" width="435" height="133" hspace="30"></p>
<p> 延时程序中计算指令执行的时间和即为延时时间。如果使用4MHz振荡,则每个指令周期为1μS。所以单周期指令执行时间为1μS,双周期指令为2μS。在上例的LOOP循环延时时间即为:(1+2)*100+2=302(μS)。在循环中插入空操作指令即可延长延时时间:</p>
<p><img src="image/a387.gif" width="238" height="186" hspace="50"></p>
<p> 延时时间=(1+1+1+1+2)*100+2=602(μS)。<br>
用几个循环嵌套的方式可以大大延长延时时间。如下例用2个循环来做延时。</p>
<p><img src="image/a388.gif" width="431" height="210" hspace="50"></p>
<p> 延时时间=[(1+2)*6+2+]+1+2+1+1+*100+2=5502(μS)</p>
<p>十一、寄存器体(Bank)的寻址<br>
<br>
在PIC16CXX中,寄存器有2个体:<br>
Bank0: 00H~7FH<br>
Bank1: 80H~FFH<br>
而在PIC16CXX的指令代码中,只有7位是寄存器的地址位,所以指令中只能直接寻址一个体,因此在状态寄存器STATUS中增加RP0位(STATUS<5>)来选体。<br>
以PIC16C64为例,假设用户要操作Bank1中的A0寄存器,则应:<br>
BSF STATUS,RP0 ;选Bank1<br>
MOVLW 55H<br>
MOVWF 0XA0 ;55H→A0H寄存器<br>
BCF STATUS,RP0 ;恢复到Bank0<br>
如果不作选体(假设目前是在Bank0):<br>
MOVLW 55H<br>
MOVWF 0XA0<br>
那么55H实际上不是置入Bank1中的A0H寄存器,而是Bank0中的20H寄存器!
<p><a href="PIC16Cxxx-1.htm">第一章</a> <a href="PIC16Cxxx-2.htm">第二章</a>
<a href="PIC16Cxxx-3.htm">第三章</a> <a href="PIC16Cxxx-4.htm">第四章</a>
<a href="PIC16Cxxx-5.htm">第五章</a> <a href="PIC16Cxxx-6.htm">第六章</a>
<a href="PIC16Cxxx-7.htm">第七章</a> <a href="PIC16Cxxx-8.htm">第八章</a>
<a href="PIC16Cxxx-9.htm">第九章</a> <a href="PIC16Cxxx-10.htm">第十章</a></p></td>
</tr>
</table>
<table width="700" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="20"> </td>
<td> </td>
</tr>
</table>
<table width="700" border="0" cellspacing="0" cellpadding="0">
<tr bgcolor="#990000">
<td height="1" width="634"></td>
</tr>
<tr align="right">
<td height="6"></td>
</tr>
<tr align="right">
<td><font color="#990000" size="2">[ <a href="index.htm">返回</a> ]</font>
</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -