
PIC单片机程序设计基础教程.doc
12页1、PIC单片机程序的基本格式先介绍二条伪指令:EQU——标号赋值伪指令ORG——地址定义伪指令PTC16C5X单片机在RESET后指令计算器PC被置为全“1”,所以PTC16C5X 几种型号芯片的复位地址为:PIC16C54/55: 1FFHPIC16C56: 3FFHPIC16C57/58: 7FFH一般来说,PTC单片机的源程序并没有要求统一的格式,大家可以根据自己 的风格来编写但这里我们推荐一种清晰明了的格式供参考TITLE This is …… ;程序标题.;名称定义和变量定义F0EQU0RTCCEQU1PCEQU2STATUSEQU3FSREQU4RAEQU5RBEQU6RCEQUa i7PTC16C54.■EQU1FFH ;芯片复位地址PIC16C56EQU3FFHPIC16C57EQU7FFHORG PIC16C54 GOTO MAIN ;在复位地址处转入主程序ORG 0 ;在0000H开始存放程序DELAY MOVLW 255. a■RETLW 0MAINMOVLW B ‘00000000’TRIS RB ; RB已由伪指令定义为6,即B 口a a .■BSF RB, 7 CALL DELAYBCF RB, 7 CALL DELAYGOTO LOOPEND ;程序结束注:MAIN标号一•定要处在。
页面内2、PIC单片机程序设计基础1)设置I/O 口的输入/输出方向PTC16C5X单片机的T/0 口皆为双向可编程,即每一根I/O端线都可分别单 独地由程序设置为输入或输出这个过程由写I/O控制寄存器TRIS f来实现, 写入值为“1”,则为输入;写入值为“0”,则为输出MOVLW OFH ; 0000 1111 (OFH)输入输出TRTS 6 ;将W中的OFH写入B 口控制器,;B口高4位为输出,低4位为输入MOVLW OCOH ; 11 000000 (OCOH)RB4, RB5 输出 0 RB6, RB7 输出 12)检查寄存器是否为零如果要判断一个寄存器内容是否为零,很简单,现以寄存器F10为例:MOVF 10, 1BTFSS STATUS, ZGOTO NZ;F10-F10,结果影响零标记状态位Z;F10为零则跳;Z=0即F10不为零转入标号NZ处程序;Z=1即F10=0处理程序3) 比较二个寄存器的大小要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位C来判 断注意,相减的结果放入W,则不会影响二寄存器原有的值例如F8和F9二个寄存器要比较大小:MOVF 8, 0 SUBWF 9, 0 BTFSC STATUS, Z GOTO F8=F9BTFSC STATUS, C GOTO F9>F8 GOTO F9 COUNT EQU 10•■I.MOVLW 8MOVWF COUNT LOOP;F8->W;F9—W (F8) 一 W;判断F8二F9否;C=0则跳;C=1相减结果为正,F9>F8;C=0相减结果为负,F9 下例是“DO WHILE X=l” 格式的程序F10放X的值X EQU 10a ■.■MOVLW 1MOVWF XLOOPa ii sMOVLW 1SUBWF X, 0BTFSS STATUS, ZGOTO LOOPI I,8) 查表程序若以B 口的RBO〜RB6来驱动LED的a〜g线段,则有如下关系:RB7 RB6 RB5 RB4 RB3RB2 RBI RBO国 I I J >如押未用 g f e d a查表是程序中经常用到的一种操作下例是将十进制〜9转换成7段LED 数字显示值PIC单片机的查表程序可以利用子程序带值返回的特点来实现具体是在主 程序中先取表数据地址放入W,接着调用子程序,子程序的第-•条指令将W置入 PC,则程序跳到数据地址的地方, 序下面程序以F10放表头地址MOVLWMOVWF再由“RETLW”指令将数据放入W返回到主程TABLE10;表头地址一F10MOVLWADDWFCALLMOVWF10, 1CONVERT6;1->W,准备取“1”的线段值;F10+W二“1”的数据地址;线段值置到B 口,点亮LEDCONVERT MOVWFRETLWRETLW2OCOII0F9H;W-*PC TABLE;“0”线段值;气"线段值RETLW9) “READ……90HDATA, RESTORE";“9”线段值 格式程序“READ……DATA”程序是每次读取数据表的—•个数据,然后将数据指针加1,准备取下一个数据。 下例程序中以F10为数据表起始地址,FU做数据指针POINTER EQU 11■.I.MOVLW DATAMOVWF 10CLRF POINTER;定义FU名称为POINTER;数据表头地址一Fl0;数据指针清零设LED为共阳,则〜9数字对应的线段值如下表:十进数线段值十进数线段值0COH592H1C9II682112A4H7F8H3BOH880H499H990HMOVFADDWFPOINTER, 010, 0;W =F10+P0INTERINCFCALL CONVERTPOINTER,;指针加1;调子程序,取表格数据CONVERT MOVWF 2DATA RETLW 20H;数据地址PC;数据;数据,只要执行一条“CLRF POINTER”即可RETLW 15H如果要执行“RESTORE”10) 延时程序如果延时时间较短,可以让程序简单地连续执行几条空操作指令“N0P” 如果延时时间长,可以用循环来实现下例以F10计算,使循环重复执行100 次MOVLW D 100MOVWF 10LOOP DECFSZ 10, 1 ; F10—l->F10,结果为零则跳GOTO LOOPa i a延时程序中计算指令执行的时间和即为延时时间。 如果使用4MHz振荡,则 每个指令周期为1 mSo所以单周期指令时间为1 US,双周期指令肘间为2 uSo 在上例的LOOP循环延时时间即为:(1+2) *100+2=302 (邱)在循环中插入 空操作指令即可延长延时时间:MOVLW D ‘100’MOVWF 10LOOP NOPNOPNOPDECFSZ 10, 1GOTO LOOP•I I .延时时间二(1+1+1+1+2) *100+2=602 (uS) o用几个循环嵌套的方式可以大大延长延时时间下例用2个循环来做延时:MOVLWD ‘100’MOVWF10LOOPMOVLWDMOVWF11L00P1DECFSZ11, 1GOTOLOOP!DECFSZ10, 1GOTO LOOP延时时间=1+1+[1+1+ (1+2) *16-1+1+2]*100-1=5201 ( y S)11) PIC单片机RTCC计数器的使用RTCC是一个脉冲计数器,它的计数脉冲有二个来源,一个是从RTCC引脚输 入的外部信号,一个是内部的指令时钟信号可以用程序来选择其中一•个信号源 作为输入RTCC可被程序用作计时之用;程序读取RTCC寄存器值以计算时间。 当RTCC作为内部计时器使用时需将RTCC管脚接VDD或VSS,以减少干扰和耗电 流下例程序以RTCC做延时:RTCC. ■EQU1•SCLRFRTCC;RTCC 清 0M0VLW0711OPTION;选择预设倍数L 256—RTCCMOVLW255;RTCC计数终值SUBWFRTCC,0BTFSSSTATUS,Z ; RTCC二255?GOTO LOOPLOOP这个延时程序中,每过256个指令周期RTCC寄存器增1 (分频比=1: 256), 设芯片使用4MHz振荡,则:延时时间二256*256二65536 ( u S)RTCC是自振式的,在它计数时,程序可以去做别的事情,只要隔一段时间 去读取它,检测它的计数值即可12)寄存器体(BAM)的寻址对于PIC16C54/55/56,寄存器有32个,只有一个体(BANK),故不存在体 寻址问题,对于PIC16C57/58来说,寄存器则有80个,分为4个体(BANK0-BANK3)o 在对F4(FSR)的说明中可知,F4的bit6和bit5是寄存器体寻址位,其对应关 系如下:Bit6Bit5BANK物理地址00BANKO10H-1FH01BANK13011—3FII10BANK250H-5FH11BANK370H〜7FH当芯片上电RESET后,F4的bit6,bit5是随机的,非上电的RESET则保持 原先状态不变。 下面的例子对BAXK1和BAXK2的30H及50H寄存器写入数。












