PIC单片机常用指令
PIC单片机简介
PIC 单片机简介
PIC 单片机简介:
PIC 单片机(Peripheral Interface Controller)是一种用来可开发的去控制外围设备的可编程集成电路(IC)。
由美国Microchip(微星)公司推出的PIC
单片机系列产品,首先采用了RISC 结构的嵌入式微控制器,其高速度、低
电压、低功耗、大电流LCD 驱动能力和低价位OTP 技术等都体现出单片机
产业的新趋势。
现在PIC 系列单片机在世界单片机市场的份额排名中已逐年
升位,尤其在8 位单片机市场,据称已从1990 年的第20 位上升到目前的第
二位。
PIC 单片机从覆盖市场出发,已有三种(又称三层次)系列多种型号的产
品问世,所以在全球都可以看到PIC 单片机从电脑的外设、家电控制、电讯
通信、智能仪器、汽车电子到金融电子各个领域的广泛应用。
现今的PIC 单
片机已经是世界上最有影响力的嵌入式微控制器之一。
PIC 单片机特点:
1、精简指令集(RISC)技术
PIC 系列单片机的指令系统只有35 条指令,常用约20 条
好学、易用;绝大多数为单周期指令,执行速度快!
MCS-51 系列单片机指令系统有111 条指令!。
PIC单片机之汇编语言
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单片机指令集
DECF f,d; 对f的内容作减1运算,结果按d指定地址存放,结果d=0,则z=0.
INCF f,d; 对f的内容作递增1,结果按d指定地址存放,结果d=0,则z=0
COMF f,d; 对f的内容取反,求某个数的补码即可通过此指令后加1,影响标志位z。
SLEEP ; cpu进入休休眠模式.
end
如果传送的数据为0侧标志z置位
CLRW ;该指令对w寄存器清0,同时标志位z置位0。另外有一条指令movlw 0x00也可以使w寄存器
清0,但不影响任何状态标志。
CLRF ;对数据寄存器f清0,同时标志位z置0.
ADDWF f,d;数据寄存器f的内容与w的内容相加,结果d=f,w的内容不变;d=w,数据寄存器f内容不变,
的13位地址.
RETURN; 子程序结束返回
RETLW ; 子程序ቤተ መጻሕፍቲ ባይዱ束返回并在w寄存器内赋一8位立即数.其他执行同(RETURN...),该指令常用于查表功能
RETFIE ; 中断程序结束并返回,(弹出栈顶内容到PC,同是把INTCON寄存器的第7位GIE置1.
CLRWDT ; 看门狗计数器清0
不影响标志位.
ADDLW k; 把w寄存器的值和立即数(8位)相加,结果存放在w.
影响标志位 z dc c
SUBLW k; 立即数减去w,如果k=w,则z=1;k>w,则c=1;k<w,则c=0
IORLW k; w寄存器与立即数相或,结果存放在w,影响标志位 z.
********字节操作指令*******
NOP - ;空操作
MOVWF f ;把W寄存器的内容传送至数据寄存器中,w寄存器的内容保持不变,不影响标志位
PIC单片机常用指令
LIST P=16C71TEMPC EQU0CH;定義通用寄存器TEMPD EQU0DHTEMPE EQU0EHPABUF EQU20HPBBUF EQU21HCOUNT EQU0FH;計數寄存器MSDTIME EQU10H;高2位顯示數寄存器LSDTIME EQU11H;低2位顯示數寄存器;FLAG EQU12H;定義FLAG寄存器位KEYHIT EQU0DEBNCEON EQU1NOENTER EQU2SERVKEY EQU3ADOVER EQU4;A/D轉換溢出標志位;DEBNCE EQU13H;去抖動計數器EQU14HEQU15H;放通道數EQU16H;4通道A/D結果地址(16H-19H);H-BYTE EQU20H;二進制結果高位寄存器L-BYTE EQU21H;二進制結果低位寄存器R0EQU22H;最高位BCD數寄存器R1EQU23HR2EQU24H;最低位BCD數寄存器COUNT EQU26HTEMP EQU27HWBUFFER EQU2FH;W緩沖寄存器SBUFFER EQU2EH;STATUS緩沖寄器PCL EQU2;INCLUDE"P16CXX,EQU";ORG0GOTO START;ORG4;中斷向量MOVWF WBUFFER;將W內容存入緩沖器(保護現場)SWAPF WBUFFERSWAPF STATUS,WMOVWF SBUFFER;將STATUS內容存入緩沖器CALL SERV-INT;進行中斷處理SWAPF SBUFFER,WMOVWF STATUS;恢復STATUS(恢復現場)SWAPF WBUFFER,W;恢復W內容RETFIE;START;主程序開始CALL INPORTS;I/O口初始化CALL INAD;A/D初始化CALL INTIMERS;定時器初始化LOOP BTFSC FLAG,;要進行鍵處理否?CALL SERVICEKEY;是,進行鍵處理BTFSC FLAG,ADOVER;A/D轉換完否?CALL SERVICEAD;是,進行A/D數據處理GOTO LOOP;否,循環等待;SERVICEKEY;鍵處理子程序BCF FLAG,;清按鍵標志MOVF NEWKEY,W;取鍵值SUBLW3;判健值>3否?BTFSS STATUS,C;小於3則跳轉RETURN;大於3返回MOVF NEWKEY,WMOVWF DISPCH;更新通道LOADMOVLW ADTABLE;取A/D結果數據表的首地址ADDWF NEWKEY,W;加偏移量MOVWF FSR;存入FSR寄存器MOVF INDF,W;取A/D值MOVWF L-BYTECLRF H-BYTECALL B2-BCDMOVF R2,W取低兩位顯示值MOVWF LSDTIME;存入低2位顯示數寄存器MOVF R1,W取高兩位顯示值MOVWF MSDTIME;存入高2位顯示數寄存器RETURN;;存A/D結果(0通道->ADTABLE,1通道->工ADTABLE+1,…)SERVICEADMOVF ADCON0,W;讀ADCON0MOVWF TEMPC;存入TEMPCMOVLW B'00001000';選下一個通道ADDWF ADCON0,WBTFSC ADCON0,5;通道數<=3否?MOVLW B'11000000';否,重選0通道MOVWF ADCON0MOVLW ADTABLEMOVWF FSR;A/D結果數據表首址-->FSRRRF TEMPCRRF TEMPCRRF TEMPC,W;通道數-->WANDLW3;屏蔽高6位ADDWF FSR;加偏移量至數據表MOVF ADRES,W;取A/D結果MOVWF INDF;存入FSR指定的寄存器BCF FLAG,ADOVER;清A/D溢出標志CALL LOAD RETURN ;INPORTS;I/O 口初始化BSF STATUS,RP0;選寄存器區1MOVLW 3MOVWF ADCON1;設置RA <0~3>為數字 I /O 口CLRF TRISA ;設置RA <0~4>為輸出CLRF TRISB ;設置RB <0~7>為輸出BCF STATUS,RP0;選寄存器區0CLRF RA CLRF RB ;置所有輸出口為低□電平BSF RA,3;使能最高顯示數字位RETURN ;CLRF MSDTIME ;清高位寄存器CLRF LSDTIME ;清低位寄存器CLRF DISPCH ;選通道0CLRF FLAG ;清標志BSF STATUS,RP0;選寄存器區1MOVLW B'0000100'MOVWF OPTION_R ;設RTCC 分頻比為1:32BCF STATUS,RP0;選寄存器區0MOVLW B'00100000';允許RTCC 中斷MOVWF INTCON MOVLW .96;設RTCC 初值MOVWF RTCC ;開始計時RETFIE ;SERV_INTBTFSC INTCON,RTIF ;是RTCC 中斷否?GOTO SERVRTCC ;是,進行中斷處理CLRF INTCON ;清中斷寄存器BSF INTCON,RTIF RETURN ;SERVRTCCMOVLW .96MOVWF RTCC ;設RTCC 初值BCF INTCON,RTIF ;清中斷標志BTFSC RA,0CALL SCANKEYS ;掃描鍵盤BTFSC RA,3CALL SAMPLEAD CALL DISPLAY ;進行數據顯示RETURN ;BTFSS FLAG,DEBNCEO N ;清抖動否?GOTO SCAN1;否,轉SCAN1INTIMERS ;內部振蕩,RTCC 預分頻比1:32,RTCC 每5ms 中斷一次SCANKEYS ;4*4鍵盤矩陣掃描,鍵值(0~F)-->NEWKEY,掃描速率20ms(4.069MHz)DECFSZDEBNCE ;DEBNCE 內容減1RETURNBSFFLAG,DEBNCEO N ;清DEBNCEON 位RETURNSCAN1CALLSAVEPORTS ;存I/O 口值MOVLWB'11101111'MOVWFTEMPD SCANNEXT MOVFRB,W ;讀RB 口值BCFINTCON,RBIF ;清RB 口中斷標志位RRFTEMPD ;TEMPD 內容右移BTFSSSTATUS,C ;是否有進位位?GOTONOKEY ;無,轉NOKEY MOVFTEMPD,W ;有,讀輸出數MOVWFRB ;送RB 口輸出NOPBTFSSINTCON,RBIF ;RB 口電平變化否?GOTOSCANNEXT ;無,轉SCANNEXT BTFSCFLAG,KEYHIT ;有,鍵釋放否?GOTOSKRETURN ;沒有,轉SKRETURN BSFFLAG,KEYHIT ;是,設釋放標志位SWAPFRB,W ;取RB 口數MOVWFTEMPE ;存入TEMPE 寄存器CALLKEYVALUE ;取健值MOVWFNEWKEY ;鍵值存入NEWKEY 寄存器BSFFLAG,SERVKEY BSFFLAG,DEBNCEO N ;設置FLAG 的標志位MOVLW4MOVWFDEBNCE ;裝入消抖動初值SKRETURN CALLRESPORTS ;存儲 I/O 口值RETURN;NOKEY BCFFLAG,KEYHIT ;清KEYHIT 標志位GOTOSKRETURN KEYVALUECLRFTEMPC BTFSSTEMPD,3;檢測第一列GOTOROWVALEND INCFTEMPC BTFSSTEMP,2;檢測第二列GOTOROWVALEND INCFTEMPC BTFSSTEMPD,1;檢測第三列GOTOROWVALEND INCFTEMPC ROWVALENDBTFSSTEMPE ,0;是第一行否?GOTOGETVALCOM ;是,取0,1,2,3BTFSSTEMP ,1;是第二行否?GOTOGET4567;是,取4,5,6,7BTFSS TEMPE ,2;是第三行否?GOTO GET89AB;是,取8,9,A,BGETCDEF BSF TEMPC,2;設置最高位GET89AB BSF TEMPC,3GOTO GETVALCOMGET4567BSF TEMPC,2GETVALCOM MOVF TEMPC,WADDWF PCLRETLW0HRETLW1HRETLW2HRETLW3HRETLW4HRETLW5HRETLW6HRETLW7HRETLW8HRETLW9HRETLW0AHRETLW0BHRETLW0CHRETLW0DHRETLW0EHRETLW0FHSAVEPORTS ;在鍵盤掃描期間保存RA口和RB口狀態MOVF RA,W;讀RA口數值MOVWF PABUF;存入緩沖器CLRF RA;禁止所有的接收MOVF RB,W;讀RB口數值MOVWF PBBUF;存入緩沖器MOVLW0FFH;使RB口全部輸出高電平MOVWF RBBSF STATUS,RP0;選寄存器區1BCF OPTION R,7;RB口弱上拉使能MOVLW B'11110000'MOVWF TRISB;設置RB口高4位輸入,低4位輸出BCF STATUS,RP0;選寄存器區0RETURNRESPORTS ;在鍵盤掃描後恢復RA口和RB口狀態MOVF PBBUF,W;取RB口數值MOVWF RBMOVF PABUF,W;取RA口數值MOVWF RABSF STATUS,RP0BSF OPTION-R,7;關閉RB口弱上拉CLRF TRISA;設置RA口為輸出CLRF TRISB;設置RB口為輸出BCF STATUS,RP0RETURN;DISPLAY MOVF RA,W;送接收數到WCLRF RA;禁止所有數據接收ANDLW0FH;屏蔽高4位MOVWF TEMPC;存接收值到TEMPCBSF TEMPC,4;預置最低顯示數RRF TEMPC;右移取下一位BTFSS STATUS,C;進位位C=1?BCF TEMPC,3;否,重置低顯示位BTF SCTEMPC,0;是否最高位?GOTO UPDATAMSD;是,取最高位值BTFSC TEMPC,1;是否第3位GOTO UPDATA3LED;是,取第3位值BTFSC TEMPC,2;是否第2位GOTO UPDATA2LED;是,取第2位值UPDATALSDMOVF LSDTIME,W;最低數送WANDLW0FH;屏蔽高4位GOTO DISPLAYOUT;數據顯示UPDATA2LEDSWAPF LSDTIME,W;第2位數送WANDLW0FHGOTO DISPLAYOUTUPDATA3LEDMOVF MSDTIME;第3位數送WANDLW0FHGOTO DISPLAYOUTUPDATAMSDSWAPF MSDTIME,W;最高位數送WANDLW0FHDISPLAYOUTCALL LSDTABLE;取段碼值MOVFWF RB;由RB口輸出顯示MOVF TEMPC,W;取接收值送WMOVFWF RARETURN;LEDTABLEADDWF PCL;加偏移量到PC低位RETLW B'00111111';顯示0的段碼RETLW B'00000110';顯示1的段碼RETLW B'01011011';顯示2的段碼RETLW B'01001111';顯示3的段碼RETLW B'01100110';顯示4的段碼RETLW B'01101101';顯示5的段碼RETLW B'01111101';顯示6的段碼RETLW B'00000111';顯示7的段碼RETLW B'01111111';顯示8的段碼RETLW B'01100111';顯示9的段碼RETLW B'01110111';顯示A的段碼RETLW B'00111100';顯示B的段碼RETLW B'00111001';顯示C的段碼RETLW B'01011110';顯示D的段碼RETLW B'01111001';顯示E的段碼RETLW B'01110001';顯示F的段碼;INAD MOVLW B'11000000';選內部RC振蕩MOVWF ADCON0RETURN;SAMPLEADCALL SAVEPORTSCALL DOAD;進行A/D轉換ADDONE BTFSC ADCON0,2;A/D轉換完否GOTO ADDONE;沒完則循環等待BSF FLAG,ADOVER;設置A/D溢出標志CALL RESPORTS;恢復I/O口狀態RETURN;DOAD CLRF RB;滅LED顯示BSF STATUS,RP0MOVLW0FHMOVWF TRISA;設置RA口低4位輸入BCF STATUS,RP0BSF ADCON0,0;啟動A/DMOVLW0.125CALL WAIT;等待BSF ADCON0,2;置A/D結束標志RETURN;WAIT MOVWFNEXT DECFSZGOTORETURN;B2-BCD BCF STATUS,0;清進位位MOVLW0.16MOVWF COUNT;設計數器初值CLRF R0CLRF R1CLRF R2LOOP16RLF L-BYTERLF H-BYTERLF R2RLF R1RLF R0DECFSZ COUNTGOTO ADJDEC;十進制轉BCD碼RETLW0;ADJDEC MOVLW R2MOVWF FSRCALL ADJBCD;調轉BCD碼子程序;MOVLW R1MOVWF FSRCALL ADJBCD;調轉BCD碼子程序;MOVLW R0MOVWF FSRCALL ADJBCD;調轉BCD碼子程序;GOTO LOOP16;ADJBCD MOVLW3ADDWF INDF,WMOVWF TEMPBTFSC TEMP,3;測試低4位結果>7否?MOVWF INDFMOVLW30ADDWF INDF,WMOVWF TEMPBTFSC TEMP,7;測試高4位結果>7否?MOVWF INDFRETLW0;END。
PIC单片机汇编指令集
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汇编语言指令
PIC 8位单片机共有三个级别,有相对应的指令集。
基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。
其指令向下兼容。
一、PIC汇编语言指令格式PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:标号操作码助记符操作数1,操作数2;注释指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1标号与MCS-51系列单片机功能相同,标号代表指令的符号地址。
在程序汇编时,已赋以指令存储器地址的具体数值。
汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。
标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。
在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。
指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。
再有标号不能用操作码助记符和寄存器的代号表示。
标号也可以单独占一行。
2操作码助记符该字段是指令的必选项。
该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3操作数由操作数的数据值或以符号表示的数据或地址值组成。
若操作数有两个,则两个操作数之间用逗号(,)分开。
当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。
还可以是被定义过的标号、字符串和ASCⅡ码等。
具体表示时,规定在二进制数前冠以字母“B”,例如B;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。
PIC指令集
睡眠指令
省电状态清0超时位置1,看门狗、预分 频清0,振荡器无输出
SLEEP
空操作指令
不做任何操作
NOP
MOVF FSR,0 FSR=0x1A时执行后W=0x1A
W寄存器传送指令
把W寄存器中的值传送到目标寄存器f 中
MOVWF OPTION ;OPTION=0xFF,W=0xE5时执行后 OPTION=0xE5,W=0xE5
寄存器加1,为零 f寄存器中值加1,结果存于目标寄存器,结果为 HERE INCFSZ CNT,1;GOTO LOOP;CONTINUE;PC=HERER执行后,
时跳指令
1执行下一条指令,结果为0忽略并用NOP代替. CNT=CNT减1,当CNT=0,PC=CONTINUE,当CNT≠0时PC=HERE减1
带进位左移指令
C位放在f值的MSB之前当作9位,然后每个位向 RLF REG1,0;REG1=1110 0110,C=0时执行后 左移,C位移到0,结果存于目标寄储器 REG1=1110 0110,W=11001100,C=1
W寄存器中的值和f寄存器中的值相 加,结果存于目标寄存器
ADDWF FSR,0 ;W中的值加FSR的中的值
寄存器减法指令
f寄存器中的值减去W寄存器中的值, SUBWF REG1,1;REG1减去W中的值(结果为正C=1、Z=0;结
运算存于目标寄存中
果为零C=1,Z=0;结果为负时C=0、Z=0
寄存器加1指令
时跳指令
1执行下一条指令,结果为0忽略并用NOP代替. CNT=CNT加1,当CNT=0,PC=CONTINUE,当CNT≠0时PC=HERE加1
寄存器减1,为零 f寄存器中值减1,结果存于目标寄存器,结果为 HERE DECFSZ CNT,1;GOTO LOOP;CONTINUE;PC=HERER执行后,
单片机编程之汇编语言基础-PIC单片机汇编指令
单片机编程之汇编语言基础-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页面内。
pic指令
• 指令系统向上兼容,整个指令系统按操作方式大体
可以分为如下三类,对于不同系列单片机的各类指 令条数也不相同。
分类2
– (1)字节操作类指令:12位指令系统单片机 和14位指令系统单片机均为18条,16位指令系 统单片机为36条; – (2)位操作类指令:12位指令系统单片机和 14位指令系统单片机均为4条,16位指令系统 单片机为5条; – (3)立即数操作和控制类操作指令:12位指 令系统单片机为11条,14位指令系统单片机为 13条,16位指令系统单片机为17条。
入REG寄存器
寻址方式(续1)
– REG寄存器也可直接以地址形式出现,如: • ADDWF 0x22,1 ;W寄存器与地址为0x22的RAM单元相加
,结果送入0x22单元
– 3)寄存器间接寻址:实际要访问的操作数地址放在间 接地址寄存器FSR中(04h单元),通过间接寄存器 INDF(00h单元)进行间接寻址。 • 例: MOVLW 0xC2 ;寄存器地址0xC2送入W寄存器 • MOVWF FSR ;寄存器地址0xC2送入FS寄存器 • ADDWF INDF,1 ;W寄存器与0xC2单元内容相加,结果送
第4章 PIC系列单片机指令系统与 程序设计
1 2 3 4 5 PIC系列单片机指令系统分类及说明 指令功能 汇编语言程序的基本格式 汇编语言程序结构化设计 程序设计范例
§4.1 PIC系列单片机指令系统分类及说明
• 4.1.1 指令系统分类 • 4.1.2 指令描述符号说明 • 4.1.3 指令速查表
入0xC2单元 • 若执行指令前0xC2单元内容为0x20,则执行指令后W=0x78, 0xC2单元内容为0x98。
寻址方式(续2)
– 以P16F877为例,若将上述间接寻址方式改为直接寻址 方式,可以表示为: • MOVLW 0x78 • ADDWF 0xC2,1
PIC常用指令
GOTO LOOP ;否!循环回去
RETURN ;返回
9.位置1指令:BCF
【格式】 BCF F,B
【功能】位清0
【说明】
(1)BCF是Bit Clear F的缩写;
(2)符号B是表示片内某个8位数据寄存器F的位号(或位地址);
【实例】 INCF PORTC,1 ;将PORTC加1
2.寄存器减1指令:DECF
【格式】 DECF F,d
【功能】寄存器F减1
【说明】
(1)DECF是Decrement F的缩写;
(2)d=0时,结果存入W;d=1时,结果存入F。
【实例】 ENCODER EQU 0X21
(3)不影响状态位
【实例】 MOVLW 0x1E ;常数30送W
14.子程序调用指令:CALL
【格式】 CALL K
【功能】子程序调用
【说明】
(1)CALL是CALL subroutine的缩写;
(2)K为立即地址;
(3)不影响状态位。
【实例】
【实例】 MOVLW 0xOF ;送OFH到W
MOVWF PORTB ;W内容写入B口
NOP ;空操作
MOVF PORTB,W ;读操作
PIC汇编语言常用伪指令
1.符号名赋值伪指令:EQU
CALL DELAY ;PORTB的第0位是1则直接执行该句,调用延时子程序
13.常数传送指令:MOVLW
【格式】 MOVLW K
【功能】常数传送
【说明】(1)MOVLW是Move literal to W的缩写;
(2)将8位立即数传送到W寄存器,k表示常数、立即数和标号;
工学PIC单片机指令系统
2.4 常数和控制操作类指令
4.常数或指令
第52页/共106页
2.4 常数和控制操作类指令
5.常数异或指令
第53页/共106页
2.4 常数和控制操作类指令
6.看门狗计数器清零指令
第54页/共106页
2.4 常数和控制操作类指令
7.常数传送指令
第55页/共106页
2.4 常数和控制操作类指令
3.位测试,为零则跳指令
第47页/共106页
2.3 位操作指令
4.位测试,为1则跳指令
第48页/共106页
2.4 常数和控制操作类指令
1.常数加法指令
第49页/共106页
2.4 常数和控制操作类指令
2.常数减法指令
第50页/共106页
2.4 常数和控制操作类指令
3.常数与指令
第51页/共106页
第67页/共106页
2.5 汇编语言程序设计
2.5.1 汇编语言程序设计知识 2.PIC 汇编语言的程序流程图
③循环程序流程图 循环程序的结构包含以下4个组成部分: 循环初始化部分:为循环程序作准备。如循环变
量设置,即指定或定义一个循环变量作循环次数 计数器或地址指针,并给它设置一个初始值。
2.2 ~2.4指令集
第21页/共106页
2.2 ~2.4指令集
第22页/共106页
2.2 ~2.4指令集
第23页/共106页
2.2 ~2.4指令集
第24页/共106页
2.2 ~2.4指令集
第25页/共106页
2.2 ~2.4指令集
第26页/共106页
2.2 ~2.4指令集
第27页/共106页
2.1 指令系统概述
指令PIC的指令详解
指令PIC的指令详解伪指令#include p16f877a.inclist p=16f877a,r=dec__config__idlocs(用户利用它存放程序版本或日期等) __idlocs 0x1234errorlevel 0,-302,-305 (编译信息输出显示等级及对对某些信息的单独设定)#define/#undefine #define KEY1 PORTB,7equ w_temp equ 0x20cblock+endc: cblock 0x20 w_temp buffer:8 var1 endcorg 0x00dt(定义表格数据代替retlw)table addwf pcl,fdt 0dt 1,2,'3';retlw 1 ;retlw 2;retlw 0x33('3')dt "abc" ;retlw 'a' ;retlw 'b';retlw 'c'de(源程序中定义片内eeprom的初值其实地址0x2100) org 0x2100de 0,1,2,3de "ABCD";定义8个字节fill(填充程序空间) fill 0x0000,5fill (goto $),next_bloclk-$ (从当前填充至标号next)死循环end宏指令banksel、pagesel、bankisel、clrc、setc、clrz、setz、clrdc、setdc、skpc、skpnc、skpdc、skpndc、bc、bnc、bz、bnz、bdc、bndcmacro自定义宏1.ADD LITERAL TO WADDLW K (W)+K->W加立即数至W ADDLW 0X15W=0X10->0X252.ADD W TO FADDWF F,D ((W)+(F)->W/F)ADDWF REG1,0 ADDWF FSR,13.ADD W AND CARRY D TO F ADDWFC F,DADDWFC FSR,1 (W+FSR+C->FSR)4.AND LITERAL AND WANDLW KANDLW 0x5F((W)并0x5F->W)5.AND W WITH FANDWF F,DANDWF FSR 1 (W并FSR->W/F)6.BIT CLEAR FBCF F,BBCF FLAG_REG,7 将FLAG_REG的D7清0 7.BIT SET FBSF F,BBSF PROTA,0 PROTA的D0置18.BIT TEST,SKIP IF CLEARBTFSC F,BBTFSC FLAG,1 FALSE TRUE位测试 0跳转9.BIT TEST,SKIP IF SETBTFSS F,BBTFSS FLAG,1 FALSE TRUE位测试 1跳转10.BIT TOGGLE FBTG F,BBTG PROTC,4 位取反 PORTC=0111 0101->0110 010111.SUBROUTINE CALLCALL 调用子程序12.CLEAR FCLRF FLAG_REG (F清零置Z=1)13.CLEAR W REGISTERCLRW (W清零置Z=1)14.CLEAR WATCHDOG TIMERCLRWDT(监视定时器清零00h->WDT 0->WDT预定标器1->TO' 1->PD')/doc/945763018.html,PLEMENT FCOMF REG1,0(寄存器内容取反->W/F)/doc/945763018.html,PARE F WITH W,SHIP IF F=WCPFSEQ REG/doc/945763018.html,PARE F WITH W,SHIP IF F>WCPFSGT REG/doc/945763018.html,PARE F WITH W,SHIP IF F<wCPFSLT REG19.DECIMAL ADJUST W REGISTERDAW REG1,0 (对F中内容进行10进制调整->F/W+F)REG1=0XA5 C=0 DC=0->0X05 C=1 DC=020.DECREMENT FDECF CNT,1(寄存器内容减1->W/F)21.DECREMENT F,SHIP IF 0DECFSZ CNT,1GOTO ...CONTINUE ...(减1后为0跳转至CONTINUE)22.DECREMENT F,SHIO IF NOT 0DECFSNZ CNT,0GOTO ...CONTINUE ...(减1后不为0跳转至CONTINUE)23.UNCONDITIONAL BRANCHGOTO 地址24.INCREMENT FINCF CNT,1(指令加1)CNT=0XFF Z=0 ->CNT=0X00 Z=1 C=125.INCREMENT F,SHIP IF 0INCFSZ F,D26.INCREMENT F,SHIP IF NOT 0INCFSNZ F,D27.INCLUSIVE OR LITERAL WITH WIORLW 0X35((W)或0X35->W)28.INCLUSIVE OR W WITH FIORWF RESULT,1 ((W)或RESULT->RESULT)29.LONG CALL 长调用指令和CALL有区别MOVLW HIGH 高位地址MOVPF WREG,PCLATH 存放在PCLATH中LCALL LOW 调用子程序(指令只含低8位地址)30.MOVE FMOVF REG,0 ((REG)->W)</w31.MOVE F TO PMOVFP F,P (F:00H-FFH P:00H-1FH)MOVFP REG1,REG2把数据存储单元传至某外围接口寄存器内容32.MOVE LITERAL TO LOW NIBBLE IN BSRMOVLB 0XA5 BSR=0X22->0X25(传立即数至BSR寄存器低4位高4位为0)33.MOVE LITERAL TO HIGH NIBBLE IN BSRMOVLR 5 BSR=0X22->0X52 (传至高4位低4位为0)34.MOVE LITERAL TO WMOVLW 0X5A W=0X5A (立即数传至W)35.MOVE P TO FMOVPF REG1,REG2 (F:00H-FFH P:00H-1FH)把某外围接口寄存器内容传至数据存储单元36.MOVE W TO FMOVWF REG ((W)->REG)37.NEGATE WNEGW REG 0 (REG取反->F/F+W)取反的规则P25138.NO OPERATIONNOP无操作占用一个指令周期 PC+139.LOAD OPTION REGISTER(W)->OPTION 只为可移植至PIC16C6X 不建议使用40.RETURN FROM INTERRUPTRETFIETOS->PC 1->GIE (中断允许位GIE开放中断)指令周期241.RETURN LITERAL TO WRETLW KK->W TOS->PC(立即数传至W 并返回地址至PC)指令周期2CALL TABLETABLE ADDWF PCRETLW K1RETLW K2...RETLW KN->W=0X07->W=K742.RETURN FROM SUBROUTINERETURN (TOS->PC 指令周期2)43.ROTATE LEFT F THROUGH CARRYRLF F,D/RLCF F,DF(N)->D(N+1) F(7)->C C->D(0)RLF REG1,0REG1=1110 0110->1110 0110 C=0->1 W=1100 110044.ROTATE LEFT F NO CARRYRLNCF F,D无进位循环左移45.ROTATE RIGHT F THROUGH CARRYRRF F,D/RRCF F,DRRF REG1,0REG1=1110 0110->1110 0110 C=1->0 W=0111 001146.ROTATE RIGHT F NO CARRYRRNCF F,D无进位循环右移47.SET FSETF F,SSETF REG,0WREG=0X05->0XFF REG=0XDA->0XFF48.SLEEPOOH->WDT 0->WDT预分频器 1->TO'(定时时间) 0->PD'掉电状态49.SUBTRACT W FROM LITERALSUBLW KK-(W)->WMOVLW 01HSUBLW 02H W=01H C=1结果为正MOVLW 02HSUBLW 02H W=0 C=1结果为0MOVLW 02HSUBLW 01H W=FF C=0结果为负50.SUBTRACT W FROM FSUBWF F,DMOVLW 3MOVWF REG1MOVLW 2SUBWF REG1,0 W=1 C=1MOVLW 2MOVWF REG1MOVLW 2SUBWF REG1,0 W=0 C=1MOVLW 2MOVWF REG1MOVLW 3SUBWF REG1,0 W=FF C=051.SUBTRACT W FROM F WITH BORROW SUBWFB F,D(F)-(W)-C->F/W带借位F-W减法MOVLW 4MOVWF REG1MOVWF REG1MOVLW 2SUBWFB REG1,0 设C初始为1 则W=1 C=152.SWAP FSWAPF F,DSWAPF REG1,1REG1=0XA5->0XA5 W=0X5A REG1=0X5A53.TABLE READTABLRD T,I,FTABLRD 1,1,REGREG=OX53->0XAA TBLATH=0XAA->0X12 TBLATL=0X55->0X34 TBLPTR=0XA356->0XA3567 存储单元=0X1234->0X5678传高字节TBLAT中一个字节传至F T=0传高字节T=1传低字节;TBLPTR 指向的程序存储单元内容传至表锁存器TBLAT;I=1 TBLPTR+1 I=0 TBLPTR不变存储单元的值为何改变周期2 若F=PC则3周期54.TABLE WRITETABWT T,I,FTABWT 0,1,REGREG=0X53->0X53 TBLATH=0XAA->0X53 TBLATL=0X55->0X55TBLPTR=0XA356->0XA357存储单元=0XFFFF->0X5355F值传至16为TBLAT表锁存器 T=0传低字节 T=1传至高字节;TBLAT内容写入TBLPTR指向的程序存储器单元;I=1 TBLPTR+1 I=0 TBLPTR不变指令周期2若F=PC 这周期355.TABLE LATCH READTLRD T,F 表锁存读TBLATH=0X00 TBLATL=0XAF T=0 RAM=0XAF TBLATH=0X00 TBLATL=0XAF56.TABLE LATCH WRITETLWT T,F 表锁存写RAM=0XB7 TBLATH=0X00 TBLATL=0X00 T=0 RAM=0XB7 TBLATH=0X00 TBLATL=0XB757.LOAD TRIS REGISTER I/O 控制寄存器TRIS设置指令不建议使用58.TEST F,SKIP IF 0TSTFSZ CNT F等于0跳转GOTO ...(CNT!=0)ZERO (CNT==0)59.EXCLUSIVE OR LITERAL WITH WXORLW K (W)异或K->WXORLW 0XAFW=0XB5->0X1A60.EXCLUSIVE OR W WITH FXORWF F D (W)异或(F)->(W)(F)XORWF REG1,1W=0XB5->0XB5 REG1=0XAF->0X1A直观助记符:BCF 3,0(进位位C清零)=CLRCBSF 3,0(进位位C置1)=SETCCLRDC BCF 3,1SETDC BSF 3,1CLRZ BCF 3,2SETZ BSF 3,2SKPC(有进位间跳)=BTFSS 3,0SKPNC(无进位间跳)=BTFSC 3,0SKPDC BTFSS 3,1SKPNDC BTFSC 3,1SKPZ BTFSS 3,2SKPNZ BTFSC 3,2 影响ZTSTF F(测试寄存器是否全零)=MOVF F,1 影响ZMOVFW F((F)->W) MOVF F,0 影响ZNEGF F,D取补码 COMF F,1 影响ZADDCF F,D内容加进位 BTFSC 3,0 影响Z 为0跳转INCF F,DSUBCF F,D内容减进位 BTFSC 3,0DECF F,DADDDCF F,D BTFSC 3,1INCF F,DSUBDCF F,D BTFSC 3,1DECF F,DB K 无条件转移 GOTO KBC K 有进位转移 BTFSC 3,0GOTO KBNC K 无进位转移 BTFSS 3,0GOTO KBDC K BTFSC 3,1GOTO KBNDC K BTFSS 3,1GOTO KBZ K BTFSC 3,2GOTO KBNZ K BTFSS 3,2GOTO K清零CLRW CLRF CLRWDT算术运算ADDLW K ADDWF F,D SUBLW K SUBWF F,D DECFF,D INCF F,D逻辑运算ANDLW K ANDWF F,D IORLW K或IORWF F,D XORLW K异或 XORWF F,D RLF F,D RRF F,DMOVLW K MOVF F,D MOVWF F NOP半字节交换指令SWAPF F,D可用于中断现场保护:MOVF W-TEMP SWAPF STATUS,W MOVWF S-TEMP-->SWAPF S-TEMP,W SWAPF STATUS,W SWAPF W-TEMP,W(W置于后一操作数?)子程序调用CALL GOTO跳转(CALL都是无返回值的?CALL的子程序都是无参数?)取反COMF F,DDECFSZ F,D INCFSZ F,D位操作BSF F,B BCF F,B BTFSS F,B BTFSC F,B返回RETLW K RETURN SLEEP RETFIE(RETURN FROM INTERRUPT WITH ENABLE)懒得算延时:3XY+4X+5(x外循环Y内循环)255-->19610020mhz 0.05us T=0.2us1、程序的基本格式先介绍二条伪指令:EQU ——标号赋值伪指令ORG ——地址定义伪指令PIC16C5X在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为:PIC16C54/55:1FFHPIC16C56:3FFHPIC16C57/58:7FFH一般来说,PIC的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。
pic单片机汇编语言程序设计实例
PIC单片机汇编语言程序设计实例介绍在计算机科学领域中,汇编语言是一种低级语言,用于编写机器指令的文本形式。
汇编语言程序设计是一门重要的技能,特别是在嵌入式系统开发中。
PIC (Peripheral Interface Controller)单片机是一种常见的微控制器,广泛应用于各种电子设备中。
本文将介绍PIC单片机汇编语言程序设计的实例,旨在帮助读者更好地理解和应用汇编语言编程。
PIC单片机简介PIC单片机是由美国微芯科技公司(Microchip Technology Inc.)设计和生产的一种微控制器。
它具有高性能、低功耗和丰富的外设接口,适用于各种应用领域,如家电、汽车电子、医疗设备等。
PIC单片机的指令集是基于汇编语言的,因此掌握汇编语言编程对于理解和应用PIC单片机至关重要。
PIC单片机汇编语言基础在开始编写PIC单片机汇编语言程序之前,我们首先需要了解一些基本概念和语法。
以下是一些常用的指令和语法:1. 数据寄存器PIC单片机有多个数据寄存器,用于存储数据和中间结果。
例如,W寄存器是一个通用寄存器,用于存储临时数据。
另外,还有一些特定功能的寄存器,如PORTA寄存器用于控制输入输出。
2. 指令集PIC单片机的指令集包含了各种操作指令,如算术运算、逻辑运算、位操作等。
每个指令都有特定的操作码和操作数,用于执行相应的操作。
3. 标志寄存器PIC单片机的标志寄存器用于存储一些状态信息,如进位标志、零标志等。
这些标志位可以用于条件分支和循环控制。
4. 中断PIC单片机支持中断机制,可以在特定条件下中断当前程序的执行,执行中断服务程序。
中断可以提高系统的响应速度和实时性。
PIC单片机汇编语言程序设计实例下面将通过几个实例来演示PIC单片机汇编语言程序的设计和实现。
实例1:LED闪烁步骤:1.初始化端口为输出模式。
2.设置LED引脚为高电平,使LED熄灭。
3.延时一段时间。
4.设置LED引脚为低电平,使LED亮起。
PIC指令集
PIC指令集NOP 空操作指令执行时间:1个指令周期执行过程:除了消耗单片机一个指令周期外,没有任何其他影响。
说明:NOP指令归属于字节操作是个特例,因为该指令的执行没有任何操作数参与,其结果也不影响任何其他寄存器。
一般用于指令运行过程中的延时。
MOVWF 把W寄存器的内容传送至数据寄存器中语法形式:MOVWF f操作数:f为数据寄存器的低7位地址(0x00~0x7f)执行时间:1个指令周期执行过程:把W寄存器的内容传送至数据寄存器中,W寄存器的内容保持不变说明:该指令是用于对数据寄存器赋值的最主要方式MOVF 把数据寄存器的内容传送至目的寄存器语法形式:MOVF f, d操作数: f为数据寄存器的低7位地址(0x00~0x7f)d=w,把数据寄存器的内容传送至W寄存器d=f,把数据寄存器内容放回自己本身,目的在于判断数据寄存器的内容是否为0执行时间:1个指令周期执行过程:[f] d说明:该指令可以通过W寄存器把数据寄存器的内容传送至它处,或对数据寄存器做判0操作。
如果传送的数据为0,则置位Z标志。
CLRW W寄存器的内容清0语法形式:CLRW执行时间:1个周期执行过程:0x00 W 1 Z状态标志影响:Z说明:该指令对W寄存器清0,同时置位0标志Z另外有一条指令movlw 0x00 也可以使W寄存器清0,但不影响任何状态标志。
指令范例:CLRWCLRF 数据寄存器的内容清0语法形式:CLRF f操作数:f为数据寄存器的低7位地址(0x00~0x7f)指令编码:00 0001 1fff ffff执行时间:1个指令周期执行过程:0x00 f1 Z状态标志影响:Z说明:该指令对数据寄存器清0,同时置位0 标志Z指令范例:CLRF TRISBSUBWF 数据寄存器的内容和W寄存器相减语法形式:SUBWF f,d操作数:f为数据寄存器的低7位地址(0x00~0x7f)d=f, 结果放在数据寄存器内,W的内容不变d=w,结果放在W寄存器内,数据寄存器的内容不变指令编码:00 0010 dfff ffff执行时间:1个指令周期执行过程:[f]-[W] d状态标志影响:Z DC C说明:必须特别注意W寄存器在这条减法指令里是减数如果f=W,相减的的结果为零,则Z=1如果f>W,没有借位发生,则C=1如果f<W ,有借位发生,则C=0实际上在PIC单片机内部这条减法指令的执行是先对W寄存器求补码,然后与被减数相加,所以判别是否有借位标志时和其他常见的单片机正好相反,编写程序时要千万小心指令范例:MOVLW 0x23 ;W=0x23MOVWF tmp ;tmp=0x23MOVLW 0x32 ;W=0x32SUBWF tmp,W;W=tmp – W=0xf1,tmp=0x23;tmp< W,所以C=0ADDWF 数据寄存器的内容和W寄存器相加语法形式:ADDWF f,d操作数:f为数据寄存器的低7位地址(0x00~0x7f)d=f, 结果放在数据寄存器内,W的内容不变d=w,结果放在W寄存器内,数据寄存器的内容不变指令编码:00 0111 dfff ffff执行时间:1个指令周期执行过程:[f]+[W] d状态标志影响:Z DC C说明:数据寄存器的内容和W寄存器相加,结果按照d指定的目的地存放指令范例:MOVLW 0x55 ;W=0x55,假定Sum=0xaaADDWF Sum,f ;W不变,Sum=0xffIORWF 数据寄存器的内容和W寄存器做逻辑或操作语法形式:IORWF f,d操作数:f为数据寄存器的低7位地址(0x00~0x7f)d=f, 结果放在数据寄存器内,W的内容不变d=w,结果放在W寄存器内,数据寄存器的内容不变指令编码:00 0100 dfff ffff执行过程:[f] | [W] d状态标志影响:Z说明:数据寄存器的内容和W寄存器相或,结果按照d指定的目的地存放。
PIC指令介绍
PIC指令介绍PIC的指令系统PIC 8位单片机共有三个级别,有相对应的指令集。
基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PI C系列芯片共有指令58条,每条指令是16位字长。
其指令向下兼容。
一、PIC汇编语言指令格式PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:标号操作码助记符操作数1,操作数2;注释指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1、标号与MCS-51系列单片机功能相同,标号代表指令的符号地址。
在程序汇编时,已赋以指令存储器地址的具体数值。
汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。
标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。
在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。
指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。
再有标号不能用操作码助记符和寄存器的代号表示。
标号也可以单独占一行。
2、操作码助记符该字段是指令的必选项。
该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3、操作数由操作数的数据值或以符号表示的数据或地址值组成。
若操作数有两个,则两个操作数之间用逗号(,)分开。
当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。
还可以是被定义过的标号、字符串和ASCⅡ码等。
具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中,当d=1时,该项常被略去。
8 寄存器内容加1,结果为零间跳指令
指令格式:INCFSZ f,d
说明:INCFSZ是英语Increment f,Skip of 0的缩写。该条指令与上一条(7)指令差别仅在于“1”上,即执行这条指令时,寄存器f内容加
中断服务程序
…
SWAPF STATUS_TEMP,W;交换STATUS_TEMP与W
=0BH=D11
4 寄存器f传送指令
指令格式:MOVF f,d
说明:MOVF是Move f的缩写。F代表PIC中的某个寄存器。指令中的d规定:d=0时,f内容送W;d=1时,f内容送寄存器。
实例:MOVF 6,0 ;RB口内容送W
MOVWF 8 ;RB口内容送f8
说明:MOVLW是Move Literal to w的缩写
实例:MOVL 0x1E;常数30送W
2 I/O口控制寄存器TRIS设置指令
指令格式;TRIS f
说明;TRIS f是Load TRIS Register的缩写。其功能是把工作寄存器W的内容送入I/O口控制寄存器f。当W=0时,置对应I/O口为输出;W=1
不再处理。值得注意:在用到子程序时应说明程序的入口条件、出口条件以及该程序应完成的功能和作用。
二、清零指令(共4条)
1 寄存器清零指令
实例:CLRW;寄存器W被清零
说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。
MOVWF W_TEMP ;将W内容存入到临时寄存器
W_TEMP中
SWAPF STATUS,W ;交换STATUS与W内容
MOVWF STATUS_TEMP ;将STATUS的内容存入到临
… 时寄存器STATUS_TEMP中
实例:BCF REG1,2;把寄存器REG1的D2位清零
说明:BCF是英语Bit Cleb是表示PIC片内某个8位数据寄存器F的位号(或位地址),所以b的
取值为0~7或D0~D7。实例中REG是Register的缩写。实例中的2代表指令格式中的b=2即寄存器REG1的D2位。
说明:在PIC系列8位单片机中,常用符号F(或f)代表片内的各种寄程器和F的序号地址。F取值按PIC系列不同型号而不同,一般为Ox00~
Ox1F/7F/FF。TMRO代表定时器/计数器TMRO,所以CLRF对寄程器清零,采用了直接寻址方式直接给出要访问的寄存器TMRO。
4 位清零指令。指令格式 BCF f,b
程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。再有标号不
能用操作码助记符和寄存器的代号表示。标号也可以单独占一行。
2 操作码助记符 该字段是指令的必选项。该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作
系,其寻址方式和指令都既少而又简单。其寻址方式根据操作数来源的不同,可分为立即数寻址、直接寻址、寄存器间接寻址和位寻址四种。
所以PIC系列单片机指令中的操作数常常出现有关寄存器符号。有关的寻址实例,均可在本文的后面找到。
4 注释 用来对程序作些说明,便于人们阅读程序。注释开始之前用分号(;)与其它部分相隔。当汇编程序检测到分号时,其后面的字符
(5) GOTO LOOP ;
(6) DECTSZ CPUNT2 ;计数2减1计数器2减1
结果不为零,跳转循环重
复执行第4条指令
(7) GOTO LOOP ;
(8) RETLW 0 ;子程序执行结束返回
1 标号 与MCS-51系列单片机功能相同,标号代表指令的符号地址。在程序汇编时,已赋以指令存储器地址的具体数值。汇编语言中采用符号
地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。在
无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。指令助记符不能占用标号的位置,否则该助记符会被汇编
2 看门狗定时器清零指令。
实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)
说明:WDT是英语Watchdog Timer的缩写字母。CLR见上述说明。注意该两条指令无操作数。
3 寄存器f清零指令。指令格式:CLRF f
实例:CLRF TMRO;对TMRO清零
说明:第一条指令中的6代表寄存器f=6,查寄存器表f=6为RB口;0代表d=0,代表选择的目标为寄存器W。第二条指令中的8代表寄存器f=8
。所以两条指令结果是把RB口的内容送f8。至于f8内容是多少?还应在汇编语言开始时附加指令,这里从略。
5 空操作指令
指令格式:NOP
说明:NOP是英语No Operation的缩写。NOP无操作数,所以称为空操作。执行NOP指令只使程序计数器PC加1,所以占用一个机器周期。
了空操作指令NOP。
6 无条件跳转指令
指令格式:GOTO k
说明:执行该条指令时,将指令转移到指定的地址(跳转)。指令中的k,常与程序中的标号联系起来。
实例:见第9条指令中
7 寄存器内容减1,结果为零的间跳指令
指令格式:DECFSZ f,d
说明:DECFSZ是英语Decrement f,Skip of not 0的缩写。符号f,d代表的意义,前述已作说明。该条指令是指寄存器的内容减1存入W
实例:MOVLW 0xOF ;送OFH到W
MOVWF PORT_B ;W内容写入B口
NOP ;空操作
MOVF PORT_B,W ;读操作
说明:该三条指令是一种对I/O口的B口连续操作的实例,其目的达到写入B口的内容要读出时,应保证写、读之间有个稳定时间,因此加入
PIC 8位单片机共有三个级别,有相对应的指令集。基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,
每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。其指令向下兼容。
在这里笔者介绍PIC 8位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。
10 寄程器半字节交换指令
指令格式:SWAPF f,d
说明:SWAPF是Swap f的合写。符号f、d的意义与前述的相同。该条指令的功能是寄存器f的高4位与低4位交换,即指令执行前,若寄存器f
的8位状态为D7、D6、D5、D4、D3、D2、D1、D0,执行后的8位状态变为D3、D2、D1、D0、D7、D6、D5、D4,其结果存入W(d=0)或f(d=1)中。
实例:中断现场保护是中断技术中重要部分。由于PIC16C××指令系统中没有进栈PUSH和出栈POP指令,所以只能用其它指令来实现。因为
在主程序中常常用到工作寄存器W和状态寄存器STATUS,所以中断现场保护常要保护寄存器W和STATUS。
下面是对PIC16C7×系列芯片中断现场保护的实例程序。
(1)BELY MOVLW 0xC5 ;送延时常数0C5H入W
(2) MOVWF COUNT2;0C5H送入计数器2
(3) CLRF COUNT1;对计数器1清零
(4)LOOP INCFSZ COUNT1;计数器1加1计数器1加
1结果不为零,跳转循环
说明:程序中的注释已分别对每条指令的功能作了说明,补充说明1 当执行第(4)条加1指令结果为零时,就间跳转到执行第(6)条指令。2
当执行第(6)条减1指令结果为零时,就间跳转到第(8)条子程序返回,整个延时指令才算完成。3 计数器1或2代表PIC中某个寄存器,该寄存器
由程序开始的伪指令赋值决定(关于伪指令今后将作专门介绍)。
本文关于指令的注释将与前述指令中的略有不同。前述指令注释时是对指令具体完成的功能给以说明,这种注释方法对初学者确实易于接受和
理解,但是实际应用中的PIC产品汇编语言的注释通常是以程序要做什么(或指令的作用)而不是说指令的直接功能。鉴于上述原因,下述的指令
注释将改变过去的注释方法,用程序应起的作用作注释。
通过上述四条清零指令格式和实例,可以说明,学习PIC系列8位单片机的指令时应首先了解指令的助记符意义(功能),再有就是它的表达
方式。初学者没有必要死记指令,重要是理解和实践。
三、面向字节、常数与控制操作的指令
1 传送立即数至工作寄存器W指令
指令格式:MOVLW k;k表示常数、立即数和标号
,置I/O口为输入。
实例:MOVLW 0x00 ;把00H送入W
TRIS RA ;置PIC RA口为输出
MOVLW 0xFF ;把FFH送入W
TRIS RB ;置PIC RB口为输入
说明:这是PIC汇编语言中常用的几条指令,即设置某个I/O口(这里是RA口和RB口)为输入或输出的语句。可见,识读指令时,一应充分理
码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3 操作数 由操作数的数据值或以符号表示的数据或地址值组成。若操作数有两个,则两个操作数之间用逗号(,)分开。当操作数是常数
时,常数可以是二进制、八进制、十进制或十六进制数。还可以是被定义过的标号、字符串和ASCⅡ码等。具体表示时,规定在二进制数前冠以
一、PIC汇编语言指令格式
PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下: