您当前的位置:五五电子网电子知识单片机-工控设备源码-程序PIC系列单片机程序设计 正文
PIC系列单片机程序设计

PIC系列单片机程序设计

点击数:7608 次   录入时间:03-04 11:44:18   整理:http://www.55dianzi.com   源码-程序

    1、PIC单片机程序的基本格式

    先介绍二条伪指令:

    EQU ——标号赋值伪指令

    ORG ——地址定义伪指令

    PIC16C5X单片机在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为:

    PIC16C54/55:1FFH

    PIC16C56:3FFH

    PIC16C57/58:7FFH

    一般来说,PIC单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。

     TITLE This is …… ;程序标题
   ;--------------------------------------
   ;名称定义和变量定义
   ;--------------------------------------
   F0    EQU  0
   RTCC   EQU  1
   PC    EQU  2
   STATUS  EQU  3
   FSR   EQU  4
   RA    EQU  5
   RB    EQU  6
   RC    EQU  7  
       ┋
   PIC16C54 EQU 1FFH ;芯片复位地址
   PIC16C56 EQU 3FFH
   PIC16C57 EQU 7FFH
   ;-----------------------------------------
   ORG PIC16C54 GOTO MAIN   ;在复位地址处转入主程序
   ORG   0          ;在0000H开始存放程序
   ;-----------------------------------------
   ;子程序区
   ;-----------------------------------------
   DELAY MOVLW 255
      ┋
       RETLW 0
   ;------------------------------------------
   ;主程序区
   ;------------------------------------------
   MAIN
      MOVLW B‘00000000’
      TRIS RB       ;RB已由伪指令定义为6,即B口
       ┋
   LOOP
       BSF RB,7 CALL DELAY        
       BCF RB,7 CALL DELAY
        ┋
       GOTO LOOP
   ;-------------------------------------------
       END       ;程序结束

   注:MAIN标号一定要处在0页面内。
 

   



www.55dianzi.com

    2、PIC单片机程序设计基础

    1) 设置 I/O 口的输入/输出方向

    PIC16C5X单片机的I/O 口皆为双向可编程,即每一根I/O 端线都可分别单独地由程序设置为输入或输出。这个过程由写I/O控制寄存器TRIS f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。

    MOVLW 0FH  ;0000 1111(0FH)
             输入 输出
       TRIS 6    ;将W中的0FH写入B口控制器,
             ;B口高4位为输出,低4位为输入。
       MOVLW 0C0H ; 11 000000(0C0H)
              RB4,RB5输出0 RB6,RB7输出1

2) 检查寄存器是否为零

如果要判断一个寄存器内容是否为零,很简单,现以寄存器F10为例:
       MOVF 10,1      ;F10→F10,结果影响零标记状态位Z
       BTFSS STATUS,Z    ;F10为零则跳
       GOTO NZ        ;Z=0即F10不为零转入标号NZ处程序
       ┋          ;Z=1即F10=0处理程序

3) 比较二个寄存器的大小

要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位C来判断。注意,相减的结果放入W,则不会影响二寄存器原有的值。
   例如F8和F9二个寄存器要比较大小:
       MOVF 8,0       ;F8→W
       SUBWF 9,0      ;F9—W(F8)→W
       BTFSC STATUS,Z    ;判断F8=F9否
       GOTO F8=F9
       BTFSC STATUS,C    ;C=0则跳
       GOTO F9>F8       ;C=1相减结果为正,F9>F8
       GOTO F9<F8       ;C=0相减结果为负,F9<F8
         ┋

4) 循环n次的程序

如果要使某段程序循环执行n次,可以用一个寄存器作计数器。下例以F10做计数器,使程序循环8次。
       COUNT EQU 10     ;定义F10名称为COUNT(计数器)
          ┋
       MOVLW 8
       MOVWF COUNT LOOP   ;循环体
    LOOP
           ┋
       DECFSZ COUNT,1    ;COUNT减1,结果为零则跳
       GOTO LOOP       ;结果不为零,继续循环
           ┋       ;结果为零,跳出循环

5)“IF……THEN……”格式的程序

下面以“IF X=Y THEN GOTO NEXT”格式为例。
       MOVF X,0      ;X→W
       SUBWF Y,0     ;Y—W(X)→W
       BTFSC STATUS,Z   ;X=Y 否
       GOTO NEXT      ;X=Y,跳到NEXT去执行。
          ┋       ;X≠Y

   6)“FOR……NEXT”格式的程序

   “FOR……NEXT”程序使循环在某个范围内进行。下例是“FOR X=0 TO 5”格式的程序。F10放X的初值,F11放X的终值。
       START  EQU  10
       DAEND  EQU  11
           ┋
       MOVLW 0
       MOVWF START     ; 0→START(F10)
       MOVLW 5
       MOVWF DAEND     ;5→DAEND(F11)
   LOOP
           ┋
      INCF START,1     ;START值加1
      MOVF START,0
      SUBWF DAEND,0     ;START=DAEND ?(X=5否)
      BTFSS STATUS,Z
      GOTO LOOP        ;X<5,继续循环
           ┋       ;X=5,结束循环

   7)“DO WHILE……END”格式的程序

   “DO WHILE……END”程序是在符合条件下执行循环。下例是“DO WHILE X=1”格式的程序。F10放X的值。
      X  EQU  10
        ┋
      MOVLW  1
      MOVWF  X     ;1→X(F10),作为初值
   LOOP
        ┋
      MOVLW 1
      SUBWF X,0
      BTFSS STATUS,Z   ;X=1否?
      GOTO LOOP      ;X=1继续循环
        ┋        ;X≠1跳出循环

   



www.55dianzi.com



8) 查表程序

查表是程序中经常用到的一种操作。下例是将十进制0~9转换成7段LED数字显示值。若以B口的RB0~RB6来驱动LED的a~g线段,则有如下关系:

      6

设LED为共阳,则0~9数字对应的线段值如下表:

    1.jpg

    PIC单片机的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入W,接着调用子程序,子程序的第一条指令将W置入PC,则程序跳到数据地址的地方,再由“RETLW”指令将数据放入W返回到主程序。下面程序以F10放表头地址。

       MOVLW  TABLE     ;表头地址→F10  
       MOVWF  10
          ┋
       MOVLW  1        ;1→W,准备取“1”的线段值
       ADDWF  10,1      ;F10+W =“1”的数据地址
       CALL  CONVERT
       MOVWF  6        ;线段值置到B口,点亮LED
          ┋
   CONVERT MOVWF  2        ;W→PC TABLE
       RETLW  0C0H      ;“0”线段值
       RETLW  0F9H      ;“1”线段值
          ┋
       RETLW  90H       ;“9”线段值

9)“READ……DATA,RESTORE”格式程序

“READ……DATA”程序是每次读取数据表的一个数据,然后将数据指针加1,准备取下一个数据。下例程序中以F10为数据表起始地址,F11做数据指针。

[1] [2] [3]  下一页


本文关键字:单片机程序  源码-程序单片机-工控设备 - 源码-程序