单片机编程之汇编语言基础-PIC单片机汇编指令
- 格式:doc
- 大小:46.50 KB
- 文档页数:13
中档PIC单片机汇编指令详解-----老罗整理NOP 空操作指令语法形式:NOP操作数:无执行时间:一个指令周期执行过程:除了消耗一个指令周期之外,无任何其他影响,所以通常被用来作为延时使用状态标志影响:无说明:指令操作没有任何操作数参与,也不影响任何寄存器的内容和状态,所以通常都是被作为延时使用的。
指令范例:BSF PORTB,0 ;PORTB的第0位输出高电平(1)NOP ;延时,使电平稳定MOVWF 将W寄存器的内容传送到数据寄存器语法形式:MOVWF f操作数:f为数据寄存器的低7位地址(0x00~0x7F)执行时间:一个指令周期执行过程:把W寄存器的内容传送到f数据寄存器,W寄存器的内容保持不变,类似于Copy状态标志影响:无说明:该指令是对数据寄存器赋值的主要方式指令范例:MOVLW 0x55 ;W寄存器赋值MOVWF Data ;W寄存器值传送给Data;此时Data=0x55CLRW W寄存器内容清0语法形式:CLRW操作数:无执行时间:一个指令周期执行过程:0x00→W1→Z状态标志影响:Z说明:该指令对W寄存器内容清零,并置位0标志Z另外使用MOVLW 0x00也可以使W寄存器内容为0,但是这条指令不影响0标志Z 指令范例:CLRW ;W=0,Z=1CLRF 数据寄存器内容清零语法形式:CLRF f操作数:f为数据寄存器的低7位地址(0x00~0x7F)执行时间:一个指令周期执行过程:0x00→f1→Z状态标志影响:Z说明:指令对数据寄存器清零,并置位0标志Z指令范例:CLRF TRISB ;端口B所有I/O引脚设为输出SUBWF 将数据寄存器的内容减去W寄存器内容语法形式:SUBWF f,d操作数:f为数据寄存器的低7位地址(0x00~0x7F)d为目的寄存器的低7位地址(0x00~0x7F)当d=f时,结果放在f数据寄存器,W寄存器内容不变当d=W时,结果放在W寄存器中,数据寄存器f内容不变执行时间:一个指令周期执行过程:【f】-【W】→d状态标志影响:Z DC C说明:要特别注意W寄存器在这条指令中是减数当【f】=【W】时,相减的结果为0,则Z=1当【f】>【W】时,没有借位发生,则C=1当【f】<【W】时,有借位发生,则C=0实际上在PIC单片机中这条指令是通过先对W寄存器的内容求补码,然后与被减数相加,所以在判断是否有借位时和其他单片机不同,请注意指令范例:MOVLW 0x23 ;W=0x23MOVWF tmp ;tmp=0x23MOVLW 0x32 ;W=0x32SUBWF tmp,W ;tmp-W将结果存入W中,W=0xF1,tmp=0x23;过程:tmp=0x23,W求补码为0xCD,所以0x23+0xCD=0xF1,又因tmp<W,所以C=0DECF 数据寄存器的内容递减1语法形式:DECF f,d操作数:f为数据寄存器的低7位地址(0x00~0x7F)d为目的寄存器的低7位地址(0x00~0x7F)当d=f时,结果放在f数据寄存器,f数据寄存器自减1当d=W时,结果放在W寄存器中,W寄存器内容自减1执行时间:一个指令周期执行过程:【f】-1→d状态标志影响:Z说明:该指令对数据寄存器的内容做减1运算。
PIC单⽚机汇编语⾔学习(⼀)1、汇编语⾔的语句格式:标号操作码(指令助记符)操作数 ;注释(label) (opcode) (operand) (comment)2、常⽤伪指令a.EQU——符号名赋值伪指令格式:符号名 EQU nn——程序起始地址定义伪指令格式:ORG nnnnc.END——程序结束伪指令格式:ENDd.LIST——列表选项伪指令格式:LIST [可选项,可选项,......]e.INCLUDE:调⼊外部程序⽂件伪指令格式:INCLUDE "⽂件名"2、分⽀程序结构——对于程序中的指令运⽤作⼏点说明:(1)凡是需要2个数参与的逻辑运算(与、或、异或)和算术运算(加、减),都需要事先将其中⼀个操作数放⼊W中。
对于在此使⽤的减法指令更要格外关注,应预先把减数放⼈W中,或者说,预先放⼊W中的数,在运算中是当做减数,⽽寄存器中的数当做了被减数。
(2)⼀条条件跳转指令往往需要跟随⼀条⽆条件跳转指令,才能实现长距离的转移和程序的分⽀。
(3)PIC单⽚机的指令系统中没有设置专⽤的停机指令,可以⽤⼀条跳转到⾃⾝的⽆条件跳转指令GOTO来实现。
3、PIC单⽚机指令由3种基本类型指令组成:a.字节操作类指令b.位操作类指令c.⽴即数和控制操作类指令对于字节操作指令,f——>⽂件寄存器标识符,d——>⽬标寄存器标识符说明:⽬标标识符指定了操作结果的存放位置:d=0 操作结果存⼊W寄存器d=1 操作结果存⼊指定的⽂件寄存器,d默认值为14、指令集5、例⼦1 ;--------------------------------------------------------23 ;顺序程序结构4 ;将20H单元低4位取出存⼊21H,⾼四位取出存⼊22H5 ;要点:ANDLW和SWAPF67 ;---------------------------------------------------------8 MOVF 20H,0 ;将20H单元的内容送⼈W9 ANDLW 0FH ;W⾼四位清零低4位保持不变10 MOVWF 21H ;将拆分后的低4位送21H11 SWAPF 20H,0 ;将20H单元内容⾼、低半字节换位后送W1213 ANDLW 0FH ;再将W⾼四位清0低四位保持不变14 MOVWF 22H ;将拆分后的⾼四位送22H单元151617 ;--------------------------------------------------------1819 ;分⽀程序结构20 ;RAM中20H和21H单元存放2个数,找出⼤着存⼊22H单元21 ;要点:两数做减法,判断标志位C的值2223 ;---------------------------------------------------------24 STATUS EQU 03H ;定义STATUS寄存器地址为03H25 C EQU 0 ;定义进位/借位标志C在STATUS中得地址为026 MOVF 20H 0 ;将20H单元的内容送⼈W27 SUBWF 21H 0 ;⽤21H单元的内容减去W中的内容,结果存在W中28 BTFSS STATUS,C;若C=1,没借位,则21H单元中的数⼤,跳到F21BIG29 GOTO F20BIG ;若C=0,有借位,20H单元中得数较⼤,则跳⾄F20BIG 3031 F21BIG MOVF 21H,0 ;将21H中的内容存⼊W寄存器32 MOVWF 22H ;再将它转存到22H单元33 GOTO STOP ;跳过下⾯两条指令到程序末尾3435 F20BIG MOVF 20H,0 ;将20H中的内容存⼊W寄存器36 MOVWF 22H ;再将它转存到22H单元3738 STOP GOTO STOP ;任务完成,停机,原地踏步394041 ;--------------------------------------------------------4243 ;循环程序结构44 ;数据存储器中,从地址30H开始的50个单元全部写⼊00H45 ;要点:间接寻址寄存器FSR当做地址指针4647 ;---------------------------------------------------------48 COUNT EQU 20H ;指定20H单元作为循坏次数计数器(即循环变量)49 FSR EQU 04H ;定义FSR寄存器地址为04H50 INDF EQU 00H ;设定INDF寄存器地址为00H51 MOVLW D50 ;把计数器初值50送⼊W52 MOVWF COUNT ;再把50转⼊计数器(作为循环变量的操作值)53 MOVLW 30H ;把30H(起始地址)送⼊W54 MOVWF FSR ;再把30H转⼊寄存器FSR(⽤作地址指针)5556 NEXT CLRF INDF ;把以FSR内容为地址所指定的单元清057 INCF FSR,1 ;地址指针内容加1,指向下⼀单元58 DECFSZ COUNT,1 ;计数值减1,结果为0就跳过到下⼀条指令到STOP处59 GOTO NEXT ;跳转回去并执⾏下⼀次循环60 STOP GOTO STOP ;循环结束之后执⾏该语句,实现停机6162 ;--------------------------------------------------------6364 ;⼦程序结构65 ;3个数最⼤者放⼊40H单元6667 ;---------------------------------------------------------68 STATUS EQU 03H69 C EQU 00H70 X EQU 20H71 Y EQU 21H72 Z EQU 22H73 ;--------------------------------------------------------7475 ;主程序7677 ;---------------------------------------------------------7879 MAIN MOVF 30H,080 MOVWF X81 MOVF 21H,082 MOVWF Y83 CALL SUB84 MOVF Z,085 MOVWF X86 MOVF 32H,087 MOVWF Y88 CALL SUB89 MOVF Z,090 MOVWF 40H91 STOP GOTO STOP92 ;--------------------------------------------------------9394 ;⼦程序:(⼊⼝参数:X和Y,出⼝参数:Z)9596 ;---------------------------------------------------------97 SUB MOVF X,0 ;将X内容送⼈W98 SUBWF Y,0 ;Y内容减去W内容,结果存⼊W99 BTFSS STATUS,C;若C=1,没有发⽣借位,执⾏下⼀条,否则跳转100 GOTO X_BIG101102 Y_BIG MOVF Y,0 ;将Y中的数据送⼊W103 MOVWF Z ;再将它转存到Z104 GOTO THEEND ;跳过下⾯两条到末尾105106 X_BIG MOVF X,0 ;将X中的数据送⼊W107 MOVWF Z ;再将它转存到Z108 THEEND RETURN ;⼦程序返回。
PIC汇编语言程序设计基础汇编语言是一种底层的计算机语言,可以直接操作计算机的硬件。
PIC汇编语言是一种常用于单片机(microcontroller)的汇编语言,主要用于编写控制程序。
本文将介绍PIC汇编语言的基本概念和学习方法。
首先,了解一些关于单片机的基本知识是很有帮助的。
单片机是一种集成电路,它包含了处理器、内存和输入输出接口等功能。
常用的单片机系列有PIC、AVR和8051等。
其中,PIC是由美国Microchip公司开发的一系列单片机。
学习PIC汇编语言的基础知识包括以下几个方面:1.计算机系统的基本概念:了解计算机系统的组成,包括处理器、内存和输入输出设备等。
了解汇编语言是如何运行在计算机系统上的。
2.汇编语言的基本知识:了解汇编语言的语法和指令集。
汇编语言是一种低级语言,使用符号代表具体的机器指令。
掌握汇编语言的基本语法,如变量声明、标号、指令和操作数等。
3.PIC汇编语言的特点:了解PIC单片机的特点和架构。
掌握PIC汇编语言的指令集和寄存器的使用方法。
了解数据存储器、程序存储器和特殊功能寄存器等的地址和用途。
4.单片机的编程方法:学习如何编写控制程序,包括输入输出控制、中断处理和定时器等。
了解控制程序的基本结构,如初始化、主循环和中断处理程序等。
在学习PIC汇编语言时,可以通过以下几种途径进行:1. 理论学习:可以通过阅读相关的教材和参考书籍了解PIC汇编语言的基本概念和语法。
可以参考Microchip官方提供的PIC汇编语言手册。
2. 实验实践:可以通过实验和实践的方式学习。
可以利用单片机开发板进行实验,通过编写控制程序来实现一些简单的功能。
可以使用Microchip官方提供的开发环境和仿真器。
3.网上资源:可以利用互联网上的资源进行学习。
有很多相关的教程和视频可以参考。
可以加入一些技术论坛和交流群组,与其他学习者进行交流和探讨。
在学习和实践过程中1.理解问题:首先要明确需要解决的问题,确定需要设计和实现的功能。
PIC汇编指令PIC18F系列d:目标寄存器选择位 0表示结果保存至W寄存器中,1表示保存到文件寄存器f中。
a: 快速操作RAM位0表示快速操作RAM内的RAM单元(BSR寄存器被忽略)。
1表示存储区由BSR指定面向字节的操作指令1、ADDWF f,d,a;将f中的内容与W中的内容相加,存储在d提定的寄存器中.2、ADDWFC f,d,a;将f中的内容与W中的内容带进位相加3、ANDWF f,d,a;将f中的内容与W中的内容逻辑与运算4、CLRF f,a; 将f清零5、COMF f,d,a;将f取反6、CPFSEQ f,a; 将f与w作比较,相等则跳过下一句7、CPFSGT f,a; 将f与w作比较,大于则跳过8、CPFSLT f,a; 将f与w作比较,小于则跳过9、DECF f,d,a; f减110、DECFSZ f,d,a; f减1,为0则跳过11、DCFSNZ f,d,a; f减1,非0则跳过12、INCF f,d,a; f加113、INCFSZ f,d,a; f加1,为0则跳过14、INFSNZ f,d,a; f加1,非0则跳过15、IORWF f,d,a; 将f中的内容与W中的内容逻辑或运算16、MOVF f,d,a; 传送f17、MOVFF fs,fd; 将fs(源地址)传送给fd(目的地址)18、MOVWF f,a;将w传给f19、MULWF f,a;将w乘以f20、NEGF f,a;将f取补21、RLCF f,d,a;将F执行带进位循环左移22、RLNCF f,d,a;将F执行不带进位循环左移23、RRCF f,d,a;将F执行带进位循环右移24、RRNCF f,d,a;将F执行不带进位循环左移25、SETF f,a;将F全部置126、SUBFWB f,d,a;将W减去F(带借位)27、SUBWF f,d,a;将f减去W28、SUBWFB f,d,a;将f减去W(带借位)29、SW APF f,d,a;将f中的两个半字节进行交换30、TSTFSZ f,a; 测试f,为0则跳过31、XORWF f,d,a; W与f作逻辑异或运算面向位的操作类指令32、BCF f,b,a; 将F寄存器中的某位清零33、BSF f,b,a; 将F寄存器中的某位置134、BTFSC f,b,a; F中的某位为0则跳过35、BTFSS f,b,a; F中的某位为1则跳过36、BTG f,b,a; F中的某位取反控制操作类指令37、BC n; 进位则跳转38、BN n; 为负则跳转39、BNC n;无进位则跳转40、BNN n;不为负则跳转41、BNOV n;不溢出则跳转42、BNZ n;不为零则跳出43、BOV n;溢出则跳转44、BRA n;无条件跳转45、BZ n;为零则跳转46、CALL n,s;调用子程序47、CLRWDT ;清看门狗48、DAW ;将W进行十进制调整49、GOTO n;跳转到地址50、NOP ;空操作51、POP ;出栈52、PUSH;压栈53、RCALL n;相对调用54、RETFIE s;中断返回使能55、RESET ;用软件使器件复位56、RETLW k;返回时将立即数送入W57、RETURN s;从子程序返回58、SLEEP 进入待机模式立即数操作指令59、ADDLW k;W与立即数相加60、ANDLW K;立即数与W作逻辑与运算61、IORLW k;立即数与W作逻辑或运算62、LFSR f,k; 将立即数送给FSR63、MOVLB k;将立即数传送给BSR64、MOVLW k;将立即数传送给W65、MULLW k;立即数与W相乘66、RETLW k;返回时将立即数与W相乘67、SUBLW k;立即数减去W68、XORLW k;立即数与WREG作逻辑异或运算数据存储器---程序存储器操作类指令69、TBLRD* ;表读70、TBLRD* +;后增表读71、TBLRD* -;后减表读72、TBLRD+ *;预增表读73、TBLWT* ;表写74、TBLWT* +;后增表写75、TBLWT* -;后减表写76、TBLWT+ *;预增表写PIC16系列1、ADDWF f,d;将f中的内容与W中的内容相加,存储在d提定的寄存器中.2、ANDWF f,d;将f中的内容与W中的内容逻辑与运算3、CLRF f;将f清零4、CLRW ;将W清零5、COMF f,d;将f取反6、DECF f,d; f减17、DECFSZ f,d; f减1,为0则跳过8、INCF f,d; f加19、INCFSZ f,d; f加1,为0则跳过10、IORWF f,d; 将f中的内容与W中的内容逻辑或运算11、MOVF f,d; 传送f,d=0则传给W,d=1则传给自已12、MOVWF f;将w传给f13、RLF f,d;将F执行带进位循环左移14、RRF f,d;将F执行带进位循环右移15、SUBWF f,d;将f减去W16、SW APF f,d;将f中的两个半字节进行交换17、XORWF f,d; W与f作逻辑异或运算面向位的操作类指令18、BCF f,b; 将F寄存器中的某位清零19、BSF f,b; 将F寄存器中的某位置120、BTFSC f,b; F中的某位为0则跳过21、BTFSS f,b; F中的某位为1则跳过立即数操作指令22、ADDLW k;W与立即数相加23、ANDLW K;立即数与W作逻辑与运算24、IORLW k;立即数与W作逻辑或运算25、MOVLW k;将立即数传送给W26、CALL k;调用子程序27、GOTO k;跳转到地址28、RETFIE ;中断返回使能29、RETLW k;返回时将立即数送入W30、RETURN ;从子程序返回31、SLEEP 进入待机模式32、SUBLW k;立即数减去W33、XORLW k;立即数与WREG作逻辑异或运算34、NOP。
PIC指令介绍2006-12-24 03:03:05来源:嵌入式技术网关键字: PIC指令系统<a target='_blank' href='/www/delivery/ck.php?n=826cd67'><img border='0' alt='' src='/www/delivery/avw.php?zoneid=212&n=826cd67' /></a>工作以来一直使用ST的单片机,其他的单片机虽大致了解但从未认真看过,近几日恰好无事,决定熟悉一下PIC的单片机,于是想将自己从网上或这书本上的东西转下来,予以同一样的初学者共同参考。
PIC的指令系统PIC 8位单片机共有三个级别,有相对应的指令集。
基本级PIC 系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。
其指令向下兼容。
一、PIC汇编语言指令格式PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:标号操作码助记符操作数1,操作数2;注释指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1 标号与MCS-51系列单片机功能相同,标号代表指令的符号地址。
在程序汇编时,已赋以指令存储器地址的具体数值。
汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。
标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。
在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。
指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。
PIC单片机指令系统和汇编语言程序设计PIC(Peripheral Interface Controller)单片机是一种微控制器,它由微芯科技公司推出,广泛应用于嵌入式系统中。
PIC单片机的指令系统是它的核心,它定义了单片机可以执行的操作和命令。
汇编语言程序设计是使用汇编语言编写的PIC单片机程序的过程。
PIC单片机的指令系统包含了多个指令,每个指令都对应着一条特定的操作。
这些操作可以是算术运算、逻辑运算、数据传输、位操作等。
指令系统的设计考虑了单片机的资源限制,以使其能够在有限的资源条件下完成各种任务。
汇编语言是一种低级语言,它与机器语言相似,但更具可读性。
在PIC单片机编程中,汇编语言常用于编写程序。
汇编语言程序设计包括了以下几个方面:1.汇编语言的语法:汇编语言有自己的语法规则,包括指令的书写方式、注释的使用、标号的定义等。
了解汇编语言的语法对于编写正确的程序至关重要。
2.寄存器的使用:PIC单片机有多个寄存器用于存储数据和指令。
在汇编语言程序中,需要了解不同寄存器的功能和使用方法,以便正确地读写数据。
3.指令的编写:编写汇编语言程序需要了解不同指令的功能、操作数的使用和指令的影响。
不同的指令可以实现不同的操作,如加法、逻辑运算、数据传输等。
4.程序的逻辑结构:汇编语言程序需要按照一定的逻辑结构编写,包括初始化程序、主循环、中断处理等。
了解如何组织程序结构对于编写清晰、可读性强的程序至关重要。
5.调试和优化:在编写汇编语言程序时,常常需要进行调试和优化,以确保程序能够正确地运行。
了解如何使用调试工具和优化技巧对于提高程序的效率和稳定性至关重要。
总之,PIC单片机的指令系统和汇编语言程序设计是使用PIC单片机进行编程的基础。
掌握了这些知识,可以编写高效、可靠的PIC单片机程序,实现各种嵌入式系统的功能。
PIC8 位单片机汇编语言常用指令
各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。
PIC 8 位单片机共有三个级别,有相对应的指令集。
基本级PIC 系列芯片共有指令33 条,每条指令是12 位字长;中级PIC 系列芯片共有指令35 条,每条指令是14 位字长;高级PIC 系列芯片共有指令58 条,每条指令是16 位字长。
其指令向下兼容。
在这里笔者介绍PIC 8 位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。
一、PIC 单片机汇编语言指令格式
PIC 系列微控制器汇编语言指令与MCS-51 系列单片机汇编语言一样,每条汇编语言指令由4 个部分组成,其书写格式如下:
标号操作码助记符操作数1,操作数2;注释
指令格式说明如下:指令的4 个部分之间由空格作隔离符,空格可以是1 格或多格,以保证交叉汇编时,PC 机能识别指令。
1 标号与MCS-51 系列单片机功能相同,标号代表指令的符号地址。
在。
pic单片机汇编语言程序设计实例一、前言单片机是现代电子技术中的重要组成部分,而汇编语言则是单片机编程中最基础的语言。
本文将以PIC单片机为例,介绍汇编语言程序设计实例。
二、PIC单片机简介PIC(Peripheral Interface Controller)是一种微控制器,由美国Microchip Technology公司开发。
PIC单片机具有体积小、功耗低、价格便宜等优点,广泛应用于各种电子设备中。
三、汇编语言基础1. 寄存器PIC单片机有许多寄存器,其中最常用的有W寄存器和F寄存器。
W 寄存器是一个8位的通用寄存器,可用于存储临时数据;F寄存器则是一个8位的特殊功能寄存器,可用于控制各种外设。
2. 指令集PIC单片机的指令集非常丰富,涵盖了各种数据操作、逻辑运算、跳转等指令。
例如:- MOVF:将指定地址中的数据移动到W寄存器中;- ADDWF:将指定地址中的数据与W寄存器中的数据相加,并将结果保存到指定地址中;- BTFSS:测试指定地址中某一位是否为0,并跳过下一条指令。
3. 标志位PIC单片机还有一些标志位,用于记录各种状态信息。
其中最常用的有C(进位标志位)、Z(零标志位)和DC(半进位标志位)。
四、汇编语言程序设计实例下面以一个简单的LED闪烁程序为例,介绍PIC单片机汇编语言程序设计。
1. 硬件连接将一个LED连接到PIC单片机的RA0口,通过一个220欧姆电阻限流。
将VDD和VSS分别连接到5V和地。
2. 程序设计首先定义RA0口为输出口,并将其置为低电平。
然后进入一个死循环,在循环中将RA0口置为高电平、延时一段时间、再将RA0口置为低电平、再延时一段时间。
程序如下:LIST P=16F84AINCLUDE "P16F84A.INC"__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON &_HS_OSCORG 0x00GOTO MAINORG 0x04MAIN:MOVLW 0x00 ; 将W寄存器清零TRIS PORTA ; 将PORTA定义为输出口LOOP:BSF PORTA, 0 ; 将PORTA.0置为高电平CALL DELAY ; 延时BCF PORTA, 0 ; 将PORTA.0置为低电平CALL DELAY ; 延时GOTO LOOPDELAY:MOVLW 0x64 ; 将W寄存器设置为100(十进制)DELAY_LOOP:NOP ; 空操作,延时1个指令周期DECFSZ W, F ; 将W寄存器减1,如果不为0则跳转到DELAY_LOOPGOTO DELAY_LOOP ; 否则跳出循环RETURN ; 返回主程序3. 编译和烧录将程序保存为.asm文件,使用MPLAB IDE进行编译和烧录。
PIC16f 8位单片机汇编指令集1。
ADDWF f, d,f寄存器内容与W寄存器相加,d=1时结果放在f,d=0是结果在W,影响STATUS的C,DC和Z标志。
该条指令影响的状态与MCS51一致,有进位时C=1,有半进位时DC=1;否则相反。
结果为0时Z标志置位。
2。
ANDWF f, d,f寄存器内容与W寄存器相与,d=1时结果回存至f,d=0时结果存至W,结果影响STATUS的Z标志位。
3。
CLRF ( CLEAR File Register), 清空页寄存器,STATUS的Z标志位置位4。
CLRW (CLEAR WREG),清空W寄存器,STATUS的Z标志位置位,可以用MOVLW 0H等同使用5。
COMF f, d,f寄存器内容取反,d=1时结果存至f寄存器,d=0时结果存至W 寄存器。
影响Z标志位。
6。
DECF f, d,f寄存器内容自减1,d=1时结果存放于f;d=0时结果存放于w,影响STATUS的Z标志位。
7。
DECFSZ f, d f寄存器内容自减1,为0则跳行,d=1时结果在f寄存器;d=0时结果在W寄存器。
不影响标志位。
8。
INCF f, d,f寄存器内容自加1,d=1时结果回存至f,d=0时结果在W。
影响Z标志位。
9。
INCFSZ f, d,f寄存器内容自加1,结果为0则跳行。
d=1时结果回存至f;d=0时结果存至W寄存器。
该指令不影响标志位。
10。
IORWF f, d,f寄存器内容与W寄存器相或,d=1时结果回存至f,d=0时结果存至W,结果影响STATUS的Z标志位。
11。
MOVF f, d,当d=1时,f寄存器内容不变,d=0时f寄存器内容复制到W寄存器。
当d=1时,只改变Z标志位,可以用与判断f寄存器内容是否为0。
12。
MOVWF , f (MOVE WREG to File Register),很常用的一条指令,将W寄存器的内容保存到RAM中去13。
NOP,没什么可说的,空操作而已,但是确实很常用的语句,短延时必须的。
单片机编程之汇编语言基础-PIC单片机汇编指令1、程序的基本格式先介绍二条伪指令:EQU 标号赋值伪指令ORG 地址定义伪指令PIC16C5X在RESET后指令计算器PC被置为全1,所以PIC16C5X几种型号芯片的复位地址为:PIC16C54/55:1FFHPIC16C56:3FFHPIC16C57/58:7FFH一般来说,PIC的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。
但这里我们推荐一种清晰明了的格式供参考。
TITLE This is ;程序标题;--------------------------------------;名称定义和变量定义;--------------------------------------F0 EQU 0RTCC EQU 1PC EQU 2STATUS EQU 3FSR EQU 4RA EQU 5RB EQU 6RC EQU 7┋PIC16C54 EQU 1FFH ;芯片复位地址PIC16C56 EQU 3FFHPIC16C57 EQU 7FFH;-----------------------------------------ORG PIC16C54 GOTO MAIN ;在复位地址处转入主程序ORG 0 ;在0000H开始存放程序;-----------------------------------------;子程序区;-----------------------------------------DELAY MOVLW 255┋RETLW 0;------------------------------------------;主程序区;------------------------------------------MAINMOVLW B00000000TRIS RB ;RB已由伪指令定义为6,即B口┋LOOPBSF RB,7 CALL DELAYBCF RB,7 CALL DELAY┋GOTO LOOP;-------------------------------------------END ;程序结束注:MAIN标号一定要处在0页面内。
2、程序设计基础1) 设置I/O 口的输入/输出方向PIC16C5X的I/O 口皆为双向可编程,即每一根I/O 端线都可分别单独地由程序设置为输入或输出。
这个过程由写I/O 控制寄存器TRIS f来实现,写入值为1,则为输入;写入值为0,则为输出。
MOVLW 0FH ;0000 1111(0FH)输入输出TRIS 6 ;将W中的0FH写入B口控制器,;B口高4位为输出,低4位为输入。
MOVLW 0C0H ; 11 000000(0C0H)RB4,RB5输出0 RB6,RB7输出12) 检查寄存器是否为零如果要判断一个寄存器内容是否为零,很简单,现以寄存器F10为例:MOVF 10,1 ;F10F10,结果影响零标记状态位ZBTFSS STATUS,Z ;F10为零则跳GOTO NZ ;Z=0即F10不为零转入标号NZ处程序┋;Z=1即F10=0处理程序3) 比较二个寄存器的大小要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位C来判断。
注意,相减的结果放入W,则不会影响二寄存器原有的值。
例如F8和F9二个寄存器要比较大小:MOVF 8,0 ;F8WSUBWF 9,0 ;F9W(F8)WBTFSC STATUS,Z;判断F8=F9否GOTO F8=F9BTFSC STATUS,C ;C=0则跳GOTO F9F8 ;C=1相减结果为正,F9F8GOTO F9F9 ;C=0相减结果为负,F9┋4) 循环n次的程序如果要使某段程序循环执行n次,可以用一个寄存器作计数器。
下例以F10做计数器,使程序循环8次。
COUNT EQU 10 ;定义F10名称为COUNT(计数器)┋MOVLW 8MOVWF COUNT LOOP ;循环体LOOP┋DECFSZ COUNT,1 ;COUNT减1,结果为零则跳GOTO LOOP ;结果不为零,继续循环┋;结果为零,跳出循环5)IFTHEN格式的程序下面以IF X=Y THEN GOTO NEXT格式为例。
MOVF X,0 ;XWSUBWF Y,0 ;YW(X)WBTFSC STATUS,Z ;X=Y 否GOTO NEXT ;X=Y,跳到NEXT去执行。
┋;XY6)FORNEXT格式的程序FORNEXT程序使循环在某个范围内进行。
下例是FOR X=0 TO 5格式的程序。
F10放X 的初值,F11放X的终值。
START EQU 10DAEND EQU 11┋MOVLW 0MOVWF START ;0START(F10)MOVLW 5MOVWF DAEND ;5DAEND(F11)LOOP┋INCF START,1 ;START值加1MOVF START,0SUBWF DAEND,0 ;START=DAEND ?(X=5否)BTFSS STATUS,ZGOTO LOOP;X5,继续循环┋;X=5,结束循环7)DO WHILEEND格式的程序DO WHILEEND程序是在符合条件下执行循环。
下例是DO WHILE X=1格式的程序。
F10放X的值。
X EQU 10┋MOVLW 1MOVWF X ;1X(F10),作为初值LOOP┋MOVLW 1SUBWF X,0BTFSS STATUS,Z ;X=1否?GOTO LOOP ;X=1继续循环┋;X1跳出循环8) 查表程序查表是程序中经常用到的一种操作。
下例是将十进制0~9转换成7段LED数字显示值。
若以B口的RB0~RB6来驱动LED的a~g线段,则有如下关系:设LED为共阳,则0~9数字对应的线段值如下表:十进数线段值十进数线段值0 C0H 5 92H1 C9H 6 82H2 A4H 7 F8H3 B0H 8 80H4 99H 9 90HPIC的查表程序可以利用子程序带值返回的特点来实现。
具体是在主程序中先取表数据地址放入W,接着调用子程序,子程序的第一条指令将W置入PC,则程序跳到数据地址的地方,再由RETLW指令将数据放入W返回到主程序。
下面程序以F10放表头地址。
MOVLW TABLE ;表头地址F10MOVWF 10┋MOVLW 1 ;1W,准备取1的线段值ADDWF 10,1 ;F10+W =1的数据地址CALL CONVERTMOVWF 6 ;线段值置到B口,点亮LED┋CONVERT MOVWF2;WPC TABLERETLW 0C0H ;0线段值RETLW 0F9H ;1线段值┋RETLW 90H ;9线段值9)READDATA,RESTORE格式程序READDATA程序是每次读取数据表的一个数据,然后将数据指针加1,准备取下一个数据。
下例程序中以F10为数据表起始地址,F11做数据指针。
POINTER EQU 11 ;定义F11名称为POINTER┋MOVLW DATAMOVWF 10 ;数据表头地址F10CLRF POINTER ;数据指针清零┋MOVF POINTER,0ADDWF 10,0 ;W =F10+POINTER┋INCF POINTER,1 ;指针加1CALL CONVERT ;调子程序,取表格数据┋CONVERT MOVWF 2 ;数据地址PCDATA RETLW 20H ;数据┋RETLW 15H ;数据如果要执行RESTORE,只要执行一条CLRF POINTER即可。
10) 延时程序如果延时时间较短,可以让程序简单地连续执行几条空操作指令NOP。
如果延时时间长,可以用循环来实现。
下例以F10计算,使循环重复执行100次。
MOVLW D100MOVWF 10LOOP DECFSZ 10,1 ;F101F10,结果为零则跳GOTO LOOP┋延时程序中计算指令执行的时间和即为延时时间。
如果使用4MHz振荡,则每个指令周期为1S。
所以单周期指令时间为1S,双周期指令时间为2S。
在上例的LOOP循环延时时间即为:(1+2)*100+2=302(S)。
在循环中插入空操作指令即可延长延时时间:MOVLW D100MOVWF 10LOOP NOPNOPNOPDECFSZ 10,1GOTO LOOP┋延时时间=(1+1+1+1+2)*100+2=602(S)。
用几个循环嵌套的方式可以大大延长延时时间。
下例用2个循环来做延时:MOVLW D100MOVWF 10LOOPMOVLW D16MOVWF 11LOOP1 DECFSZ 11,1GOTO LOOP1DECFSZ 10,1GOTO LOOP┋延时时间=1+1+[1+1+(1+2)*16-1+1+2]*100-1=5201(S)11) RTCC计数器的使用RTCC是一个脉冲计数器,它的计数脉冲有二个来源,一个是从RTCC引脚输入的外部信号,一个是内部的指令时钟信号。
可以用程序来选择其中一个信号源作为输入。
RTCC可被程序用作计时之用;程序读取RTCC寄存器值以计算时间。
当RTCC作为内部计时器使用时需将RTCC管脚接VDD或VSS,以减少干扰和耗电流。
下例程序以RTCC做延时:RTCC EQU 1┋CLRF RTCC ;RTCC清0MOVLW 07HOPTION ;选择预设倍数1:256RTCCLOOP MOVLW 255 ;RTCC计数终值SUBWF RTCC,0BTFSS STATUS,Z ;RTCC=255?GOTO LOOP┋这个延时程序中,每过256个指令周期RTCC寄存器增1(分频比=1:256),设芯片使用4MHz振荡,则:延时时间=256*256=65536(S)RTCC是自振式的,在它计数时,程序可以去做别的事情,只要隔一段时间去读取它,检测它的计数值即可。
12) 寄存器体(BANK)的寻址对于PIC16C54/55/56,寄存器有32个,只有一个体(BANK),故不存在体寻址问题,对于PIC16C57/58来说,寄存器则有80个,分为4个体(BANK0-BANK3)。
在对F4(FSR)的说明中可知,F4的bit6和bit5是寄存器体寻址位,其对应关系如下:Bit6 Bit5 BANK 物理地址00 BANK0 10H~1FH0 1 BANK1 30H~3FH1 0 BANK2 50H~5FH1 1 BANK3 70H~7FH当芯片上电RESET后,F4的bit6,bit5是随机的,非上电的RESET则保持原先状态不变。
下面的例子对BANK1和BANK2的30H及50H寄存器写入数据。
例1.(设目前体选为BANK0)BSF 4,5;置位bit5=1,选择BANK1MOVLW DATAMOVWF 10H ; DATA30HBCF 4,5BSF 4,6 ;bit6=1,bit5=0选择BANK2MOVWF 10H ;DATA50H从上例中我们看到,对某一体(BANK)中的寄存器进行读写,首先要先对F4中的体寻址位进行操作。