收藏 分享(赏)

04汇编语言及其程序设计.ppt

上传人:天天快乐 文档编号:756361 上传时间:2018-04-21 格式:PPT 页数:82 大小:898.50KB
下载 相关 举报
04汇编语言及其程序设计.ppt_第1页
第1页 / 共82页
04汇编语言及其程序设计.ppt_第2页
第2页 / 共82页
04汇编语言及其程序设计.ppt_第3页
第3页 / 共82页
04汇编语言及其程序设计.ppt_第4页
第4页 / 共82页
04汇编语言及其程序设计.ppt_第5页
第5页 / 共82页
点击查看更多>>
资源描述

1、第 1页,第四章 PIC汇编语言及其程序设计,4.1PIC的RISC指令集4.2 MPASM 汇编语言4.3汇编语言的寻址模式4.4MPASM常用子程序设计,第 2页,PICmicro 单片机指令集按操作数访问形式分类,NOP-空操作MOVWFf把W内容送fCLRW-清除WCLRFf清除fSUBWFf,df减去WDECFf,df递减1IORWFf,dW和f逻辑或ANDWFf,dW和f逻辑与XORWFf,dW和f逻辑异或ADDWFf,dW和f相加MOVFf,d传送fCOMFf,df取反INCFf,df递增1DECFSZf,df递减1, 结果为0则跳RRFf,d带进位循环右移RLFf,d带进位循环

2、左移SWAPFf,df高低4位内容交换INCFSZf,df递增1, 结果为0则跳,BCFf,bf位清0BSFf,bf位置1BTFSCf,bf位测试, 为0则跳BTFSSf,bf位测试, 为1则跳,SLEEP-进入低功耗休眠模式CLRWDT-清看门狗RETLWkW带立即数返回RETFIE-中断返回RETURN-子程序返回CALLk调用子程序GOTOk强行跳转(k为9位地址描述)MOVLWkW置立即数IORLWkW和立即数逻辑或ADDLWkW和立即数相加SUBLWk立即数减去WANDLWkW和立即数逻辑与XORLWkW和立即数逻辑异或,字节操作,位操作,立即数和控制操作,f = 寄存器, k =

3、立即数 (8位), b = 位地址 , d = 目的地 (1=f, 0=W),第 3页,PIC指令集核心助记符,第 4页,指令系统字符说明,第 5页,1,2,1,典型指令分析,MyVar,MOVFMyVar,W,INCFMyVar,F,W or WREG,File Registers,MOVWFMyVar,2,1,立即数,MOVLW1,第 6页,PICmicro 单片机指令集字节操作,14位内核之字节操作指令构成,操作码,d,f,f,f,f,f,f,f,d = 目的地标志位d = 0 结果送Wd = 1 结果送f,f = 7位寄存器地址,例如:ADDWF REG, WADDWF f, d,NO

4、P-MOVWFfCLRW-CLRFfSUBWFf,dDECFf,dIORWFf,dANDWFf,dXORWFf,dADDWFf,dMOVFf,dCOMFf,dINCFf,dDECFSZf,dRRFf,dRLFf,dSWAPFf,dINCFSZf,d,字节操作指令,第 7页,PIC单片机指令集位操作,14位内核之位操作指令构成,OP CODE,b,f,f,f,f,f,f,f,b = 3-Bit Address(Bit Number),f = 7-bit Register Address,b,b,Example:BTFSCSTATUS, CBTFSCf, b,BCFf,bBSFf,bBTFSCf,

5、bBTFSSf,b,位操作,第 8页,k,14位内核之立即数操作指令构成,OP CODE,k,k,k,k,k,k,k,k = 8-bit Immediate Value,例:MOVLW0x2FMOVLWk,MOVLWkIORLWkADDLWkSUBLWkANDLWkXORLWk,立即数操作,PIC单片机指令集立即数操作,第 9页,k,14位内核之RETLW指令构成,OP CODE,k,k,k,k,k,k,k,k = 8-bit Immediate Value,SLEEP-CLRWDT-RETLWkRETFIE-RETURN-CALLkGOTOk,控制类操作,14位内核之CALL /GOTO指令

