第二章MSP430单片机软件开发基础PPT课件.ppt_第1页
第二章MSP430单片机软件开发基础PPT课件.ppt_第2页
第二章MSP430单片机软件开发基础PPT课件.ppt_第3页
第二章MSP430单片机软件开发基础PPT课件.ppt_第4页
第二章MSP430单片机软件开发基础PPT课件.ppt_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章MSP430单片机软件工程开发基础 2 1MSP430指令系统概述2 2寻址方式2 3指令系统介绍2 3 1数据传送类指令2 3 2逻辑运算类指令2 3 3位操作类指令2 3 4跳转与程序流程控制类指令2 4汇编语言程序设计2 4 1程序设计基础2 4 2汇编语言程序设计 2 5C语言程序设计基础2 5 1标识符与关键字2 5 2变量2 5 3标识符与关键字2 5 4扩展的关键字2 5 5程序设计的基本结构2 5 6函数2 5 7数组2 5 8指针2 5 9预处理命令2 6MSP430单片机软件工程基础2 7MSP430单片机软件开发集成环境CCSv5 1 指令的分类按照性质分类 内核指令 coreinstruction 具有唯一的操作码供CPU译码 分成三种指令格式 双操作数指令 12条 单操作数指令 7条 跳转指令 8条 仿真指令 emulatedinstruction 为了便于阅读理解和书写而引入 没有自己对应的操作码 汇编时由汇编器自动转换成相应的核心指令 按照功能分类 数据传送指令算术运算指令逻辑运算指令位操作指令跳转指令 2 1MSP430指令系统概述 1514131211109876543210 op code S D Reg As Ad B W 单操作数指令 SingleOperandInstruction 1514131211109876543210 op code 10 BitPCOffset 跳转指令 JumpInstruction C 3种核心指令格式 字节指令 B 和字指令 W 字节指令用于byte型数据和外设的存取操作 字指令用于word型数据和外设的存取操作 如果省略 B或 W后缀 则默认为 W指令 双操作数和单操作数核心指令既可以是字节指令 也可以是字指令 op code S Reg D Reg As Ad B W DoubleOperandInstruction op code S D Reg As Ad B W SingleOperandInstruction op code 10 BitPCOffset JumpInstruction C 0 wordoperation1 byteoperation 指令格式解释双操作数指令 同时存在源操作数和目的操作数单操作数指令 只有源操作数或目的操作数指令格式中 源操作数由As和S reg定义目的操作数由Ad和D reg定义 op code S Reg D Reg As Ad B W DoubleOperandInstruction 源操作数工作寄存器 目的操作数工作寄存器 源操作数寻址方式位 目的操作数寻址方式位 操作码 0 wordoperation1 byteoperation 源操作数操作数的寻址方式 op code S Reg D Reg As Ad B W DoubleOperandInstruction Rn n 4 15 00寄存器方式Rn n 4 15 01变址方式PC01符号方式SR 0 01绝对方式Rn n 4 15 10寄存器间接方式Rn n 4 15 11寄存器间接增量PC11立即数方式 由As和S Reg共同决定源操作数的寻址方式 目的操作数操作数的寻址方式 op code S Reg D Reg As Ad B W DoubleOperandInstruction 寄存器方式0Rn n 4 15 变址方式1Rn n 4 15 符号方式1PC绝对方式1SR 0 由Ad和D Reg共同决定目的操作数的寻址方式 2 指令书写格式MSP430汇编语言指令格式标号分隔符操作码分隔符操作数分隔符注释空格空格 说明 1 操作数之间的分隔符为逗号 2 操作码要指明是字节还是字MOV B 字节 MOV W 字 具体指令举例 RESETMOV W 0A00H SP 0A00H SP 2 1MSP430指令系统概述 3 指令代码格式 标号 伪 指令助记符 操作数1 操作数2 注释 4 指令系统中常用符号说明 1 Rn R0 R15 2 src det 源操作数 目的操作数 3 PC R0 程序计数器 4 地址符号 5 立即数符号 6 寄存器间接寻址 7 direct 寄存器直接寻址 2 1MSP430指令系统概述 2 2寻址方式 1 概述MSP430有七种寻址方式 1 寄存器寻址 2 变址寻址 3 符号寻址 4 绝对寻址 5 间接寄存器寻址 6 间接增量寻址 7 立即寻址 2 2寻址方式 2 寄存器寻址特点 寄存器内容是操作数例如 MOVR10 R11 R10 R11 执行前R100A123HR110FA00H 执行后R100A123HR110A123H MOV 1234H R7 MOVR8 目的操作数寄存器寻址 源操作数寄存器寻址 3 变址寻址特点 寄存器内容 偏移量 存储器地址例如 MOV2 R10 3 R11 R10 2 R11 3 2 2寻址方式 4 符号寻址特点 存储器地址使用符号表示 使用前符号要赋值 例如 MOVEDE TON1 执行前R100A123HR110FA00H内存单元0A125H1234H内存单元0FA03H5678H 执行后R100A123HR110FA00H内存单元0A125H1234H内存单元0FA03H1234H 若EDE 1234H TON1 2345H执行前 1234H 4A67H 2345H 8BC0H 执行后 1234H 4A67H 2345H 4A67H 2 2寻址方式 5 绝对寻址特点 存储器地址在指令中直接给出例如 MOV AABBH CCDDH AABBH CCDDH 6 间接寻址特点 寄存器内容为存储器地址例如 MOV R10 R11 R10 R11 2 2寻址方式 7 间接增量寻址特点 寄存器内容为存储器地址 操作后寄存器内容自动增量例如 MOV R10 R11 R10 R11 R10 2 18 立即寻址特点 操作数由指令直接给出例如 MOV 0AAH R10 2 3指令系统介绍 学习指令系统注意事项1 掌握指令功能2 掌握指令执行后的影响3 掌握指令占用字节数 执行时间4 不要编造指令 MSP430指令系统包括 内核指令 27条 由实际的硬件直接产生机器码 仿真指令 若干条 通过核心指令组合而成 2 3指令系统介绍 1 MOV 内核指令 通用数据传送指令MOV W MOV BSRC DST 操作 src dst例子 MOV 234H R5 将立即数234H传送到R5寄存器MOV将R5寄存器清零 2 3 1数据传送类指令 2 3指令系统介绍 3 PUSH 内核指令 入栈指令4 POP 出栈指令PUSHSRCPOPDST实际是由MOV SP DST生成的仿真指令5 SWPB 内核指令 交换字节指令SWPBSRC DST举例 MOV 2345H R5 寄存器R5中的值为2345HSWPBR5 执行后R5的内容为4523H6 SXT 内核指令 扩展符号指令符号扩展 将D7数值复制到D15 D8举例 MOV 2345H R5 寄存器R5中的值为2345HSXTR5 执行后R5的内容为0045HMOV 2388H R5 寄存器R5中的值为2388HSXTR5 执行后R5的内容为FF88H 2 3 1数据传送类指令 2 3指令系统介绍 1 加法指令 1 ADD 内核指令 源操作数和目的操作数相加ADD W ADD BSRC DST SRC DST DST 2 ADDC 内核指令 带进位的加法指令ADDC W ADDC BSRC DST SRC DST C DST 3 ADC 将进位加至目的操作数ADC W ADC BDST DST C DST实际是由ADDC B 0 DST生成的仿真指令 2 3 2数据运算类指令 2 3指令系统介绍 ADDC指令主要用于多字节加法运算 例如 有两个32位数相加 分别存放于地址220H和230H 把相加的结果存放于地址240H 加法要分两次进行 对应的先进行低位字节相加 然后再进行高字节相加 高位字节相加的时候 要把前面两个字相加的进位考虑进去 ADD保存高位进位 举例 1 加法指令 4 DADD 内核指令 带进位的BCD数相加指令 SRC DST C DST 十进制 DADD W DADD BSRC DST 按照BCD码执行加法操作 5 DADC 将十进制的进位加至目的操作数 实际是由DADD B 0 DST生成的仿真指令DADC W DADC BDST DST C DST 6 INC 目的操作数加1INC W INC BDST 实际是由ADD 1 DST生成的仿真指令 7 INCD 目的操作数加2INCD W INC BDST 实际是由ADD 2 DST生成的仿真指令 2 3 2数据运算类指令 2 减法指令 1 SUB 内核指令 从目的操作数中减去源操作数SUB W SUB BSRC DST DST SRC DST 2 SUBC 内核指令 带借位的减法指令SUBC W SUBC BSRC DST DST SRC 1 DST 3 SBC 从目的操作数中减去借位 DST 0FFFFH C DSTSBC W SBC BDST实际是由SUBC B 0 DST生成的仿真指令 4 CMP 内核指令 比较源操作数和目的操作数CMP W CMP BSRC DST DST SRC 2 3 2数据运算类指令 MOV 2345H R5SUB 4567H R5执行结果 R5 0DDDEH C 1 有进位 MOV 3456H R5SUB 63H R5执行结果 R5 033F3H C 0 无进位 MOV B 45H R5SUB B 63H R5执行结果 R5 E2H C 1 有进位 MOV B 56H R5SUB B 45H R5执行结果 R5 011H C 0 无进位 举例 2 3指令系统介绍 2 减法指令 5 DEC 目的操作数减1 DST 1 DSTDEC W DEC BDST 6 DECD 目的操作数减2 DST 2 DSTDECD W DECD BDST 7 TST 测试目的操作数 DST 0FFFFH 1TST W TST BDST实际是由CMP 0 DST生成的仿真指令 2 3 2数据运算类指令 2 3指令系统介绍 此指令一般用于在循环程序中修改地址指针和循环次数 将R6指向的100个字传送到R7所指向的100个连续的字地址空间 MOV 100 R8 传送的字节数TRANS MOV R6 0 R7 对应单元开始传送INCDR7 字操作 调整R7所指向的单元DECR8 每传送完毕一个字 传送字数减1JNZTRANS 没有传送完 继续 举例 2 3指令系统介绍 1 逻辑运算指令 1 AND 源操作数与目的操作数 与 SRCANDDST DSTAND W AND BSRC DST 2 BIC 清零目的操作数各位NOTSRCANDDST DSTBIC W BIC BSRC DST 3 BIS 设置目的操作数各位SRCORDST DSTBIS W BIS BSRC DST 4 BIT 测试目的操作数各位SRCANDDSTBIT W BIT BSRC DST 2 3 3逻辑运算类指令 2 3指令系统介绍 1 逻辑运算指令 5 XOR 源操作数与目的操作数异或SRCXORDST DSTXOR W XOR BSRC DST 6 INV 目的操作数求反INV W INV BDST由XOR 0FFFFH DST DST 实现 2 3 3逻辑运算类指令 2 移位指令 1 RLARLADST 算术循环左移RLA W RLA BDST 2 RLC 带进位循环左移RLC W RLC BDST带进位算术左移 3 RRA 算术循环右移RRA W RRA BDST算术右移 4 RRC 带进位循环右移RRCDST带进位算术右移 2 3指令系统介绍 1 CLRC 清除进位位C标志位清零 2 CLRN 清除负位N标志位清零 3 CLRZ 清除零位Z标志位清零 4 SETC 置位进位位C标志位置位 2 3 4位操作类指令 2 3指令系统介绍 5 SETN 置位负 N 标志位 6 SETZ 置位零 Z 标志位 7 DINT 禁止可屏蔽中断 8 EINT 使能 允许 可屏蔽中断 2 3 4位操作类指令 2 3指令系统介绍 1 BR 转移到目标操作数 任何寻址方式 BRDST DST PC 2 CALL 子程序调用指令CALLDST操作 DST TMP DST被评估和存储SP 2 SPPC SP 将PC更新至TOSTMP PC 将DST保存至PC 2 3 5跳转与程序流程控制类指令 2 3指令系统介绍 3 JC JHS有进位 大于等于时转移 无符号比较 JC标号 进位置位时程序跳转JHS标号 大于或等于时程序跳转操作 若C 1 PC 2X偏移 PC若C 0 顺序执行下一条指令举例 比较R5中的内容和15 如果大于或等于15 程序转移到标号CMP 15 R5JHSLABEL 若R5大于或等于15 则程序跳转 若R5小于15 则程序继续 4 JEQ JZ相等 为零时转移 2 3指令系统介绍 5 JGE大于等于时转移 有符号比较 6 JL小于时转移 有符号比较 7 JMP无条件转移 8 JN结果为负时转移 2 3 5跳转与程序流程控制类指令 9 JNC JLO无进位 小于时转移 无符号比较 10 JNE JNZ不为零时 不相等时转移 11 RET子程序返回 12 RETI中断返回 13 NOP空操作 2 3 5跳转与程序流程控制类指令 2 4汇编语言程序设计 步骤确定算法 画出流程图进行资源分配 为参数 中间结果 指针 计数器分配工作单元 定义数据类型和数据结构编写源代码 2 4 1程序设计基础 2 4汇编语言程序设计 常用程序结构 1 简单程序 2 分支程序 3 循环程序 2 4 1程序设计基础 2 4汇编语言程序设计 1 汇编伪指令功能 1 代码 数据定位 2 保留空间 3 控制汇编后列表文件格式 4 初始化存储器 5 汇编条件块 6 定义全局变量 7 获得库函数 宏 8 产生符号化调试信息 2 4 2汇编语言程序设计 2 4汇编语言程序设计 1 汇编伪指令 1 模块控制伪指令NAME PROGRAM 一个程序模块的开始MODULE LIBRARY 一个库模块的开始ENDMOD当前汇编模块的结束END一个汇编文件的结束 2 4 2汇编语言程序设计 2 4汇编语言程序设计 1 汇编伪指令 2 段控制伪指令ASEG一个绝对段的开始RSEG一个可重定位段 相对段 的开始STACK定义堆栈段COMMON定义公共段ORG设置定位指针ALIGN插入填充字节以校对程序计数器EVEN插入填充字节使程序计数器对准偶数地址 2 4 2汇编语言程序设计 2 4汇编语言程序设计 1 汇编伪指令 3 数值分配伪指令SET赋予一个临时值EQU 在当前模块中赋予一个永久值DEFINE定义一个在整个文件中有效的值sfrb寄存器类型的字节Sfrw寄存器类型的字 2 4 2汇编语言程序设计 2 4汇编语言程序设计 1 汇编伪指令 4 数据定义伪指令DB定义一个8位常数DW定义一个16位常数DL定义一个32位常数DF定义一个32位浮点数DS分配N个字节单元 2 4 2汇编语言程序设计 2 4汇编语言程序设计 2 常用汇编程序设计方法设计原则 1 节省数据单元 2 缩短程序长度 3 加快运行速度MSP430系列单片机存储器容量最小最大RAM128B2KBROM类1KB60KB 2 4 2汇编语言程序设计 2 4汇编语言程序设计 2 常用汇编程序设计方法 1 顺序结构画流程图第一张 分解总任务为子任务第二张 子任务细化第三张 资源分配 2 4 2汇编语言程序设计 2 4汇编语言程序设计 2 常用汇编程序设计方法 2 选择结构 1 单分支选择 判断监测数据是否超过报警阈值 2 多分支选择 键盘处理 3 循环结构 2 4 2汇编语言程序设计 2 4汇编语言程序设计 例已知VAR 200H 单元内有一自变量X 按如下条件求出函数Y并将它存入FUNC 2FFH 单元 这是一个三分支条件转移问题 2 4 2汇编语言程序设计 2 4汇编语言程序设计 程序如下 ORG1000HVUNEQU0200HFUNCEQU02FFHMOVVUN R6MOV 0000H R7CMPR7 R6JZDONEJLNEGMOV 0001H R6 JMPDONENEGMOV 0FFFFH R6DONEMOVFUNC R6 RET END 2 4汇编语言程序设计 3 子程序及设计方法 1 子程序用于大量重复执行相同任务 只是处理的数据不同 时 2 子程序设计注意 结构化现场保护参数传递4 汇编语言编程举例 略 2 4 2汇编语言程序设计 2 5MSP430单片机C语言基础 2 5 1标识符与关键字 1 标识符用来标示程序中某个对象的名字 这些对象可以是语句 数据类型 函数 变量 常数 数组等 标识符的第一个字符必须是字母或下划线 随后的字符必须是字母 数字或下划线 例如 count data text2是正确形式 而2count是错误形式 对大小写字符敏感 例如 对于SEC和sec这两个标识符来说 C语言会认为它们是两个完全不同的标识符 2 关键字一种具有特定含义的标识符 用户不能将关键字用做自己定义的标识符 数据类型关键字 auto char const double enum extern float int long register sizeof short static typedef union unsigned void volatile 程序控制关键字 break case continue default do else for goto if return switch while 预处理功能关键字 define endif elif ifdef ifndef include line undef C430的基本数据类型 2 5 2变量 1 算术运算符 自增与自减运算符 2 5 3C语言运算符 基本算术运算符 关系运算符列表 逻辑运算符描述列表 2 关系运算符 3 逻辑运算符与表达式 位操作运算符描述列表 4 位操作运算符 赋值运算符描述列表 5 赋值运算符 运算符优先级列表 2 5 4扩展的关键字 1 与I O访问相关 Sfrb 字节类型的特殊功能寄存器或外围模块用于声明单字节I O数据类型对象 语法 sfrb标识符 常量表达式 Sfrb表示一个I O寄存器 它的特点 等价于无符号字符 只能直接寻址 只能驻留在地址范围0 x00 0 xFF 如 sfrbP1OUT 0 x0021 Sfrw 字类型的特殊功能寄存器或外围模块用于声明双字节I O数据类型对象 语法 sfrw标识符 常量表达式 Sfrw表示一个I O寄存器 它的特点 等价于无符号字符 只能直接寻址 只能驻留在地址范围0 x100 0 x1FF 如 sfrwWDTCTL 0 x0021 2 5 4扩展的关键字 2 函数类 Interrupt 用于中断函数 语法 interrupt 中断向量 void函数名 参数 中断函数没有参数返回 中断函数一般是void 没有返回一般要说明中断向量 Interrupt TIMERB0 VECTOR voidTimerB ISR void 2 5 4扩展的关键字 3 pragma编译命令 pragma编译命令控制编译器的存储器分配 控制是否允许用扩展关键字 以及是否输出警告消息 它提供符合标准语法的扩展特性 例如 pragmavector BASICTIMER VECTOR BasicTimer中断向量 interruptvoidBT ISR void 声明一个中断服务程序 名为BT ISR 程序的基本结构 顺序结构 选择结构和循环结构 结构化程序设计方法的原则 自顶向下 逐步细化 基本结构 组合而成 清晰第一 效率第二 书写规范 缩进格式 2 5 5程序设计的基本结构 1 顺序结构顺序结构是从前往后依次执行语句 整体看所有的程序 顺序结构是基本结构 只不过中间某个过程是选择结构或循环结构 执行完选择结构或循环结构后程序又按顺序执行 2 选择结构又称为选取结构或分支结构 其主要特点是程序的流程由多路分支组成 在程序的一次执行过程中 根据不同的条件 只有一条分支被选中执行 而其他分支上的语句被直接跳过 C语言提供的选择结构语句有两种 条件语句和开关语句 条件语句 if语句 用来判断条件是否满足 根据判定的结果决定后续的操作 主要有三种格式 if 表达式 语句 if 表达式 语句1 else 语句2 if 表达式1 语句1 elseif 表达式2 语句2 elseif 表达式3 语句3 elseif 表达式n 1 语句n 1 else 语句n 1 条件语句 例 if语句的用法 if x y printf x d y d n x y 执行上面语句时 如果x不等于y 则输出x的值和y的值 if x y max x elsemax y 执行上面语句时 如x大于y成立 则把x送给最大值变量max 如x大于y不成立 则把y送给最大值变量max 使max变量得到x y中的大数 if score 90 printf YourresultisanA n elseif score 80 printf YourresultisanB n elseif score 70 printf YourresultisanC n elseif score 60 printf YourresultisanD n elseprintf YourresultisanE n 执行上面语句后 能够根据分数score分别打出A B C D E五个等级 1 条件语句 switch 表达式 case常量表达式1 语句1 break case常量表达式2 语句2 break case常量表达式n 语句n break default 语句n 1 2 开关语句 switch case 开关语句 switch语句 用来实现多方向条件分支的选择 虽然可用条件语句嵌套实现 但是使用开关语句可是程序条理分明 提高可靠性 其格式如下 说明如下 1 switch后面括号内的表达式 可以是整型或字符型表达式 2 当该表达式的值与某一 case 后面的常量表达式的值相等时 就执行该 case 后面的语句 然后遇到break语句退出switch语句 若表达式的值与所有case后的常量表达式的值都不相同 则执行default后面的语句 然后退出switch结构 3 每一个case常量表达式的值必须不同否则会出现自相矛盾的现象 4 case语句和default语句的出现次序对执行过程没有影响 5 每个case语句后面可以有 break 也可以没有 有break语句 执行到break则退出switch结构 若没有 则会顺次执行后面的语句 直到遇到break或结束 6 每一个case语句后面可以带一个语句 也可以带多个语句 还可以不带 语句可以用花括号括起 也可以不括 7 多个case可以共用一组执行语句 while 表达式 语句 循环体 3 循环语句 do 语句 循环体 while 表达式 for 表达式1 表达式2 表达式3 语句 循环体 1 函数的定义 1 函数定义的语法形式函数类型函数名 形式参数表 形式参数说明 局部变量定义 语句序列 返回语句return 表达式 2 函数的类型和返回值类型标识符规定了函数的类型 也就是函数的返回值类型 函数的返回值是需要返回给主函数的处理结果 由return语句给出 例如 return0 无返回值的函数其类型标识符为void 不必写return语句 3 形式参数与实际参数函数定义时填入的参数称为形式参数 简称形参 它们同函数内部的局部变量作用相同 形参的定义是在函数名后的括号中 调用时替换的参数 是实际参数 简称实参 定义的形参与调用函数的实参类型应该一致 书写顺序应该相同 2 5 6函数 2 函数的声明 调用函数之前首先要在所有函数外声明函数原型 声明形式如下 extern 函数类型函数名 形式参数表 一旦函数原型声明之后 该函数原型在本程序文件中任何地方都有效 也就是说在本程序文件中任何地方都可以依照该原型调用相应的函数 如果声明的函数在文件内部 则声明时不用extern 若声明的函数不在文件内部 而在另一个文件中 声明时须带extern 指明使用的函数在另一个文件中 3 函数的调用 1 作为语句调用把函数作为一个语句 函数无返回值 只是完成一定的操作 例如 ADC10 init 2 作为表达式调用函数出现在一个表达式中 例如 sum c add a b 3 作为参数调用函数调用作为一个函数的实参 例如 sum add c add a b 2 5 6函数 3 函数的调用 4 递归调用函数可以自我调用 如果一个函数内部的一个语句调用了函数本身 则称为递归调用 一个比较经典的递归调用举例为计算n 程序代码如下 intfactorial int 函数声明intfactorial n 函数定义 intproduct If n 1 return 1 product factorial n 1 n 函数调用return product 2 5 6函数 4 函数中变量的类别 根据变量的作用区间及在函数的内部还是外部等 将函数中变量的类别分为局部变量和全局变量 1 局部变量把函数中定义的变量称为局部变量 由于形参相当于函数中定义的变量 所以形参也是一种局部变量 局部变量仅有被定义的模块内部的函数所访问 模块以 开始 以 结束 也就是说局部定义的变量只在 内有效 局部变量在每次函数调用时分配内存空间 在每次函数返回时释放存储空间 2 全局变量全局变量也称为外部变量 它是在所有函数外部定义的变量 它不属于哪一个函数 它属于一个源程序文件 其作用域是整个源程序 定义全局变量最好在程序的顶部 全局变量在程序开始运行时分配存储空间 在程序结束时释放存储空间 在任何函数中都可以被访问 局部变量可以和全局变量重名 但是 局部变量会屏蔽全局变量 在函数内部引用这个变量时 会用到同名的局部变量 而不会用到全局变量 2 5 6函数 5 内部函数和外部函数 1 内部函数如果一个函数只能被本文件内的其他函数所调用 称为内部函数 在定义内部函数时 在函数名和函数类型的前面加static 内部函数的定义一般格式为 static类型标识符函数名 形参表 2 外部函数在声明函数时 如果在函数首部的最左端冠以关键字extern 则表示此函数是外部函数 可供其他文件调用 其定义格式为 extern类型标识符函数名 形参表 2 5 6函数 1 一维数组 数组是一个由同种类型变量组成的集合 引入数组就不需要在程序中定义大量的变量 大大减少程序中变量的数量 使程序简练 另外 数组含义清楚 使用方便 明确地反映了数据之间的联系 许多好的算法都与数组有关 熟练地利用数组 可以大大提高编程的效率 1 定义一维数组在C语言中使用数组必须先进行定义 一维数组的定义形式如下 类型说明符数组名 常量表达式 例如 inta 20 说明整型数组a 有20个元素 2 引用一维数组引用一维数组元素的一般形式如下 数组名 下标 其中下标只能是在编译阶段进行的 这样将减少运行时间 提高效率 初始化赋值的一般形式如下 类型说明符数组名 常量表达式 值 值 值 其中 在 中的各数据值即为个元素的初值 各值之间用逗号间隔 例如 inta 10 0 1 2 3 4 5 6 7 8 9 相当于a 0 0 a 1 1 a 9 9 2 5 7数组 2 二维数组 1 定义二维数组二维数组定义的一般形式如下 类型说明符数组名 常量表达式1 常量表达式2 例如 intscore 5 3 定义了一个5行3列的二维数组score 2 引用二维数组二维数组的元素也称为双下标变量 其表示形式如下 数组名 下标1 下标2 其中 下标1和下标2为整型常量或整型表达式 例如之前定义的score数组 其中score 3 2 表示score数组中第四行第三列的元素 3 初始化数组二维数组初始化也是在类型说明时给各下标变量赋以初值 二维数组可以按行分段赋值 也可按行连续赋值 按行分段赋值可写为inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 按行连续赋值可写为inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 2 5 7数组 3 字符数组 字符数组是用来存放字符串的数组 1 定义字符数组形式与前面定义的数组相同 例如 charc 5 2 初始化字符数组字符数组也允许在定义时做初始化赋值 例如 charc 5 c h i n a 把5个字符分别赋给了c 0 c 4 5个元素 如果 中提供的初始值个数大于数组长度 则在编译时系统会提示语法错误 如果初值个数小于数组长度 则只将这些字符赋给数组中前面那些元素 其余元素由系统自动定义为空字符 0 3 引用字符数组字符数组的逐个字符引用 与引用数组元素类似 2 5 7数组 1 指针和指针变量概念 C语言中每一个实体 如变量 数组都要在内存中占有一个可表示的存储区域 每一个存储区域由若干个字节组成 在内存中每个字节都有一个 地址 一个存储区域的 地址 指的是该存储区域中第一个字节的地址 或称首地址 在C语言中 将地址形象化地称为 指针 一个变量的地址称为该变量的 指针 如果有一个变量专门用来存放另一个变量的地址 即 指针 则它称为 指针变量 使用指针访问能使目标程序占用内存少 运行速度快 2 指针变量的定义 指针变量的定义格式为 类型说明符 指针变量名 其中 表示这里定义的是一个指针类型的变量 类型说明符 可以是任意类型 指的是指针所指向的对象的类型 这说明了指针所指的内存单元可以用于存放什么类型的数据 称之为指针的类型 例如 int pointer 说明pointer是指向整型的指针变量 也就是说 在程序中用它可以间接访问整型变量 2 5 8指针 3 与地址相关的运算 和 称为指针运算符 表示获取指针所指向的变量的值 例如 i pointer表示指针i pointer所指向的数据的值 称为取地址运算符 用来得到一个对象的地址 例如 使用 i就可以得到变量i的存储单元地址 4 指针的运算 1 算术运算指针进行加减运算的结果与指针的类型密切相关 比如有指针p1和整数n1 p1 n1表示指针p1当前所指位置后第n1个数的地址 p1 n1表示指针p1当前所指位置前第n1个数的地址 指针 或 指针 表示当前所指位置下一个或前一个数据的地址 2 5 8指针 4 指针的运算 2 关系运算指针变量的关系运算指的是指向相同类型数据的指针之间进行的关系运算 如果两个相同类型的指针相等 就表示这两个指针指向同一个地址 3 赋值运算声明了一个指针 只是得到了一个用于存储地址的指针变量 但是 变量中并没有确定的值 其中的地址值是一个随机的数 因此 定义指针之后必须先赋值 然后才可以引用 与其他类型的变量一样 对指针赋初值也有两种方法 在声明指针的同时进行初始化赋值 语法形式为 类型说明符 指针变量名 初始地址 数据的起始地址就是数组的名称 例如下面的语句 inta 10 声明int型数组int i pointer a 声明并初始化int型指针 在声明之后 单独使用赋值语句 赋值语句的语法形式为 指针变量名 地址 举例如下 int i pointer 声明int型指针i pointerinti 声明int型数组ii pointer 取i的地址赋给i pointer 预处理是C语言具有的一种对源程序的处理功能 所谓预处理 指的是在正常编译之前对源程序的预先处理 这就是说 源程序在正常编译之前先进行预处理 即执行原程序中的预处理命令 预处理后 源程序再被正常编译 预处理命令包括宏定义 文件包含和条件编译3个主要部分 预处理指令是以 开头的代码行 必须是该行除了任何空白字符外的第一个字符 后是指令关键字 在关键字和 之间允许存在任意个数的空白字符 预处理指令后面不加 整行语句构成一条预处理指令 该指令将在编译器进行编译之前对源代码做某些转换 2 5 9预处理命令 2 5 9预处理命令 2 6MSP430单片机软件工程基础 2 6 1MSP430单片机软件编程方法 1 模块是一个 c文件和一个 h文件的结合 头文件 h 中是对该模块接口的声明 这一条概括了模块化的实现方法和实质 将一个功能模块的代码单独编写成一个 c文件 然后把该模块的接口函数放在 h文件中 例如 当你用到液晶显示 那么你可以写一个液晶驱动模块 以实现字符 汉字和图像的显示 命名为 lcd device c和lcd device h 2 某模块提供给其他模块调用的外部函数及变量需在 h文件中以extern关键字声明 首先介绍外部函数的使用 假设之前创建的lcd device提供了最基本的LCD驱动函数 voidlcd PutChar charNewValue 在当前位置输出一个字符若想在另外一个文件中调用此函数 就需要将此函数设为外部函数 设置的方法是在 h文件中声明该函数前加extern关键字 并在另外一个文件内包含该 h头文件 外部变量的使用 进行模块化编程的一个难点就是外部变量的设定 初学者往往很难想通模块与模块之间变量的公用是如何实现的 常规的方法就是在 h头文件中声明该变量前加extern关键字 并在另外一个模块中包含该 h头文件 则就可以在同一片内存空间对相同变量进行操作 2 6 2模块化编程介绍 3 模块内的函数和全局变量需在 c文件开头冠以static关键字声明 在模块内 但在函数体外 一个被声明为静态的变量可以被模块内所有函数访问 但不能被模块外其他函数访问 它是一个本地的全局变量 在模块内 一个被声明为静态的函数只可被这一模块内的其他函数调用 不能被模块外的函数调用 4 永远不要在 h文件中定义变量一个变量只可定义一次 但是 可以声明多次 一个 h文件可以被其他任何一个文件所包含 如果这个 h文件中定义了一个变量 那么在包含该 h文件的文件内将再次开辟空间定义这个变量 而它们对应于不同的存储空间 例如 module1 h inta 5 在模块1的 h文件中定义inta module1 c include module1 h 在模块1中包含模块1的 h文件 module2 c include module1 h 在模块2中包含模块1的 h文件 2 6 2模块化编程介绍 以上程序在模块1 2 3中都定义了整型变量a a在不同的模块中对应不同的地址单元 这样的编程不合理 正确的做法是 module1 h externinta 在模块1的 h文件中定义inta module1 c include module1 h 在模块1中包含模块1的 h文件inta 5 在模块1的 c文件中定义inta module2 c include module1 h 在模块2中包含模块1的 h文件这样 如果模块1 2 3操作a的话 对应的是同一个内存单元 2 6 2模块化编程介绍 程序软件质量是一个非常重要的概念 一个高质量的程序软件不仅能使系统无错误且正常运行 而且程序本身结构清晰 可读性强 高质量的程序软件应具备以下条件 结果必须正确 功能必须实现 且在精度和其他各方面均满足要求 便于检查 修正 移植和维护 具有良好的结构 书写规范 逻辑清晰 可读性强 运行时间尽可能短 同时尽可能合理地使用内存 2 6 3高质量的程序软件应具备的条件 2 7MSP430单片机软件开发集成环境CCSv5 CCS CodeComposerStudio 是TI公司推出的 集成开发环境 IDE IntergratedDevelopmentEnvironment 所谓 集成开发环境 就是处理器的所有开发都在一个软件里完成 包括工程管理 程序编译 代码下载 调试等功能 CCS支持所有TI公司推出的处理器 包括MSP430 ARMCortex系列 C2000和DSP 人们认识CCS都是因为TI的DSP 而对于MSP430的开发 用的最多的是IAR公司的EW430 人都是有惰性的 一旦用上了Keil就不习惯IAR 用习惯了IAR就不愿换CCS TI公司在CCSV5之后的版本里 对MSP430的支持达到了全新的高度 83 2 7 1安装CCS 不要使用中文路径许可文件向TI中国大学计划部索取 供100台计算机同时使用 84 2 7 2CCS的Workspace 85 WorkSpace有什么用 只有同一个WorkSpace文件夹的工程 可以显示在同一软件界面中 随时激活编辑和使用 86 更改CCS的Workspace方法1 在安装到 Selectaworkspace 的时候 可以不勾选图2 2中的小框 那样的话 每次启动CCS都会询问 更改Workspace将会很方便 87 更改CCS的Workspace的方法2 除了在启动CCS时选择WorkSpace外 还可以电点击File SwitchWorkspace CCS将会重新启动 切换到新的Workspace 88 2 7 3新建或添加工程和文件 只能在同一个Workspace中新建或添加工程 89 添加现有工程 点击File Import ExistingCCS CCEEclipseProjects 90 按一般的浏览文件夹方法选择已存在的工程即可注意 勾选上Copyprojectsintoworkspace 这样一旦选择的即使不是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论