chenbin_ntpcb的个人主页

http://bbs.ntpcb.com/u.php?uid=68592  [收藏] [复制]

chenbin_ntpcb

  • 2

    关注

  • 6

    粉丝

  • 7

    访客

  • 等级:二级逆天
  • 身份:PADS20200316初级班
  • 总积分:655
  • 男,1986-04-01

最后登录:2021-11-12

更多资料

日志

pic单片机

2018-06-14 21:32

1、汇编语言的语句格式:
标号 操作码(指令助记符) 操作数 ;注释
(label)    (opcode)    (operand)    (comment)
2、常用伪指令

a.EQU——符号名赋值伪指令
格式:符号名    EQU    nn
b.ORG——程序起始地址定义伪指令
格式:ORG    nnnn
c.END——程序结束伪指令
格式:END
d.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默认值为1


4、指令集


5、例子

  1 ;--------------------------------------------------------  2  3 ;顺序程序结构  4 ;将20H单元低4位取出存入21H,高四位取出存入22H  5 ;要点:ANDLW和SWAPF  6  7 ;---------------------------------------------------------  8     MOVF    20H,0    ;将20H单元的内容送人W  9     ANDLW    0FH        ;W高四位清零低4位保持不变 10     MOVWF    21H        ;将拆分后的低4位送21H 11     SWAPF    20H,0    ;将20H单元内容高、低半字节换位后送W 12 13     ANDLW    0FH        ;再将W高四位清0低四位保持不变 14     MOVWF    22H        ;将拆分后的高四位送22H单元 15 16 17 ;-------------------------------------------------------- 18 19 ;分支程序结构 20 ;RAM中20H和21H单元存放2个数,找出大着存入22H单元 21 ;要点:两数做减法,判断标志位C的值 22 23 ;--------------------------------------------------------- 24 STATUS    EQU    03H    ;定义STATUS寄存器地址为03H 25 C        EQU    0    ;定义进位/借位标志C在STATUS中得地址为0 26         MOVF    20H 0    ;将20H单元的内容送人W 27         SUBWF    21H 0    ;用21H单元的内容减去W中的内容,结果存在W中 28         BTFSS    STATUS,C;若C=1,没借位,则21H单元中的数大,跳到F21BIG 29         GOTO    F20BIG    ;若C=0,有借位,20H单元中得数较大,则跳至F20BIG 30 31 F21BIG    MOVF    21H,0    ;将21H中的内容存入W寄存器 32         MOVWF     22H        ;再将它转存到22H单元 33         GOTO    STOP    ;跳过下面两条指令到程序末尾 34 35 F20BIG    MOVF    20H,0    ;将20H中的内容存入W寄存器 36         MOVWF     22H        ;再将它转存到22H单元 37 38 STOP    GOTO    STOP    ;任务完成,停机,原地踏步 39 40 41 ;-------------------------------------------------------- 42 43 ;循环程序结构 44 ;数据存储器中,从地址30H开始的50个单元全部写入00H 45 ;要点:间接寻址寄存器FSR当做地址指针 46 47 ;--------------------------------------------------------- 48 COUNT    EQU        20H        ;指定20H单元作为循坏次数计数器(即循环变量) 49 FSR        EQU     04H        ;定义FSR寄存器地址为04H 50 INDF    EQU        00H        ;设定INDF寄存器地址为00H 51         MOVLW    D50        ;把计数器初值50送入W 52         MOVWF    COUNT    ;再把50转入计数器(作为循环变量的操作值) 53         MOVLW    30H        ;把30H(起始地址)送入W 54         MOVWF    FSR     ;再把30H转入寄存器FSR(用作地址指针) 55 56 NEXT    CLRF    INDF    ;把以FSR内容为地址所指定的单元清0 57         INCF    FSR,1    ;地址指针内容加1,指向下一单元 58         DECFSZ    COUNT,1    ;计数值减1,结果为0就跳过到下一条指令到STOP处 59         GOTO    NEXT    ;跳转回去并执行下一次循环 60 STOP    GOTO    STOP     ;循环结束之后执行该语句,实现停机 61 62 ;-------------------------------------------------------- 63 64 ;子程序结构 65 ;3个数最大者放入40H单元 66 67 ;--------------------------------------------------------- 68 STATUS    EQU        03H 69 C        EQU        00H 70 X        EQU        20H 71 Y        EQU        21H 72 Z        EQU        22H 73 ;-------------------------------------------------------- 74 75 ;主程序 76 77 ;--------------------------------------------------------- 78 79 MAIN    MOVF    30H,0 80         MOVWF    X 81         MOVF    21H,0 82         MOVWF    Y 83         CALL    SUB 84         MOVF    Z,0 85         MOVWF    X 86         MOVF    32H,0 87         MOVWF    Y 88         CALL SUB 89         MOVF    Z,0 90         MOVWF    40H 91 STOP    GOTO    STOP 92 ;-------------------------------------------------------- 93 94 ;子程序:(入口参数:X和Y,出口参数:Z) 95 96 ;--------------------------------------------------------- 97 SUB        MOVF    X,0        ;将X内容送人W 98         SUBWF    Y,0        ;Y内容减去W内容,结果存入W 99         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            ;子程序返回
分类:默认分类|回复:1|浏览:557|全站可见|转载
 

Powered by phpwind v8.7.1 Certificate Copyright Time now is:03-19 18:35
©2003-2011 逆天PCB论坛 版权所有 Gzip disabled 粤ICP备14042835号 问题咨询 | 广告业务点这里