6、构成,OP CODE,k = 11-bit Immediate Value,k,k,k,k,k,k,k,k,k,k,k,PIC单片机指令集控制类操作,第 10页,数据传送类指令 4 条算术运算类指令 6 条逻辑运算类指令 14 条控制转移类指令 11 条,PIC16F877指令集的35条指令按操作码的类别分为四类指令,第 11页,数据传送类指令,第 12页,程序举例,例1、编程将立即数20H传送到通用寄存器20H中,MOVLW 20HMOVWF 20H,第 13页,MOVF 20H,WMOVWF 40HMOVF 30H,WMOVWF 20HMOVF 40H,WMOVWF 30H,例2、编程将通

7、用寄存器20H和30H中的内容进行交换,第 14页,算术运算类指令,d=1,结果保存在f中,d=0,结果保存在w中,第 15页,逻辑运算类指令1,第 16页,逻辑运算类指令2,第 17页,控制转移类指令1,第 18页,控制转移类指令(续),第 19页,4.1.6 指令流水线,由于PIC 单片机的系统结构采用“哈佛”结构,使得在一条指令被执行的同时读取下一条指令成为可能,这就是PIC 单片机的指令执行流水线概念。,第 20页,例1、编程将通用寄存器20H存入立即数0FH,把20H的数据与立即数24H相“与”后,结果存入通用寄存器40H中。,ORG 0000HNOPMOVLW 0FHMOVWF 2

8、0HANDWF 24H,1MOVWF 40H,程序举例,第 21页,例2、分析程序段,指出程序执行后,存储单元的结果,MOVLW 22H - 22H MOVWF 22H 22H 22HADDWF 22F , F 44H 22HINCF 22F,F 45H 22HSWAPF 22H,W 45H 54HRLF 22H , F 8AH 54H,22H W,MOVLW 22H MOVWF 22H ADDWF 22F , F INCF 22F,F SWAPF 22H,W RLF 22H , F,第 22页,要想控制单片机端口的输入输出,首先需对端口方向寄存器和数据寄存器进行设置,引脚的方向寄存器的相应位

9、设置为1表示输入;设置为0表示输出,端口的输入输出控制,例:将RA4/T0CKI引脚设置为输入状态,BSF STATUS,RP0BSF TRISA,4,第 23页,例:将RB0/INT引脚设置为输入状态,BSF STATUS,RP0BSF TRISB,0,例:将端口C的低四位设置为输出、高四位设置为输入,BSF STATUS,RP0MOVLW 0F0HMOVWF TRISC,第 24页,例:从端口C的低四位引脚输出高电平、高四位引脚输出为低电平,BSF STATUS,RP0MOVLW 0MOVWF TRISCMOVLW 0FHMOVWF PORTC,第 25页,例2、编程将数据存储器20H低4

10、位和30H高4位组合成一个8位数据并从RC端口输出。,ORG 0000HNOPBANKSEL TRISCMOVLW 00HMOVWF TRISCBANKSEL PORTCMOVF 20H,W,ANDLW 0FHMOVWF 20HMOVF 30HMOVF 30H,WANDLW 0F0HIORWF 20H,WMOVWF PORTC,第 26页,4.2 MPASM汇编语言,4.2.1 MPASM简介4.2.2 MPASM的语法4.2.3 MPASM的伪指令4.2.4 MPASM的运算符4.2.5 MPASM的内置宏指令,第 27页,4.2.1 MPASM简介,在MPLAB IDE中已经集成了MPAS

11、M编译器工具集。用户在MPLAB IDE中即可实现对汇编程序的编译、连接、调试和编程。MPLAB安装后汇编编译器的可执行文件名为MPASMWIN.EXE,如是缺省安装则存放路径“C:PROGRAM FILESMICROCHIPMPASM SUITE”下。此目录下还有一个MPLINK.EXE的可执行文件,在多模块(多源文件)可重定位的程序开发模式下,最后一定要用MPLINK把所有的程序与数据模块连接定位成一个目标文件(机器码文件)。但在绝对定位的程序开发模式下,MPLINK将不会被用到。,第 28页,4.2.2 MPASM的语法,所有的有效字符都是ASCII字符集范围内的。不包括其它国家的任何专

