打印
[MCU]

MSP430

[复制链接]
楼主: gaoke231
手机看帖
扫描二维码
随时随地手机跟帖
21
gaoke231|  楼主 | 2019-11-30 22:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
间接寻址模式
汇编源程序
MOV @ R10 , 2 (R11)
这种寻址模式将地址放在寄存器中,即寄存器中数据为所寻址数据的地址,而寄存器中
的数据不改变。这种模式只对源操作数有效,对于目的操作数只能用变址寻址模式 0(Rd)
替代。以下指令都是间接寻址模式:
MOV @R5 ,R6
MOV @R5, 2(R6)
ADD @R5 ,&220H
MOV @R5, &AAA
SUB.B @R6 ,4 (R7)

使用特权

评论回复
22
gaoke231|  楼主 | 2019-11-30 22:54 | 只看该作者
间接增量寻址模式
汇编源程序
MOV @ R10 + , 0 ( R 11 )
这种寻址模式将地址放在寄存器中,即寄存器中数据为所寻址数据的地址,而源寄存器
中的数据增加 1(字节操作)或 2(字操作)。这种模式只对源操作数有效,对于目的操作数
只能用变址寻址模式 0(Rd),同时 INC / INCD Rd(手动改变目的操作数指针)替代。以
下指令都是间接寻址模式:
MOV @R5 +,R6
MOV @R5+, 2(R6)
ADD @R5 +,&220H
MOV @R5+, &AAA
SUB.B @R6 +,4 (R7)

使用特权

评论回复
23
gaoke231|  楼主 | 2019-11-30 22:54 | 只看该作者
立即寻址模式
汇编源程序
MOV #2345H , TONI
这种寻址模式的操作数能够立即得到,在指令代码中紧跟操作码后。下面列举的指令都
使用了立即寻址模式:
MOV #1234H , R6
MOV #1234H , 2(R6)
ADD #1234H ,&220H
MOV #1234H , AAA
SUB.B #12H ,&220H

使用特权

评论回复
24
gaoke231|  楼主 | 2019-11-30 22:55 | 只看该作者
汇编伪指令
在进行汇编程序设计时,它们是程序的主体。但是还有一些伪指令,它们提供程序数据并控制汇编过程,也是必不可少的。一般地汇编器伪
指令能帮助用户完成以下的事情:
将代码与数据汇编到规定的段中;
在存储器中用未初始化的变量保留空间;
控制汇编后列表文件的格式;
初始化存储器;
汇编条件块;
定义全局变量;
规定汇编器可以从中获得宏的库;
产生符号化的调试信息。
常用的汇编伪指令有以下一些:
模块控制伪指令:NAME、MODULE、ENDMOD 等;
段控制伪指令: ASEG 、 RSEG 、 STACK、 COMMON、 ORG、 ALIGN、 EVEN 等;

使用特权

评论回复
25
gaoke231|  楼主 | 2019-11-30 22:56 | 只看该作者
模块控制伪指令
模块控制伪指令标志一个源程序模块的开始与结束,并给模块命名与指示其类型。使用
的助记符为:NAME、MODULE、ENDMOD、END 等。
其中 NAME (PROGRAM)标志一个程序模块的开始;
MODULE (LIBRARY)表示一个库模块的开始;
ENDMOD 表示当前汇编模块的结束;
END 表示一个汇编文件的最后模块的结束。
使用格式如下:
NAME symbol [(expr)]
MODULE symbol [(expr)]
ENDMOD [label]
END [label]

使用特权

评论回复
26
gaoke231|  楼主 | 2019-11-30 23:11 | 只看该作者
段控制伪指令
段控制伪指令说明了代码与数据是怎样生成的。使用如下一些助记符:
ASEG 一个绝对段的开始;
RSEG 一个可重定位段(相对段)的开始;
STACK 定义堆栈段;
COMMON 定义公共段;
ORG 设置特定的定位指针;
ALIGN 通过插入一些填充字节用以校准程序计数器;
EVEN 通过插入一些填充字节使程序计数器对准偶地址;
使用语法如下:
ASEG [start [(align)]]
RSEG segment [:type] [(align)]
STACK segment [:type] [(align)]
COMMON segment [:type] [(align)]
ORG expr
ALIGN align [,code]
EVEN

使用特权

评论回复
27
gaoke231|  楼主 | 2019-11-30 23:12 | 只看该作者
MSP430 C 编译器支持的数据类型见下表

使用特权

