历史上的今天
今天是:2024年11月26日(星期二)
2019年11月26日 | PIC单片机汇编语言学习(一)
2019-11-26 来源:eefocus
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_BIG
101
102 Y_BIG MOVF Y,0 ;将Y中的数据送入W
103 MOVWF Z ;再将它转存到Z
104 GOTO THEEND ;跳过下面两条到末尾
105
106 X_BIG MOVF X,0 ;将X中的数据送入W
107 MOVWF Z ;再将它转存到Z
108 THEEND RETURN ;子程序返回
史海拾趣
|
大家遇到过"Target failed to repond"这样的问题没? 请问大家遇到过这样的问题没? 就是单片机(C8051f系列)程序与硬件connect后,然后download code出现这样的提示问题: Target failed to repond. Systerm is being disconnected. 恳请各位给予解答!不知道问题出在哪里了!… 查看全部问答> |
|
请问一下: 我的开发环境是AVR STUDIO,现在可以读到mega128的签名(read signature),\"fuse\"下点击program按钮也没问题,也能正常写入;但是烧写flash时就失败,不知道是什么原因? 我用的是JTAG下载方式,使用外部16M晶振. 请帮我分析一下原因 ...… 查看全部问答> |
|
各位大虾 我.NET2005下开发WinCE程序(VB.net),现在需要把按钮上的字符靠左显示,在Windows下的按钮有设置靠左的属性,但是在WinCE下没有这个属性,请问该怎么做??… 查看全部问答> |
|
跟成都的戴先生认识,还得感谢QQ,通过djyos。 戴:你现在djyos发展得怎么样了? 我:正在努力. 就这样开始我我们的对话,通过QQ聊天,我知道戴先生是一个有10几年敬业的嵌入式业者,由于 ...… 查看全部问答> |
|
在TI StellarisWare中关于以太网的例程中,我们几乎都可以看到这个locator的身影。它的作用是什么呢?它其实就是结合tools文件夹下的finder来发现开发板的IP地址和MAC地址以及开发板的名称等等。 并不是所有的 ...… 查看全部问答> |
|
我用lpc1114 定时器32 计数,想随时读取当前计数值,各位大大,是读取哪个寄存器看吧!我试了都不行啊,不是读TC么? 各位大大,路过好心告诉一声,我不用中断的,就想在随便一个IO口边沿有动作时,读取当中的间隔时间… 查看全部问答> |