12、用字符。MOVLW 0x8; 错误,“0x8”中第二个不是ASCII字符一个指令代码(包含指令及其操作数)必须在同一行中描述完毕。例如: ADDWF PORTB,F ; 指令后的操作数不能另起一行汇编指令不要在每一行的起始处开始编写,至少在行首留有一个空格符。例如:ADDWF PORTB,F ; 汇编指令不能顶格书写标号或变量符号的命名规则:只能由字母、数字和下划线构成。但不能以数字开头。例如:1COUNT EQU 0x22 ; 错误,变量符号或标号不能以数字开头_1COUNT EQU 0x23 ;正确COUNT1 EQU 0x23 ;正确COUNT_1 EQU 0x23 ;正确,第 29页,

13、4.2.2 MPASM的语法,程序跳转用的语句标号和程序员定义的变量符号必须顶格,即起始于一行的第一个字符位置处。语句标号可以用也可以不用“:”冒号结尾。例如:COUNT EQU 0x21 ; 程序员定义的变量符号必须顶格书写SUB_1 ; 跳转用的标号必须顶格书写 ADDWF PORTB,F SUB_2: ; “:”写不写都可以 ADDWF PORTC,F 任何标号或变量名字中不能出现MPASM保留运算符,例如()、+、-、*、/、等价于 addwf PORTB,F,第 30页,4.2.2 MPASM的语法,程序中立即数字的描述方式有以下几种:十六进制数:以0x开头(推荐),如0x12、0x

14、FF、0xFF。或者以H结尾,如34H、0FFH。若以字母开头时前面需加0或H1234、HFFFF。如: ADDWF 0x08,F ;正确 ADDWF 8H,F ;正确 ADDWF H8,F ;错误 ADDWF H8,F ;正确 ADDWF 0xA8,F ;正确 ADDWF A8H,F ;错误,不是立即数形式十进制数:.123,以小数点开头或D123。如: MOVLW .255 ;正确 MOVLW D255 ;正确二进制数:B10100101 MOVLW B11100011 ;正确 MOVLW B11100011 ;错误,不是正确的二进制形式八进制数:O12,注意是英文字母“O”而不是数字“0

15、”开头。 MOVLW O01 ;正确 MOVLW O01 ;错误,不是正确的八进制形式,第 31页,4.2.2 MPASM的语法,注释信息用英文半角“;”引导。“;”后直到此行结束的内容全为注释信息。注释内容可以是任意形式的文本字符,包括全角汉字和符号。除了注释内容外,程序的其他地方不建议使用汉字或全角符号。源程序中必须出现伪指令END,代表汇编结束。END后的内容将被编译器忽略。,第 32页,4.2.3 MPASM的伪指令,EQU EQU 顾名思义是“等于”的意思,通常称之为“定义”。其作用是用一个标号名(符合MPASM的命名规则)替换其他数字或已经定义过的符号名。指令范例:MYCOUNT

16、EQU 0x70;定义MYCOUNT 符号替换立即数0x70STEP EQU 0x23;符号名STEP等于0x23COUNT1 EQU MYCOUNT+1;如果MYCOUNT没有事先定义则会产生一个错误,第 33页,CBLOCK 和 ENDC,CBLOCK 伪指令声明变量块的起始地址,ENDC 伪指令声明变量块定义结束,CBLOCK/ENDC中间可以插入任意多的变量声明。其地址编排由编译器自动计算:第1个变量地址分配从起始地址开始,然后按所声明变量保留的字节数自动分配后面变量的地址,变量所需保留的字节数用“:”加后面的数字表示,如果只有1 个字节“:1 ”可以省略不写。例如: CBLOCK 0

17、x20 ;定义变量块起始地址为0x20 TEMP ;TEMP地址为00,占1个字节 BUFFER:8 ;BUFFER的起始地址为0x22,并保留8个字节单元 VARL ;VARL的地址为0x2A,占1个字节 VAR2 ;VAR2的地址为0x2B,占1个字节 ENDC ;结束变量块定义,第 34页,#include 或include,# include用来把另外一个文件的内容全部包含复制到本伪指令所在的位置。被包含复制的文件可以是任何形式的文本文件,当然文件中的内容和语法结构必须是MPASM能够识别的。最经常被包含的是针对PIC单片机内部特殊功能寄存器定义的包含头文件。如:#include ;包

18、含PIC16F877A的头文件,第 35页,LIST,LIST伪指令可以设定程序编译时的一些信息,例如所选单片机的型号,编译时选择的缺省数制等。LIST 伪指令使用例子。 LIST P=16F877A,R=DEC;设定所选单片机型号为PIC16F877A,第 36页,_CONFIG,注意CONFIG前是两个下划线字符。此伪指令的重要作用是把芯片的配置字设定在源程序中。此配置字无法用指令存取,只能使用编程器存取。建议大家尽量用此伪指令把芯片的配置字写在程序中,便于程序的烧写和调试。 指令范例: _CONFIG _WDT_OFF 若使用外部的高速振荡器,可以改写为 _CONFIG _WDT_OFF

19、 & _HS_OSC & _LVP_OFF,第 37页,#define,#define的作用是定义常数符号,即用符号名替换一个常数或符号名。其功能与EQU相同,但是用#define定义的符号无法通过【Watch】窗口观察。所以一般用其定义常量。指令范例:#define DELAY_TIME 200 ;定义常数符号,即用DELAY_TIME符号代替200#define KEY1 PORTB,0 ;用KEY1 符号代替端口PORTB的第0引脚,第 38页,ORG,ORG 用以定义程序代码的起始地址,通过此伪指令可以把程序定位到任何可用的程序空间,它实现的是程序代码绝对定位。指令范例: ORG 0x

20、000 ;定义以下指令从程序存储器地址0x000开始存储 GOTO MAIN ORG0x004 ;定义中断入口地址,以下指令从地址0x004开始存储 MOVWFW_TEMP;其他中断服务代码 MAIN ;主程序代码 ORG0x800;定义PAGE1的起始地址,以下指令代码放在PAGE1中SUB1 ;SUB1子程序代码 RETURN,第 39页,DT,DT 的作用是定义表格数据(Define Table),实现程序存储器的查表操作。DT可以直观的把一串常量数据存放在程序存储器(ROM)内,这些数据会按字节的顺序用“RETLW”指令书写,当程序执行到DT定义的表格数据后就会返回一个字节。指令范例:

21、LTABLEADDWFPCL,F;PC 相对寻址查表DT0;实际产生指令RETLW 0DT1, 2, 3;实际产生指令RETLW 1 ;实际产生指令RETLW 2 ; 实际产生指令RETLW 0x33(3的ASCII码)DTABC;实际产生指令RETLW 0x41(A 的ASCII码);实际产生指令RETLW 0x42(B 的ASCII码);实际产生指令RETLW 0x43(C 的ASCII码)当程序执行完以下两行指令后, W的内容就变为了A。 MOVLW 4 CALL LTABLE 对以上程序的具体理解请参考本章的“汇编语言的寻址模式”一节内容。,第 40页,DE,DE 伪指令可以让程序员在

22、源程序中定义片内EEPROM 的初值。该条伪指令只适用于那些内含EEPROM 数据存储器的单片机,如PIC16F87X 、PIC16F62X 等等。 例如: ORG 0x2100 ;编程器能自动识别此地址作为EEPROM数据区起始地址 DE.32,0x32 ;EEPROM地址单元0=0x20, 1=0x32 DEOK ;4=0x4F, 5=0x4B根据以上的定义,芯片完成编程烧入后,其内部EEPROM 区从0x00 单元开始被分别初始化成0x20、0x32、0x4F、0x4B。其他未被初始化的EEPROM单元全部是0xFF。,第 41页,END,END 伪指令告诉汇编编译器编译工作到此为止,E

23、ND 后面所有的信息,不管正确与否,一概不管。在绝大多数情形下,汇编源代码的最后一行应该是END 。无论如何,END 必须出现在程序中,不然编译器会报错,无法进行编译工作。,第 42页,4.2.4 MPASM的运算符,取当前指令的地址值:$ ;用语句标号得到指令地址HEREGOTOHERE;跳转到当前地址,程序进入死循环DELAYDECFSZCOUNT, F;计数器减1并判0GOTODELAY;跳转到上一行重复循环以上的代码可以用$运算符简化为:GOTO$;跳转到当前地址程序进入死循环DECFSZCOUNT, F ;计数器减1 并判0GOTO$-1;跳转到(当前地址-1)处,即上一行, ;重复

24、循环,第 43页,取16 位立即数的高低字节:HIGH 和LOW,; 2 字节变量赋立即数初值#defineDELAY_TIME.1000;定义一个常数立即数MOVLWLOW(DELAY_TIME);取立即数的低字节值,经;编译器计算将得到0xE8MOVWFCOUNT;赋给变量的低字节MOVLWHIGH(DELAY_TIME);取立即数的高字节值,经;编译器计算将得到0x03 MOVWFCOUNT+1;赋给变量的高字节,第 44页,加减乘除: - * /,;高速异步通信波特率BPS=FOSC/16*(X+1) ;故,波特率常数X=FOSC(BPS*16)-1#define BPS.9600;定

25、义工作波特率#define FOSC.4000000;定义单片机工作振荡频率4MHZ;其他代码MOVLWFOSC/(BPS*.16)-1;编译器计算得到25(十进制25)MOVWFSPBRG;设定波特率定时寄存器程序中用了统一的计算公式后,在调试时只要简单地改变前面的#define 语句定义新的波特率或振荡频率值,然后重新编译一次程序即实现了波特率设定代码的更新,非常方便。,第 45页,移位运算:和”运算符把一个立即数算术右移若干位(高位补0),“ 1;W=0x2A MOVLWXXX 2;W=0x54 MOVLW1 7;W=0x80,第 46页,立即数逻辑运算:& | ,“&”运算符把一个立即

26、数和另外一个立即数做逻辑与运算。“|”运算符把一个立即数和另外一个立即数做逻辑或运算。“”运算符把一个立即数和另外一个立即数做逻辑异或运算。例如:把两个立即数做逻辑与运算。#defineVAL10X34#defineVAL20X0FMOVLWVAL1&VAL2注意例子中的VAL1、VAL2都是事先已经定义的立即数而不是RAM 中的变量。,第 47页,4.2.5 MPASM的内置宏指令,BANKSEL BANKSEL可以帮助程序员非常方便地实现寄存器BANK 的设定。程序员只需在BANKSEL 后给它一个变量名或地址,编译器会自动按照变量地址所在的BANK,自动生成设定STATUS寄存器RP1:

27、 RP0 位的指令。例如,对于如下指令: BANKSELTRISC;设定TRISC所在的BANK(TRISC在BANK1)若芯片选择PIC16F874A, RAM共有2 个BANK,则编译后的机器码为BSFSTATUS, RP0;只生成1条汇编代码若芯片选择PIC16F877A, RAM共有4 个BANK,则编译后的机器码为BSFSTATUS, RP0;生成2条汇编代码BCFSTATUS, RP1;,第 48页,BANKISEL,与BANKSEL 类似,不过它对付的是用于寄存器相对寻址的STATUS 寄存器中的IRP 位。它也会用最少的代码实现IRP 位的设定。 ;芯片选择PIC16F877A

28、, RAM 共有4 个BANKCBLOCK0x120 BUFFER:8 ;从地址0x120 起定义8 字节的数据区ENDCBANKISELBUFFER;用BANKISEL 自动设定IRP 位MOVLWLOW(BUFFER);取BUFFER的地址(只有低8位)MOVWFFSR;送给FSR编译后的机器码如下。BSFSTATUS, 7;真正的设定IRP 的汇编代码MOVLW0x20MOVWFFSR,第 49页,PAGESEL,PAGESEL 可以帮助程序员设定程序的页面。使用方式与BANKSEL 相似,只是它改变的是PCLATH 两位。该宏指令也同样将用最少的代码实现程序页面设定.;芯片选择PIC1

29、6F877A, RAM共有4个页面ORG0x0100;在第0页内MAINPAGESELSUB1;用宏指令设定被调用子程序的页面CALLSUB1;随后调用该子程序PAGESEL$;用宏指令设定当前地址的页面GOTOMAIN;循环ORG0x0800;SUB1子程序定义在第1页SUB1 RETURN;子程序返回编译后的机器码(MAIN部分)如下。MAINBSFPCLATH,3;设定SUB1所在的页面BCFPCLATH,4CALLSUB1 BCFPCLATH,3;设定当前指令所在的页面BCFPCLATH,4GOTOMAIN,第 50页,CLRC/ SETC,CLRC/ SETC针对的是状态寄存器STA

30、TUS 中的进位标志位。CLRC等同于BCFSTATUS,C;C=0SETC等同于BSFSTATUS,C;C=1,第 51页,CLRZ/ SETZ,CLRZ/ SETZ针对的是状态寄存器STATUS 中的0标志位。CLRZ 等同干BCFSTATUS,Z;Z=0SETZ 等同于BSFSTATUS,Z;Z=1,第 52页,CLRDC/SETDC,CLRDC /SETDC 针对的是状态寄存器STATUS 中的半字节进位标志位。CLRDC等同于BCFSTATUS, DC;DC=0SETDC等同于BSFSTATUS, DC;DC=1,第 53页,SKPC/ SKPNC,SKPC/ SKPNC是判状态寄存

31、器STATUS 中的进位标志位,若条件满足则程序跳过下一条指令。SKPC等同于BTFSSSTATUS, C;若C=1 则程序跳过下一条指令SKPNC等同于BTFSCSTATUS, C;若C=0则程序跳过下一条指令,第 54页,SKPZ / SKPNZ,SKPZ/ SKPNZ是判状态寄存器STATUS 中的0标志位,若条件满足则程序跳过下一条指令。SKPZ等同于BTFSSSTATUS,Z;若Z=1则程序跳过下一条指令SKPNZ等同于BTFSCSTATUS,Z;若Z=0则程序跳过下一条指令,第 55页,SKPDC / SKPNDC,SKPDC / SKPNDC 是判状态寄存器STATUS 中的半字

32、节进位标志位,若条件满足则程序跳过下一条指令。SKPDC等同于BTFSSSTATUS,DC;若DC=1 则程序跳过下一条指令SKPNDC等同于BTFSCSTATUS;若DC=0则程序跳过下一条指令,第 56页,BC/BNC,BC/BNC是判断状态寄存器STATUS 中的进位标志位C,按进位标志实现程序的分支跳转。例如: MOVLW0x31;W=0x31ADDWFSUM,F;SUM=SUM+WBCCARRY1 ;如果发生进位就跳转到CARRY1处执行NOP;如果没有进位则继续执行BC下一条指令NOP请不要被BC/ BNC 这样“一条”指令所迷惑,它实际上是由2 条汇编指令组成,且用到了GOTO

33、实现跳转,故在用此宏指令前注意页面的设定。,第 57页,BZ/ BNZ,与BC / BNC一样,只不过判别的是状态寄存器STATUS 中的Z标志位。例如:MOVLW0x55;W=0x55XORWFFLAG, W;FLAG=0x55BZMATCH;Z=1,FLAG=0x55,跳转到MATCH 处执行NOP;Z=0,继续执行BZ 的下一条指令NOPBDC/NBDC同上,判别的是状态寄存器STATUS中的半字节进位标志位。,第 58页,4.3 汇编语言的寻址方式,立即数寻址寄存器间接寻址直接寻址位寻址,第 59页,立即数寻址 例: MOVLW k ADDLW k SUBLW k ANDLW k IO

34、RLW k XORLW k,第 60页,RETLW kCALL kGOTO k,第 61页,举例:MOVLW D255ANDLW B00001111CALL 0x7F0GOTO LOOP99RETLW H3F,第 62页,MOVLW 0x60 MOVWF FSRLOOP CLRF INDF INCF FSR,F BTFSS FSR,4 GOTO LOOP,4.3.2 数据寄存器间接寻址,第 63页,直接寻址MOVWF 0x05MOVWF PORTAIORWF AAA,W ;AAA是自定义变量MOVF STATUS,W,第 64页,位寻址BSF STATUS,RP0BCF PORTB,1BSF

35、INTCON,GIEBTFSS STATUS,ZBTFSC STATUS,C,第 65页,4.4 MPASM汇编常用子程序设计,判断分支程序段设计(if语句)循环程序段的设计(循环语句)查表子程序的设计(数组)延时子程序的设计(多重循环),第 66页,1. 判断分支程序段设计,根据键盘不同的按键执行不同功能。MAINLOOPPAGESELScanKEYBOARDCALLScanKEYBOARD ;调用KEY键盘扫描程序,键值由W返回PAGESELKey_FunctionCALL Key_FunctionPAGESELMAINLOOPGOTOMAINLOOP,第 67页,判断分支程序段设计(续)

