PIC05循环程序结构课件

上传人:我*** 文档编号:140095830 上传时间:2020-07-26 格式:PPT 页数:27 大小:324.50KB
返回 下载 相关 举报
PIC05循环程序结构课件_第1页
第1页 / 共27页
PIC05循环程序结构课件_第2页
第2页 / 共27页
PIC05循环程序结构课件_第3页
第3页 / 共27页
PIC05循环程序结构课件_第4页
第4页 / 共27页
PIC05循环程序结构课件_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《PIC05循环程序结构课件》由会员分享,可在线阅读,更多相关《PIC05循环程序结构课件(27页珍藏版)》请在金锄头文库上搜索。

1、例:对TRISA寄存器写入一个数据0FH。,特殊功能寄存器TRISA的地址是85H ,分布在RAM的体1(bank1)中,因此在传送数据之前要把RAM的体选码设置为01。 BSF 03H, 5 H ;STATUS地址为03 MOVWF 85H MOVLW 0FH BCF 03H, 5H ;体选码还原为00 以上程序简单,但是不容易读懂,假如配合使用伪指令,程序可以修改如下: STATUS EQU 03H ;定义符号STATUS RP0 EQU 5H ;定义符号RP0 TRISA EQU 85H ;定义符号TRISA,ORG 0005H BSF 03H, 5 H ;STATUS地址为03 MOV

2、WF 85H MOVLW 0FH BCF 03H, 5H ;体选码还原为00 程序中使用了伪指令,把程序中要用到的寄存器地址和位地址,用含义清晰的符号来定义。这样虽然增加了程序的长度,但程序的可读性 却大大提高。 3.6 顺序程序结构 例:把RAM 的20H单元的8位数据分成高4位和低4位字节,并分别存入21H和22H单元的低四位中,并将这2个单元的高4位补0。,MOVF 20H,0 ;将(20H) W ANDLW 0FH ;将W高4位清0 MOVWF 21H ;W 21H SWAPF 20H,0 ANDLW 0FH ;将W高4位清0 MOVWF 22H ; W 22H 3.7 分支程序结构

3、例:将RAM的20H单元和21H单元中最大的数存入22H单元。 将参与比较的数做减法运算,如果被减数小于减数,就会发生借位(C=0),否则,不发生借位(C=1)。判断标志位C的值,就可以挑出大数。,STATUS EQU 03H ;定义符号STATUS C EQU 0 ;定义符号C MOVF 20H,0 SUBWF 21H,0 ;(21H)-WW BTFSS STATUS,C ;C=1没借位,(21H)较大 GOTO F20BIG ;C=0有借位,(20H) 较大 F21BIG MOVF 21H,0 ;(21H) W MOVWF 22H GOTO STOP F20BIG MOVF 20H,0 ;

4、(20H) W MOVWF 22H ;(W) 22H STOP GOTO STOP ;任务完成,原地等待,由于PIC指令系统中没有停机指令,可以用无条件转移指令跳转到自身实现。 3.8 循环程序结构 例 将RAM地址从30H开始的50个单元都清0。 一个循环程序由以下四个组成部分: 循环变量:一般是循环次数。 循环体:要求重复执行的程序段。 循环变量修改:为下一次的循环准备条件。 循环控制:控制循环的结束。 可以借助于间接寻址寄存器FSR,实现循环结构程序,程序片段如下:,COUNT EQU 20H ;指定20H为循环变量 FSR EQU 04H ;定义符号FSR INDF EQU 00H ;

5、指义符号INDF MOVLW D50 ;给循环变量赋初值 MOVWF COUNT MOVLW 30H ;将30H FSR MOVWF FSR NEXT CLRF INDF ;间接寻址 INCF FSR,1 ;(FSR)+1 FSR DECFSZ COUNT,1 ;计数值减1,结果为0就 ;跳到STOP处 GOTO NEXT ;执行下一次循环 STOP GOTO STOP ;停机,3.9 子程序结构,例:假设在RAM中30H开始的3个单元中存放着3个不同数。现在要求编制一段程序,把 3个数中最大的一个数找出,并放入40H单元。 解:可以把前例比较2个数大小的程序改写成子程序SUB,再编写一个主程

6、序MAIN来反复调用SUB。 假设SUB子程序有2个入口参数X和Y和 1个出口参数Z。 STATUS EQU 03H ;定义符号STATUS C EQU 00 ;定义进位借位标志C,X EOU 20H ;定义X为子程序的入口参数 Y EQU 21H ;定义Y为子程序的入口参数 Z EQU 22H ;定义Z为子程序的出口参数 MAIN MOVF 30H,0 ;第1个数X MOVWF X MOVF 31H,0 ;第2个数Y MOVWF Y CALL SUB ;第1次调用于程序 MOVF Z,0 ;将比较结果X MOVWF X MOVF 32H,0 ;第3个数Y MOVWF Y CALL SUB ;

7、第2次调用子程序 MOVF Z,0 ;最终结果Z 40H MOVWF 40H STOP GOTO STOP ;停机,;子程序(入口参数:X和Y,出口参数:Z) SUB MOVF X,0 ;将X W SUBWF Y,0 ;Y-WW BTFSS STATUS,C ;若C=1,没发生借位, ;YX,跳转到Y_BIG GOTO X_BIG ;否则,X=Y,并跳转 Y_BIG MOVF Y,0 ;将Y中的数送入W MOVWF Z ;再将它转存到Z GOTO THEEND ;跳到程序末尾 X_BIG MOVF X,0 ;将X中的数送入W MOVWF Z ;再将它转存到Z THEEND RETURN ;子程

