




已阅读5页,还剩77页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 1页,第四章 PIC汇编语言及其程序设计,4.1 PIC的RISC指令集 4.2 MPASM 汇编语言 4.3 汇编语言的寻址模式 4.4 MPASM常用子程序设计,第 2页,PICmicro 单片机指令集 按操作数访问形式分类,NOP - 空操作 MOVWF f 把W内容送f CLRW - 清除W CLRF f 清除f SUBWF f,d f减去W DECF f,d f递减1 IORWF f,d W和f逻辑或 ANDWF f,d W和f逻辑与 XORWF f,d W和f逻辑异或 ADDWF f,d W和f相加 MOVF f,d 传送f COMF f,d f取反 INCF f,d f递增1 DECFSZ f,d f递减1, 结果为0则跳 RRF f,d 带进位循环右移 RLF f,d 带进位循环左移 SWAPF f,d f高低4位内容交换 INCFSZ f,d f递增1, 结果为0则跳,BCF f,b f位清0 BSF f,b f位置1 BTFSC f,b f位测试, 为0则跳 BTFSS f,b f位测试, 为1则跳,SLEEP - 进入低功耗休眠模式 CLRWDT - 清看门狗 RETLW k W带立即数返回 RETFIE - 中断返回 RETURN - 子程序返回 CALL k 调用子程序 GOTO k 强行跳转(k为9位地址描述) MOVLW k W置立即数 IORLW k W和立即数逻辑或 ADDLW k W和立即数相加 SUBLW k 立即数减去W ANDLW k W和立即数逻辑与 XORLW k W和立即数逻辑异或,字节操作,位操作,立即数和控制操作,f = 寄存器, k = 立即数 (8位), b = 位地址 , d = 目的地 (1=f, 0=W),第 3页,PIC指令集核心助记符,第 4页,指令系统字符说明,第 5页,1,2,1,典型指令分析,MyVar,MOVF MyVar,W,INCF MyVar,F,W or WREG,File Registers,MOVWF MyVar,2,1,立即数,MOVLW 1,第 6页,PICmicro 单片机指令集 字节操作,14位内核之字节操作指令构成,操作码,d,f,f,f,f,f,f,f,d = 目的地标志位 d = 0 结果送W d = 1 结果送f,f = 7位寄存器地址,例如: ADDWF REG, W ADDWF f, d,NOP - MOVWF f CLRW - CLRF f SUBWF f,d DECF f,d IORWF f,d ANDWF f,d XORWF f,d ADDWF f,d MOVF f,d COMF f,d INCF f,d DECFSZ f,d RRF f,d RLF f,d SWAPF f,d INCFSZ f,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: BTFSC STATUS, C BTFSC f, b,BCF f,b BSF f,b BTFSC f,b BTFSS f,b,位操作,第 8页,k,14位内核之立即数操作指令构成,OP CODE,k,k,k,k,k,k,k,k = 8-bit Immediate Value,例: MOVLW 0x2F MOVLW k,MOVLW k IORLW k ADDLW k SUBLW k ANDLW k XORLW k,立即数操作,PIC单片机指令集 立即数操作,第 9页,k,14位内核之RETLW指令构成,OP CODE,k,k,k,k,k,k,k,k = 8-bit Immediate Value,SLEEP - CLRWDT - RETLW k RETFIE - RETURN - CALL k GOTO k,控制类操作,14位内核之CALL /GOTO指令构成,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 20H MOVWF 20H,第 13页,MOVF 20H,W MOVWF 40H MOVF 30H,W MOVWF 20H MOVF 40H,W MOVWF 30H,例2、编程将通用寄存器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 0000H NOP MOVLW 0FH MOVWF 20H ANDWF 24H,1 MOVWF 40H,程序举例,第 21页,例2、分析程序段,指出程序执行后,存储单元的结果,MOVLW 22H - 22H MOVWF 22H 22H 22H ADDWF 22F , F 44H 22H INCF 22F,F 45H 22H SWAPF 22H,W 45H 54H RLF 22H , F 8AH 54H,22H W,MOVLW 22H MOVWF 22H ADDWF 22F , F INCF 22F,F SWAPF 22H,W RLF 22H , F,第 22页,要想控制单片机端口的输入输出,首先需对 端口方向寄存器和数据寄存器进行设置,引 脚的方向寄存器的相应位设置为1表示输入; 设置为0表示输出,端口的输入输出控制,例:将RA4/T0CKI引脚设置为输入状态,BSF STATUS,RP0 BSF TRISA,4,第 23页,例:将RB0/INT引脚设置为输入状态,BSF STATUS,RP0 BSF TRISB,0,例:将端口C的低四位设置为输出、高四位设置为输入,BSF STATUS,RP0 MOVLW 0F0H MOVWF TRISC,第 24页,例:从端口C的低四位引脚输出高电平、高四位引脚输出为低电平,BSF STATUS,RP0 MOVLW 0 MOVWF TRISC MOVLW 0FH MOVWF PORTC,第 25页,例2、编程将数据存储器20H低4位和30H高4位组合成一个8位数据并从RC端口输出。,ORG 0000H NOP BANKSEL TRISC MOVLW 00H MOVWF TRISC BANKSEL PORTC MOVF 20H,W,ANDLW 0FH MOVWF 20H MOVF 30H MOVF 30H,W ANDLW 0F0H IORWF 20H,W MOVWF 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中已经集成了MPASM编译器工具集。用户在MPLAB IDE中即可实现对汇编程序的编译、连接、调试和编程。 MPLAB安装后汇编编译器的可执行文件名为MPASMWIN.EXE,如是缺省安装则存放路径“C:PROGRAM FILESMICROCHIPMPASM SUITE”下。此目录下还有一个MPLINK.EXE的可执行文件,在多模块(多源文件)可重定位的程序开发模式下,最后一定要用MPLINK把所有的程序与数据模块连接定位成一个目标文件(机器码文件)。但在绝对定位的程序开发模式下,MPLINK将不会被用到。,第 28页,4.2.2 MPASM的语法,所有的有效字符都是ASCII字符集范围内的。不包括其它国家的任何专用字符。 MOVLW 0x8 ; 错误,“0x8”中第二个不是ASCII字符 一个指令代码(包含指令及其操作数)必须在同一行中描述完毕。例如: ADDWF PORTB,F ; 指令后的操作数不能另起一行 汇编指令不要在每一行的起始处开始编写,至少在行首留有一个空格符。例如: ADDWF PORTB,F ; 汇编指令不能顶格书写 标号或变量符号的命名规则:只能由字母、数字和下划线构成。但不能以数字开头。例如: 1COUNT EQU 0x22 ; 错误,变量符号或标号不能以数字开头 _1COUNT EQU 0x23 ;正确 COUNT1 EQU 0x23 ;正确 COUNT_1 EQU 0x23 ;正确,第 29页,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、0xFF、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”开头。 MOVLW O01 ;正确 MOVLW O01 ;错误,不是正确的八进制形式,第 31页,4.2.2 MPASM的语法,注释信息用英文半角“;”引导。“;”后直到此行结束的内容全为注释信息。注释内容可以是任意形式的文本字符,包括全角汉字和符号。除了注释内容外,程序的其他地方不建议使用汉字或全角符号。 源程序中必须出现伪指令END,代表汇编结束。END后的内容将被编译器忽略。,第 32页,4.2.3 MPASM的伪指令,EQU EQU 顾名思义是“等于”的意思,通常称之为“定义”。其作用是用一个标号名(符合MPASM的命名规则)替换其他数字或已经定义过的符号名。 指令范例: MYCOUNT EQU 0x70 ;定义MYCOUNT 符号替换立即数0x70 STEP EQU 0x23 ;符号名STEP等于0x23 COUNT1 EQU MYCOUNT+1 ;如果MYCOUNT没有事先定义则会产生一个错误,第 33页,CBLOCK 和 ENDC,CBLOCK 伪指令声明变量块的起始地址,ENDC 伪指令声明变量块定义结束,CBLOCK/ENDC中间可以插入任意多的变量声明。其地址编排由编译器自动计算:第1个变量地址分配从起始地址开始,然后按所声明变量保留的字节数自动分配后面变量的地址,变量所需保留的字节数用“:”加后面的数字表示,如果只有1 个字节“:1 ”可以省略不写。例如: CBLOCK 0x20 ;定义变量块起始地址为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 ;包含PIC16F877A的头文件,第 35页,LIST,LIST伪指令可以设定程序编译时的一些信息,例如所选单片机的型号,编译时选择的缺省数制等。 LIST 伪指令使用例子。 LIST P=16F877A,R=DEC ;设定所选单片机型号为PIC16F877A,第 36页,_CONFIG,注意CONFIG前是两个下划线字符。 此伪指令的重要作用是把芯片的配置字设定在源程序中。此配置字无法用指令存取,只能使用编程器存取。建议大家尽量用此伪指令把芯片的配置字写在程序中,便于程序的烧写和调试。 指令范例: _CONFIG _WDT_OFF 若使用外部的高速振荡器,可以改写为 _CONFIG _WDT_OFF & _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 0x000 ;定义以下指令从程序存储器地址0x000开始存储 GOTO MAIN ORG 0x004 ;定义中断入口地址,以下指令从地址0x004开始存储 MOVWF W_TEMP ;其他中断服务代码 MAIN ;主程序代码 ORG 0x800 ;定义PAGE1的起始地址,以下指令代码放在PAGE1中 SUB1 ;SUB1子程序代码 RETURN,第 39页,DT,DT 的作用是定义表格数据(Define Table),实现程序存储器的查表操作。DT可以直观的把一串常量数据存放在程序存储器(ROM)内,这些数据会按字节的顺序用“RETLW”指令书写,当程序执行到DT定义的表格数据后就会返回一个字节。 指令范例: LTABLE ADDWF PCL,F ;PC 相对寻址查表 DT 0 ;实际产生指令RETLW 0 DT 1, 2, 3 ;实际产生指令RETLW 1 ;实际产生指令RETLW 2 ; 实际产生指令RETLW 0x33(3的ASCII码) DT ABC ;实际产生指令RETLW 0x41(A 的ASCII码) ;实际产生指令RETLW 0x42(B 的ASCII码) ;实际产生指令RETLW 0x43(C 的ASCII码) 当程序执行完以下两行指令后, W的内容就变为了A。 MOVLW 4 CALL LTABLE 对以上程序的具体理解请参考本章的“汇编语言的寻址模式”一节内容。,第 40页,DE,DE 伪指令可以让程序员在源程序中定义片内EEPROM 的初值。该条伪指令只适用于那些内含EEPROM 数据存储器的单片机,如PIC16F87X 、PIC16F62X 等等。 例如: ORG 0x2100 ;编程器能自动识别此地址作为EEPROM数据区起始地址 DE .32,0x32 ;EEPROM地址单元0=0x20, 1=0x32 DE “OK“ ;4=0x4F, 5=0x4B 根据以上的定义,芯片完成编程烧入后,其内部EEPROM 区从0x00 单元开始被分别初始化成0x20、0x32、0x4F、0x4B。其他未被初始化的EEPROM单元全部是0xFF。,第 41页,END,END 伪指令告诉汇编编译器编译工作到此为止,END 后面所有的信息,不管正确与否,一概不管。在绝大多数情形下,汇编源代码的最后一行应该是END 。无论如何,END 必须出现在程序中,不然编译器会报错,无法进行编译工作。,第 42页,4.2.4 MPASM的运算符,取当前指令的地址值:$ ;用语句标号得到指令地址 HERE GOTO HERE ;跳转到当前地址,程序进入死循环 DELAY DECFSZ COUNT, F ;计数器减1并判0 GOTO DELAY ;跳转到上一行重复循环 以上的代码可以用$运算符简化为: GOTO $ ;跳转到当前地址程序进入死循环 DECFSZ COUNT, F ;计数器减1 并判0 GOTO $-1 ;跳转到(当前地址-1)处,即上一行, ;重复循环,第 43页,取16 位立即数的高低字节:HIGH 和LOW,; 2 字节变量赋立即数初值 #define DELAY_TIME .1000 ;定义一个常数立即数 MOVLW LOW(DELAY_TIME) ;取立即数的低字节值,经 ;编译器计算将得到0xE8 MOVWF COUNT ;赋给变量的低字节 MOVLW HIGH(DELAY_TIME) ;取立即数的高字节值,经 ;编译器计算将得到0x03 MOVWF COUNT+1 ;赋给变量的高字节,第 44页,加减乘除: - * /,;高速异步通信波特率BPS=FOSC/16*(X+1) ;故,波特率常数X=FOSC(BPS*16)-1 #define BPS .9600 ;定义工作波特率 #define FOSC .4000000 ;定义单片机工作振荡频率4MHZ ;其他代码 MOVLW FOSC/(BPS*.16)-1 ;编译器计算得到25(十进制25) MOVWF SPBRG ;设定波特率定时寄存器 程序中用了统一的计算公式后,在调试时只要简单地改变前面的#define 语句定义新的波特率或振荡频率值,然后重新编译一次程序即实现了波特率设定代码的更新,非常方便。,第 45页,移位运算:和,“”运算符把一个立即数算术右移若干位(高位补0),“ 1 ;W=0x2A MOVLW XXX 2 ;W=0x54 MOVLW 1 7 ;W=0x80,第 46页,立即数逻辑运算:& | ,“&”运算符把一个立即数和另外一个立即数做逻辑与运算。 “|”运算符把一个立即数和另外一个立即数做逻辑或运算。 “”运算符把一个立即数和另外一个立即数做逻辑异或运算。 例如:把两个立即数做逻辑与运算。 #define VAL1 0X34 #define VAL2 0X0F MOVLW VAL1&VAL2 注意例子中的VAL1、VAL2都是事先已经定义的立即数而不是RAM 中的变量。,第 47页,4.2.5 MPASM的内置宏指令,BANKSEL BANKSEL可以帮助程序员非常方便地实现寄存器BANK 的设定。程序员只需在BANKSEL 后给它一个变量名或地址,编译器会自动按照变量地址所在的BANK,自动生成设定STATUS寄存器RP1: RP0 位的指令。例如,对于如下指令: BANKSEL TRISC ;设定TRISC所在的BANK(TRISC在BANK1) 若芯片选择PIC16F874A, RAM共有2 个BANK,则编译后的机器码为 BSF STATUS, RP0 ;只生成1条汇编代码 若芯片选择PIC16F877A, RAM共有4 个BANK,则编译后的机器码为 BSF STATUS, RP0 ;生成2条汇编代码 BCF STATUS, RP1 ;,第 48页,BANKISEL,与BANKSEL 类似,不过它对付的是用于寄存器相对寻址的STATUS 寄存器中的IRP 位。它也会用最少的代码实现IRP 位的设定。 ;芯片选择PIC16F877A, RAM 共有4 个BANK CBLOCK 0x120 BUFFER:8 ;从地址0x120 起定义8 字节的数据区 ENDC BANKISEL BUFFER ;用BANKISEL 自动设定IRP 位 MOVLW LOW(BUFFER) ;取BUFFER的地址(只有低8位) MOVWF FSR ;送给FSR 编译后的机器码如下。 BSF STATUS, 7 ;真正的设定IRP 的汇编代码 MOVLW 0x20 MOVWF FSR,第 49页,PAGESEL,PAGESEL 可以帮助程序员设定程序的页面。使用方式与BANKSEL 相似,只是它改变的是PCLATH 两位。该宏指令也同样将用最少的代码实现程序页面设定. ;芯片选择PIC16F877A, RAM共有4个页面 ORG 0x0100 ;在第0页内 MAIN PAGESEL SUB1 ;用宏指令设定被调用子程序的页面 CALL SUB1 ;随后调用该子程序 PAGESEL $ ;用宏指令设定当前地址的页面 GOTO MAIN ;循环 ORG 0x0800 ;SUB1子程序定义在第1页 SUB1 RETURN ;子程序返回 编译后的机器码(MAIN部分)如下。 MAIN BSF PCLATH,3 ;设定SUB1所在的页面 BCF PCLATH,4 CALL SUB1 BCF PCLATH,3 ;设定当前指令所在的页面 BCF PCLATH,4 GOTO MAIN,第 50页,CLRC/ SETC,CLRC/ SETC针对的是状态寄存器STATUS 中的进位标志位。 CLRC 等同于 BCF STATUS,C ;C=0 SETC 等同于 BSF STATUS,C ;C=1,第 51页,CLRZ/ SETZ,CLRZ/ SETZ针对的是状态寄存器STATUS 中的0标志位。 CLRZ 等同干 BCF STATUS,Z ;Z=0 SETZ 等同于 BSF STATUS,Z ;Z=1,第 52页,CLRDC/SETDC,CLRDC /SETDC 针对的是状态寄存器STATUS 中的半字节进位标志位。 CLRDC 等同于 BCF STATUS, DC ;DC=0 SETDC 等同于 BSF STATUS, DC ;DC=1,第 53页,SKPC/ SKPNC,SKPC/ SKPNC是判状态寄存器STATUS 中的进位标志位,若条件满足则程序跳过下一条指令。 SKPC 等同于 BTFSS STATUS, C ;若C=1 则程序跳过下一条指令 SKPNC 等同于 BTFSC STATUS, C ;若C=0则程序跳过下一条指令,第 54页,SKPZ / SKPNZ,SKPZ/ SKPNZ是判状态寄存器STATUS 中的0标志位,若条件满足则程序跳过下一条指令。 SKPZ 等同于 BTFSS STATUS,Z ;若Z=1则程序跳过下一条指令 SKPNZ 等同于 BTFSC STATUS,Z ;若Z=0则程序跳过下一条指令,第 55页,SKPDC / SKPNDC,SKPDC / SKPNDC 是判状态寄存器STATUS 中的半字节进位标志位,若条件满足则程序跳过下一条指令。 SKPDC 等同于 BTFSS STATUS,DC ;若DC=1 则程序跳过下一条指令 SKPNDC 等同于 BTFSC STATUS ;若DC=0则程序跳过下一条指令,第 56页,BC/BNC,BC/BNC是判断状态寄存器STATUS 中的进位标志位C,按进位标志实现程序的分支跳转。例如: MOVLW 0x31 ;W=0x31 ADDWF SUM,F ;SUM=SUM+W BC CARRY1 ;如果发生进位就跳转到CARRY1处执行 NOP ;如果没有进位则继续执行BC下一条指令NOP 请不要被BC/ BNC 这样“一条”指令所迷惑,它实际上是由2 条汇编指令组成,且用到了GOTO 实现跳转,故在用此宏指令前注意页面的设定。,第 57页,BZ/ BNZ,与BC / BNC一样,只不过判别的是状态寄存器STATUS 中的Z标志位。例如: MOVLW 0x55 ;W=0x55 XORWF FLAG, W ;FLAG=0x55 BZ MATCH ;Z=1,FLAG=0x55,跳转到MATCH 处执行 NOP ;Z=0,继续执行BZ 的下一条指令NOP BDC/NBDC 同上,判别的是状态寄存器STATUS中的半字节进位标志位。,第 58页,4.3 汇编语言的寻址方式,立即数寻址 寄存器间接寻址 直接寻址 位寻址,第 59页,立即数寻址 例: MOVLW k ADDLW k SUBLW k ANDLW k IORLW k XORLW k,第 60页,RETLW k CALL k GOTO k,第 61页,举例: MOVLW D255 ANDLW B00001111 CALL 0x7F0 GOTO LOOP99 RETLW H3F,第 62页,MOVLW 0x60 MOVWF FSR LOOP CLRF INDF INCF FSR,F BTFSS FSR,4 GOTO LOOP,4.3.2 数据寄存器间接寻址,第 63页,直接寻址 MOVWF 0x05 MOVWF PORTA IORWF AAA,W ;AAA是自定义变量 MOVF STATUS,W,第 64页,位寻址 BSF STATUS,RP0 BCF PORTB,1 BSF INTCON,GIE BTFSS STATUS,Z BTFSC STATUS,C,第 65页,4.4 MPASM汇编常用子程序设计,判断分支程序段设计(if语句) 循环程序段的设计(循环语句) 查表子程序的设计(数组) 延时子程序的设计(多重循环),第 66页,1. 判断分支程序段设计,根据键盘不同的按键执行不同功能。 MAINLOOP PAGESEL ScanKEYBOARD CALL ScanKEYBOARD ;调用KEY键盘扫描程序,键值由W返回 PAGESEL Key_Function CALL Key_Function PAGESEL MAINLOOP GOTO MAINLOOP,第 67页,判断分支程序段设计(续),;- ;根据键入情况,确定相应键功能子程序 ;- Key_Function ADDWF PCL,F ;确定相对偏移量 GOTO PKEY0 ;执行PKEY0键盘定义功能 GOTO PKEY1 ;执行PKEY1键盘定义功能 GOTO PKEY2 ;执行PKEY2键盘定义功能 GOTO PKEYN ;执行PKEYN键盘定义功能,第 68页,2. 循环程序段的设计,循环执行SHOW子程序100次。 ORG 0000H MOVLW D101 ;取常数101 MOVWF 28H ;送入28H单元中 LOOP100 DECFSZ 28H,F ;28H单元减1为0间跳 GOTO CSHOW ;未到100次跳转显示 GOTO SOVER ;100次结束 CSHOW PAGESEL SHOW ;转入SHOW子程序页面 CALL SHOW ;调用显示子程序 PAGESEL LOOP100 ;返回到第0页面 GOTO LOOP100 ;返回继续减1操作 SOVER ;其它功能代码 END,ORG 0000H MOVLW D101 ;取常数101 MOVWF 28H ;送入28H单元中 LOOP100 DECFSZ 28H,F ;28H单元减1为0间跳 GOTO CSHOW ;未到100次跳转显示 GOTO SOVER ;100次结束 CSHOW PAGESEL SHOW ;转入SHOW子程序页面 CALL SHOW ;调用显示子程序 PAGESEL LOOP100 ;返回到第0页面 GOTO LOOP100 ;返回继续减1操作 SOVER ;其它功能代码 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,0 1 0 0 1 0 0,设右图为共阳极数码管,想让其显示数字的步骤如右图:,第 74页,XXXXXXXX,TRISB=0; TRISD=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;,0 1 0 0 1 0 0,TRISB=0;,第 75页,七段数码管字形码编码表,第 76页,3 查表子程序的设计,根据数字获得其数码管上的字形码。 MOVLW 1 ;此值决定返回的编码 CALL SMG_FONT MOVWF PORTD ;调用查表子程序 SMG_FONT ADDWF PCL,F ;W加PCL形成偏移量 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”编码,第 77页,4. 延时子程序的设计,;主频为4MH
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省普宁市勤建学校2024-2025学年高二下学期第二次调研考试政治试题
- 教学课件走进实验室测量:实验探究的重要环节
- 2025年阿里3轮面试都问了RecyclerView你都能答出来吗
- 2024-2025学年下学期高一生物人教版期末必刷常考题之基因指导蛋白质的合成
- 建筑施工特种作业-建筑架子工(普通脚手架)真题库-3
- 散文构思小说题目及答案
- 10 3 二项分布 超几何分布和正态分布-高考数学真题分类 十年高考
- 2023-2024学年四川省宜宾市高二下学期期末学业质量监测数学试题(解析版)
- 剖切面的种类与剖切方法
- 2023-2024学年湖北省咸宁市高二下学期期末考试数学试卷(解析版)
- 正压式空气呼吸器使用培训课件
- 08S305 小型潜水排污泵选用及安装
- 初中自荐信范文
- 血培养采集课件
- 广东省茂名市直属学校2023-2024学年七年级下学期期末数学试题
- 小学语文部编版六年级下册全册阅读知识点(分单元课时编排)
- JBT 2231.3-2011 往复活塞压缩机零部件 第3部分:薄壁轴瓦
- 2024-2030年中国果酱行业市场规模调研及前景趋势预测报告
- 2024中车大连机车车辆限公司招聘高校毕业生170人高频考题难、易错点模拟试题(共500题)附带答案详解
- 2023年中移动家庭网关终端技术规范
- 2021年4月自考03200预防医学二试题及答案含解析
评论
0/150
提交评论