36、,;-;根据键入情况,确定相应键功能子程序;-Key_Function ADDWFPCL,F;确定相对偏移量GOTOPKEY0;执行PKEY0键盘定义功能GOTOPKEY1;执行PKEY1键盘定义功能GOTOPKEY2;执行PKEY2键盘定义功能 GOTOPKEYN;执行PKEYN键盘定义功能,第 68页,2. 循环程序段的设计,循环执行SHOW子程序100次。ORG0000HMOVLWD101;取常数101MOVWF28H;送入28H单元中LOOP100DECFSZ28H,F ;28H单元减1为0间跳GOTOCSHOW;未到100次跳转显示GOTOSOVER;100次结束CSHOW PAGE

37、SELSHOW ;转入SHOW子程序页面CALLSHOW;调用显示子程序PAGESELLOOP100;返回到第0页面GOTOLOOP100;返回继续减1操作SOVER . ;其它功能代码END,ORG0000HMOVLWD101;取常数101MOVWF28H;送入28H单元中 LOOP100DECFSZ28H,F ;28H单元减1为0间跳GOTOCSHOW;未到100次跳转显示GOTOSOVER;100次结束 CSHOW PAGESELSHOW ;转入SHOW子程序页面CALLSHOW;调用显示子程序PAGESELLOOP100;返回到第0页面GOTOLOOP100;返回继续减1操作 SOVE

38、R . ;其它功能代码END,第 69页,3. 查表子程序的设计,数据查表子程序在某些特殊场合是非常有用的,如数码管显示器以及其他具有固定显示模式的场合,须根据其显示数值去查找对应参考数据表编码输出。 本节以七段数码管显示编码为例。,第 70页,数码管控制原理,什么是数码管?,第 71页,电路原理图中数码管的外形,公共端,第 72页,数码管显示逻辑原理,a,b,g,1,0,共阳极,a,b,g,0,共阴极,第 73页,b,e,a,b,c,d,e,f,g,数码管显示逻辑原理,1,0100100,设右图为共阳极数码管,想让其显示数字的步骤如右图:,第 74页,XXXXXXXX,TRISB=0;TRI

39、SD=0;RB0=1;PORTD=0B10010010;,b,e,PIC16F877,RD0,RD1,RD2,RD3,RD4,RD5,RD6,a,b,c,d,e,f,g,Port D,10010010,用数码管显示数字,RB0,TRISD=0;,RB0=1;,1,PORTD=0B10010010;,0100100,TRISB=0;,第 75页,七段数码管字形码编码表,第 76页,3 查表子程序的设计,根据数字获得其数码管上的字形码。 MOVLW 1 ;此值决定返回的编码 CALLSMG_FONT MOVWFPORTD;调用查表子程序SMG_FONTADDWFPCL,F;W加PCL形成偏移量RE

40、TLW3FH;返回“0”编码,共阴极RETLW06H;返回“1”编码RETLW5BH;返回“2”编码RETLW4FH;返回“3”编码RETLW66H;返回“4”编码RETLW6DH;返回“5”编码RETLW7DH;返回“6”编码RETLW07H;返回“7”编码RETLW7FH;返回“8”编码RETLW6FH;返回“9”编码,第 77页,4. 延时子程序的设计,;主频为4MHz时,编写单循环的软件延时子程序。;-;软件延时子程序DELAY;-COUNTEREQU 0x20;定义循环寄存器变量DELAYMOVLW0xFF;循环常数MOVWFCOUNTER;循环寄存器DECFSZCOUNTER,F ;循环寄存器递减GOTO$-1 ;返回上一条语句循环RETURN; 此子程序能延时多长时间呢?,第 78页,主频为4MHz时,请编写10ms软件延时子程序。,CNT1EQU0x23CNT2EQU0x24CNT3EQU0x25DEL10MS; MAIN FREQ=4MHzMOVLW0x0D;外循环常数MOVWFCNT1;外循环寄存器DLY_LOOP1MOVLW0FFH;内循环常数MOVWFCNT2 ;内循环寄存器DECFSZCNT2 ;内循环寄存器递减GOTO$-1;继续内循环DECFSZCNT1 ;外循环寄存器递减GOTODLY_LOOP1;继续外循环RETURN,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报