8、序返回,3.10 程序跨页跳转和跨页调用问题 前面已经介绍过,16F87X单片机的片内FLASH程序存储器的容量分别为2K、4K和8K。 在指令系统中,有二条引起程序长距离跳转的指令GOTO和CALL,所携带的地址是11位的,也就只能在2 K(一页)的地址范围内跳转。对于只有2 K FLASH程序存储器的单片机,自然不存在程序跨页跳转的问题。但对于FLASH程序存储器超出2K的情况,就出现程序跨页跳转问题。,对于PIC16F870871872的单片机,由于只有2K的程序存储器,不必关心程序跨页跳转和跨页调用问题。 而对于其他系列16F87X单片机,程序存储器都大于2K ,地址长度都超过了11位

9、。例如16F876877的程序存储器为8K,把8K的空间分为4页,而把PCLATH位作为页面选择位,这样就可以在8K的范围内自由跳转了。 当发生跨页面的跳转时,要事先预置PCLATH 位,使其指向所希望的页面,如下图所示。,在遇到GOTO和CALL指令时,程序计数器PC的低11位,即PC由指令中的11位地址确定,而PC由PCLATH自动装载。从而可以使程序的执行可以是在4个页面之间跨页跳转。,例:假设一个源程序的主程序部分放置在页面0内,子程序部分放置在页面1内。主程序对子程序的调用是一个跨页跳转。 PCLATH EQU 0AH ;定义符号PCLATH ORG 0000H GOTO MAIN

10、;到主程序的跳转指令 ORG 0500H ;从500H开始存放主程序 MAIN BSF PCLATH,3 ;预置页选位 CALL SUB ;调用子程序 LOOP . ;从子程序返回后执行的第一条指令 ORG 0900H ;从900H开始存放子程序 SUB MOVLW 00H,. RETURN ;返回到页面0的主程序LOOP处 END ;源程序结束 在编写程序时,往往不会考虑指令在存储器中的实际存放位置,也不会注意到转移指令是否会引起跨页跳转。但MPASM对源程序汇编时,会发出警示信息,可根据提示信息对源程序进行修改,作相应的页面设置。,3.11 延时程序设计 在程序的执行过程中往往需要插入一段

11、延时时间,对此有二种方案可供选择:一是利用片内的硬件定时器,二是采用软件手段。在此介绍后面一种方法。 在编写延时程序之前,必须对PIC单片机指令系统中的每一条指令的执行时间要熟练。 在指令系统,无条件跳转的指令GOTO、CALL、RETURN、RETLW和RETFIE,占用2个指令周期;而有可能引起程序跳转的条件转移指令DECFSZ、INCFSZ、BTFSC和BTFSS的执行时间随着条件而定:,当条件为真发生跳转时需要占用二个指令周期,当条件为假不发生跳转时仅占用一个指令周期;其余指令全部仅仅占用一个指令周期。为什么对于实际引发转移的指令需要占用2个指令周期呢? 对于一条指令,取指令占用一个指

12、令周期,执行指令占用一个指令周期,但由于采用流水作业方式,取指和执行重叠进行,这样使得每条指令占用时间平均降为一个指令周期。可是在程序跳转时,流水作业方式被打破,在执行该指令的同时所抓取的下一条指令不再是下一步将要执行的指令,必须将其丢弃,从跳转目的地重新抓取,因此而多占用了一个指令周期。,另外,还应搞清单片机时基振荡器外接晶振的频率fosc ,以便确定时钟周期(Tosc=1fosc)和指令周期(Tcyc=4Tosc),以及程序执行时间的累计。 例:本例中提供了设计手法不同、延时时间也不同的3个延时子程序。 N EQU 20H ;定义寄存器变量N M EQU 21H ;定义寄存器变量M DEL

13、AY1 MOVLW X ; (1)X是待定常数 N MOVWF N ; (1) LOOP DECFSZ N,1 ; (12)N-1N,并判断结果=0? ;假如是0,则跳出循环,GOTO LOOP ;(2)否!循环回去 RETURN ;(2)返回调用程序 执行该延时子程序DELAY1所需指令周期个数为: 1+1+(1+2)(N-1)+2+2 * Tcyc 。 当时钟晶振的频率选用4 MHz时,每个指令周期Tosc为1s (Tcyc=4 fosc ),当X=99时,延时时间为0.3ms。 下面再看一个延时程序片段: DELAY2 MOVLW D100 ;(1)将初始值100 N MOVWF N ;

14、 (1),LOOP NOP ; (1)填充空操作 NOP ; (1) NOP ; (1) NOP ; (1) NOP ; (1) DECFSZ N,1 ;(12)N-1 N并判断结果=0? ;是0, 跳出循环 GOTO LOOP ;(2)否!循环回去 RETURN ; (2)返回调用程序 该程序的延时间为 1+1+(5+1+2)(100-1)+2+2 Tcyc 为了加大延时时间可以采用多重循环结构,以下就是一个二重循环实现延时的子程序:,DELAY3 MOVLW D133 ;(1) 133 M外循环变量 MOVWF M ;(1) LOOP1 MOVLW D251 ;(1) MOVWF N ; (1) 251 NM内循环变量 LOOP2 DECFSZ N,1 ;(12)N-1N=0? ;是!跳出内层循环 GOTO LOOP2 ; (2)否!继续循环 DECFSZ M,1 ;(12)M-1M=0?是!跳出循环 GOTO LOOP1 ; (2)否!循环回去 RETURN ; (2)返回调用程序 其延时为: 1+1+1+1+(1+2)*(N-1)+1+2*(M-1)+2+2*Tcyc =99 930*Tcyc =99. 930ms-100 ms,3.1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号