评论回复
28
gaoke231|  楼主 | 2019-11-30 23:13 | 只看该作者
sfrw 用于定义地址范围为 0x100 to 0x1FF 的片内外围模块的功能寄存器。看门狗控制寄
存器的地址为 120H,则:
sfrw WDTCTL = 0x120;
void func(void)
{
WDTCTL = 0x5A08;
}

使用特权

评论回复
29
gaoke231|  楼主 | 2019-11-30 23:13 | 只看该作者
sfrb 用于定义地址范围为 0x00 to 0xFF 的片内外围模块的功能寄存器以及特殊功能寄存
器。P1 口的输出寄存器的地址为 11H,输入寄存器为 10H,则:
sfrb P0OUT = 0x11;
sfrb P0IN = 0x10;
void func()
{
P0OUT = 4; /* P0.2=1 */
P0OUT |= 4;
P0OUT &= ~8
if (P0IN & 2) printf("ON");
}

使用特权

评论回复
30
gaoke231|  楼主 | 2019-11-30 23:14 | 只看该作者
MSP430 的 C 语言指针类型分为代码指针与数据指针。 都占两个字节长度, 都能指向 0000H
到 0FFFFH 范围的内存单元。
浮点数为标准的 IEEE 浮点数格式,占 4 字节:


所表示的数值为:
(-1) S * 2(EXPONENT-127 ) * 1. MANTISSA

使用特权

评论回复
31
gaoke231|  楼主 | 2019-11-30 23:14 | 只看该作者
表达式语句(结构)
C 语言是一种结构化的程序设计语言。程序的最基本元素是表达式语句。所有的语句由“;”
隔开,或者说每一条语句后面都有一个“;”。比如下面的一些语句:
X=a+b;
Z=(x+y)-1; I++;
……
除了一些运算类的表达式语句外,C 语言还提供了十分丰富的程序控制语句。程序控制语
句对于实现特定的算法显得相当重要。下面讲述常用的程序控制语句。

使用特权

评论回复
32
gaoke231|  楼主 | 2019-11-30 23:18 | 只看该作者
条件语句
条件语句又叫做分支语句,使用关键词 if 构成,表达条件选择的含义:如果怎样…,就
怎样…,或否则就怎样…。语句表达形式有 3 种(a、b、c):
a if(条件表达式) 语句
b if(条件表达式) 语句 1
else 语句 2
c if(条件表达式) 语句 1
else if(条件表达式) 语句 2
else if(条件表达式) 语句 3

使用特权

评论回复
33
gaoke231|  楼主 | 2019-11-30 23:19 | 只看该作者
开关语句
开关语句是一种实现多方向条件分支的语句。虽然可用条件语句嵌套实现,但如果用开
关语句则可使得程序条理分明,可读性强。开关语句由关键词 switch 构成,一般形式如下:
switch(表达式)
{
case 常量表达式 1:语句 1
break;
case 常量表达式 2:语句 2
break;
case 常量表达式 3:语句 3
break;
……
default: 语句 d
}
开关语句的执行过程是:将 switch 后面的表达式的值与 case 后面的常量表达式逐个比
较,当遇到相等时则执行 case 后面的语句,break 语句的功能是终止当前语句的执行,使得
程序能跳出 switch 语句。如果没有相等的情况,则执行语句 d。

使用特权

评论回复
34
gaoke231|  楼主 | 2019-11-30 23:19 | 只看该作者
循环语句
循环语句给需要进行反复多次的操作提供了方便。在 C 语言中提供了 4 种循环控制语句。
它们的构成形式为:
a while(条件表达式) 语句;
当条件满足时,就反复执行后面的语句,一直执行到条件不满足时。以软件延时程序为
例说明该语句是如何执行的。
void delay(long v)
{
while(v!=0)v--;
}
该程序段使用 while 语句,先判断 v 的值是否为“0”,当不为“0”时执行其后的语句,当 v=0
时,退出循环。在循环体中同样也要条件以使得能够退出循环。
b do 语句 while(条件表达式)
先执行一次循环体的语句,再判断条件是否满足,以决定是否再执行循环体。下面的程
序将数组 BUFF[20]中的全部数据相加。

使用特权

