⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pic16cxxx-8.htm

📁 PIC单片机C语言教程!绝对经典
💻 HTM
📖 第 1 页 / 共 2 页
字号:
                  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>&nbsp;&nbsp;&nbsp;&nbsp;另外像PIC16C8X、PIC16C62X等一些功能寄存器及其位的定义用户也可以自己加进这个文件中。</p>
            <p>§8.2 程序设计基础<br>
              <br>
              一、设置I/O口的输入/输出方向<br>
              <br>
              &nbsp;&nbsp;&nbsp;&nbsp;PIC16CXX的I/O口一般为双向可编程,即每一根I/O端线都可分别单独地由程序设置为输入或输出。这个过程由写I/O控制寄存器TRISf来实现,写入值为&quot;1&quot;,则为输入;写入值为 
              &quot;0&quot;,则为输出。</p>
            <p><img src="image/a372.gif" width="378" height="211" hspace="30"></p>
            <p> <br>
              二、检查寄存器是否为零<br>
              <br>
              &nbsp;&nbsp;&nbsp;&nbsp;如果要判断一个寄存器内容是否为零,很简单:<br>
            </p>
            <p><img src="image/a373.gif" width="461" height="211" hspace="30"></p>
            <p>三、比较二个寄存器的大小</p>
            <p> &nbsp;&nbsp;&nbsp;&nbsp;要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位C来判断。注意,相减的结果放入W,则不会影响二寄存器原有的值。<br>
              例如F8和F9二个寄存器要比较大小:<br>
              <img src="image/c6.gif" width="381" height="180" hspace="30"> </p>
            <p>四、循环n次的程序<br>
              <br>
              &nbsp;&nbsp;&nbsp;&nbsp;如果要使某段程序循环执行n次,可以用一个寄存器作计数器。下例以F10做计数器,使程序循环8次。<br>
              <img src="image/a374.gif" width="506" height="262" hspace="30"> 
            </p>
            <p>五、&quot;IF......THEN......&quot;格式的程序<br>
              <br>
              &nbsp;&nbsp;&nbsp;&nbsp;下面以&quot;IF X=Y THEN GOTO NEXT&quot;格式为例。</p>
            <p><img src="image/a376.gif" width="425" height="226" hspace="30"></p>
            <p>六、&quot;FOR......NEXT&quot;格式的程序<br>
              <br>
              &nbsp;&nbsp;&nbsp;&nbsp;&quot;FOR......NEXT&quot;程序使循环在某个范围内进行。下例是&quot;FOR 
              X=0 TO 5&quot;格式的程序。F10放X的初值,F11放X的终值。</p>
            <p><img src="image/a379.gif" width="484" height="361" hspace="30"></p>
            <p>七、&quot;DO WHILE......END&quot;格式的程序<br>
              <br>
              &nbsp;&nbsp;&nbsp;&nbsp;&quot;DO WHILE......END&quot;程序是在符合条件下执行循环。下例是&quot;DO 
              WHILE X=1&quot;格式的程序。F10放X的值。</p>
            <p><img src="image/a380.gif" width="423" height="277" hspace="30"></p>
            <p>八、查表程序<br>
              <br>
              &nbsp;&nbsp;&nbsp;&nbsp;查表是程序中经常用到的一种操作。下例是将十进制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>&nbsp;&nbsp;&nbsp;&nbsp;设LED为共阳,则0~9数字对应的线段值如下表:<br>
              &nbsp;&nbsp;&nbsp;&nbsp;PIC的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入W,接着调用子程序,子程序的第一条指令将W置入PC,则程序跳到数据地址的地方,再由&quot;RETLW&quot;指令将数据放入W返回到主程序。</p>
            <p><img src="image/a382.gif" width="344" height="120" hspace="50"></p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;下面程序以F10放表头地址。</p>
            <p><img src="image/a383.gif" width="448" height="339" hspace="30"></p>
            <p>九、&quot;READ......DATA,RESTORE&quot;格式程序<br>
              <br>
              &nbsp;&nbsp;&nbsp;&nbsp;&quot;READ......DATA&quot;程序是每次读取数据表的一个数据,然后将数据指针加1,准备下一次取下一个数据。下例程序中以F10被数据表起始地址,F11做数据指针。</p>
            <p><img src="image/a384.gif" width="436" height="396" hspace="30"></p>
            <p> &nbsp;&nbsp;&nbsp;&nbsp;如果要执行&quot;RESTORE&quot;,只要执行一条&quot;CLRF 
              POINTER&quot;即可。</p>
            <p>十、延时程序<br>
              <br>
              &nbsp;&nbsp;&nbsp;&nbsp;如果延时时间较短,可以让程序简单地连续执行几条空操作指令&quot;NOP&quot;。如果延时时间长,可以用循环来实现。下例以F10计算,使循环重复执行100次。</p>
            <p><img src="image/a385.gif" width="435" height="133" hspace="30"></p>
            <p> &nbsp;&nbsp;&nbsp;&nbsp;延时程序中计算指令执行的时间和即为延时时间。如果使用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>&nbsp;&nbsp;&nbsp;&nbsp;延时时间=(1+1+1+1+2)*100+2=602(μS)。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;用几个循环嵌套的方式可以大大延长延时时间。如下例用2个循环来做延时。</p>
            <p><img src="image/a388.gif" width="431" height="210" hspace="50"></p>
            <p> &nbsp;&nbsp;&nbsp;&nbsp;延时时间=[(1+2)*6+2+]+1+2+1+1+*100+2=5502(μS)</p>
            <p>十一、寄存器体(Bank)的寻址<br>
              <br>
              在PIC16CXX中,寄存器有2个体:<br>
              &nbsp;&nbsp;&nbsp;&nbsp;Bank0: 00H~7FH<br>
              &nbsp;&nbsp;&nbsp;&nbsp;Bank1: 80H~FFH<br>
              &nbsp;&nbsp;&nbsp;&nbsp;而在PIC16CXX的指令代码中,只有7位是寄存器的地址位,所以指令中只能直接寻址一个体,因此在状态寄存器STATUS中增加RP0位(STATUS&lt;5&gt;)来选体。<br>
              &nbsp;&nbsp;&nbsp;&nbsp;以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">&nbsp;</td>
          <td>&nbsp;</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>&nbsp;</td>
        </tr>
        <tr> 
          <td>&nbsp;</td>
        </tr>
      </table></td>
  </tr>
</table> 
 
</body> 
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -