PIC05循环程序结构.ppt_第1页
PIC05循环程序结构.ppt_第2页
PIC05循环程序结构.ppt_第3页
PIC05循环程序结构.ppt_第4页
PIC05循环程序结构.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 ;

15、(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.12 查表程序设计,在单片机的开发应用中,经常用到查表程序,来实现代码转换、索引或翻译等。下面以LED数码管显示管的驱动程序设计为例。 LED

16、数码管内部包含8只发光二极管,其中7只发光二极管构成字型笔段(ag),1只发光二极管构成小数点(dp)。对于任何发光二极管,只要其阳极和阴极电位差高于其阈值(约为1.72.1V)就会被点亮。 根据各二极管公共端的连接方式,又分为共阴极和共阳极LED数码管,如下图所示。,驱动LED点亮的笔段码和LED所显字符之间的关系如表4.3所列。,例:用8位端口RB作为一个共阴极LED数码管的驱动端口。现在要求把寄存器20H单元中的低半字节作为一位十六进制数送到LED显示。 若用RB端口口线作为输出,首先要将RB端口的方向控制寄存器TRISB的各位全部清0。,从主程序到子程序传递参数(被显数字)以及从子程序

17、到主程序返回参数(被显数字笔段码)用的都是W。下面是实现这一功能的程序段。 CPL EQU 02H ;定义符号地址或变量 STATUS EQU 03H RP0 EQU 05H RB EQU 06H TRISB EQU 86H ORG 0000H ; 设置复位矢量 GOTO MAIN ; 跳转到主程序 ORG 0005H ; 设置主程序起始地址 MAIN BSF STATUS, RP0 ; 选择体1为当前体 CLRF TRISB ; 定义RB端口为输出 BCF STATUS,RP0 ; 恢复体0为当前体,MOVF 20H,0 ANDLW 0FH ; 屏蔽掉高4位 CALL CONVERT ; 调

18、用数码转换子程序 MOVWF RB ; 送到RB端口显示 STOP GOTO STOP ;停机 ; . CONVERT ; 子程序 ADDWF PCL,1 ; PC+WW TABLE RETLW 3FH ; 0的笔段码 RETLW 06H ; 1的笔段码 RETLW 5BH ;2的笔段码 RETLW 4FH ;3的笔段码 RETLW 66H ;4的笔段码 RETLW 6DH ;5的笔段码,RETLW 7DH ;6的笔段码 RETLW 07H ;7的笔段码 RETLW 7FH ;8的笔段码 RETLW 6FH ;9的笔段码 RETLW 77H ;A的笔段码 RETLW 7CH ;B的笔段码 RETLW 39H ;C的笔段码 RETL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论