评论回复
35
gaoke231|  楼主 | 2019-11-30 23:20 | 只看该作者
for([初值设定表达式];[循环条件表达式];[条件更新表达式])语句
for 语句常用于需固定循环次数的循环。下面的程序段同样实现将数组 BUFF[20]中的全
部数据相加的功能。
Int x=0;
Char I=0;
for(I=0;I<20;I++)
x =BUFF[I] + x;
……
d goto 语句标号
goto 语句常用于跳转到一个固定的地址标号。其中固定的地址标号是一个带“:”的标志
符。比如:
……
MM:……
……
goto MMM
……

使用特权

评论回复
36
gaoke231|  楼主 | 2019-11-30 23:20 | 只看该作者
函数的定义与调用
在 C 语言中函数是基本模块,一个 C 语言程序是由若干个函数(至少一个,是主函数)构
成的。但只有一个主函数 main(),同时 C 程序都是由主函数 main()开始,它是程序的起点。
使用函数可大大提高编程效率。函数有两种:编译系统提供的标准库函数,用户自定义函数。
标准库函数可直接调用,而用户自定义函数需自己编写或定义之后才能调用。函数定义的一
般形式为:
函数类型 函数名(形式参数表)
形式参数说明
{
局部变量定义
函数体语句
}
其中,函数类型说明了自定义函数返回值的类型;
函数名是自定义函数的名字;
形式参数表中列出了在主调用函数与被调用函数之间传递数据的形式参数,形式参数的
类型必须加以说明,主调函数可以是主函数,也可以是其他函数;
局部变量定义将定义在函数内部使用的局部变量;
函数体语句是为了完成该函数功能而写的各种语句的总合。

使用特权

评论回复
37
gaoke231|  楼主 | 2019-11-30 23:21 | 只看该作者
MSP430 C 语言标准库函数
MSP430 C 语言编译环境提供了大量的标准库函数。要使用这些标准库函数,非常简单,只要在程序的开始声明要使用的库函数所在的头文件,之后在程序中就可以直接调用了。头
文件的声明使用 #include "****.h"语法即可。
常用的有以下一些头文件:这里对其中的函数只作一个简要介绍,详细使用情况可以查
看软件中的帮助文件。

使用特权

评论回复
38
gaoke231|  楼主 | 2019-11-30 23:21 | 只看该作者
ctype.h 字符处理类
isalnum int isalnum(int c) 字母还是数字
isalpha int isalpha(int c) 是否字母
iscntrl int iscntrl(int c) 是否控制码
isdigit int isdigit(int c) 是否数字
isgraph int isgraph(int c) 是否为可打印的非空字符
islower int islower(int c) 是否小写字母
isprint int isprint(int c) 是否为可打印字符
ispunct int ispunct(int c) 是否为表示标点符号的字符
isspace int isspace(int c) 是否为空白字符
isupper int isupper(int c) 是否为大写字符
isxdigit int isxdigit(int c) 是否为 16 进制数
tolower int tolower(int c) 转换为小写字符
toupper int toupper(int c) 转换为大写字符

使用特权

评论回复
39
gaoke231|  楼主 | 2019-11-30 23:22 | 只看该作者
math.h 数学类
acos double acos(double arg) 反余弦函数
asin double asin(double arg) 反正弦函数
atan double atan(double arg) 反正切函数
atan2 double atan2(double arg1,double arg2) 带象限的反正切函数
ceil double ceil(double arg) 大于或等于 arg 的最小正整数
cos double cos(double arg) 余弦函数
cosh double cosh(double arg) 双余弦函数
exp double exp(double arg) 指数函数
fabs double fabs(double arg) 双精度的浮点绝对值
floor double floor(double arg) 小于或等于 arg 的最大正整数
fmod double fmod(double arg1,double arg2) 浮点数的余数
frexp double frexp(double arg1, int *arg2) 将浮点数分为两部分
ldexp(double arg1, int arg2) 乘以 2 的幂
log double log(double arg) 自然对数函数
log10 double log10(double arg) 以 10 为底的对数函数
modf double modf(double value, double *iptr)拆开为整数部分与小数部分
pow double pow(double arg1, double arg2) 求幂函数
sin double sin(double arg) 正弦函数
sinh double sinh(double arg) 双曲正弦
sqrt double sqrt(double arg) 平方根函数
tan double tan(double x) 正切函数
tanh double tanh(double arg) 双曲正切函数

使用特权

评论回复
40
gaoke231|  楼主 | 2019-11-30 23:22 | 只看该作者
setjmp.h 非局部跳转
longjmp void longjmp(jmp_buf env, int val) 长跳转
setjmp int setjmp(jmp_buf env) 设置返回点跳转

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则