MSP430汇编指令集(中文)+详解带实例
- 格式:pdf
- 大小:505.26 KB
- 文档页数:29
MSP430混合信号微控制器数据手册产品特性●低电压范围:2.5V~5.5V●超低功耗——活动模式:330μA at 1MHz, 3V——待机模式:0.8μA——掉电模式(RAM数据保持):0.1μA●从待机模式唤醒响应时间不超过6μs●16位精简指令系统,指令周期200ns●基本时钟模块配置——多种内部电阻——单个外部电阻——32kHz晶振——高频晶体——谐振器——外部时钟源●带有三个捕获/比较寄存器的16位定时器(Timer_A)●串行在线可编程●采用保险熔丝的程序代码保护措施●该系列产品包括——MSP430C111:2K字节ROM,128字节RAM——MSP430C112:4K字节ROM,256字节RAM——MSP430P112:4K字节OTP,256字节RAM●EPROM原型——PMS430E112:4KB EPROM, 256B RAM●20引脚塑料小外形宽体(SOWB)封装,20引脚陶瓷双列直插式(CDIP)封装(仅EPROM)●如需完整的模块说明,请查阅MSP430x1xx系列用户指南(文献编号:SLAU049产品说明TI公司的MSO43O系列超低功耗微控制器由一些基本功能模块按照不同的应用目标组合而成。
在便携式测量应用中,这种优化的体系结构结合五种低功耗模式可以达到延长电池寿命的目的。
MSP430系列的CPU采用16位精简指令系统,集成有16位寄存器和常数发生器,发挥了最高的代码效率。
它采用数字控制振荡器(DCO),使得从低功耗模式到唤醒模式的转换时间小于6μs.MSP430x11x系列是一种超低功耗的混合信号微控制器,它拥有一个内置的16位计数器和14个I/0引脚。
典型应用:捕获传感器的模拟信号转换为数据,加以处理后输出或者发送到主机。
作为独立RF传感器的前端是其另一个应用领域。
DW封装(顶视图)可用选型功能模块图管脚功能简介:1.CPUMSP430的CPU采用16位RISC架构,具有高度的应用开发透明性。
MSP430F2系列16位超低功耗单片机模块原理第10章通用串口界面Universal Serial Interface 版本: 1.5日期: 2007.5.原文: TI MSP430x2xxfamily.pdf翻译: 陈安都湖南长沙-中南大学编辑: DC 微控技术论坛版主注:以下文章是翻译TI MSP430x2xxfamily.pdf 文件中的部分内容。
由于我们翻译水平有限,有整理过程中难免有所不足或错误;所以以下内容只供参考.一切以原文为准。
详情请密切留意微控技术论坛。
Page 1 of 15通用串行接口模块(USI)提供与硬件模块的SPI和I2C串行通信。
本章讨论这两种模式。
USI模块包含在MSP420X20XX系列中。
主题10.1 USI的介绍10.2 USI的使用10.3 USI的寄存器10.1 USI的介绍USI模块提供支持同步串行通信的基本功能。
一般地,一个8、16位移位寄存器能用来输出数据流,少许的几条指令就可以执行串行通信。
另外,USI包含的内置硬件可以模拟SPI和I2C通信。
USI模块还包括中断,可以进一步减少串行通信的通用程序并且保持MSP430的低功耗特性。
USI模块的特性包括:支持三线SPI模式支持I2C模式可变的数据长度在LPM4方式下不需要内部时钟MSB或LSB指令可选在I2C模式下能控制SCL打开、停止监测在主机模式下的仲裁丢失监测可编程的时钟发生器可选择的钟极性和相位控制Page 2 of 15表10-1展示了SPI模式下的USI模块Page 3 of 15表10-2展示了I2C模式下的USI模块10.2 USI的操作USI模块主要由移位寄存器和位计数器组成,通过逻辑控制来支持SPI和I2C 通信。
USI的移位寄存器为USISR,通过软件直接控制数据的移入和移出。
位计数器计算采样位的数目以及在USICNTX位写零时设置USI中断标志位Page 4 of 15USIIFG。
一、基础_实验【10个】1、入门试验:LED闪烁(1个)2、时钟实验:设置MCLK、ACLK、SMCLK(1个)3、低功耗实验:设置低功耗模式(1个)4、IO端口试验:IO端口寄存器设置(1个)5、定时器:看门狗定时器、TimerA寄存器设置(2个)6、比较器:比较器A寄存器(1个)7、Flash:flash读写(1个)8、异步通信:异步通信寄存器设置(1个)9、ADC:ADC12寄存器设置(1个)二、开发板模块简单程序【56个】1、LED流水灯实验(红、黄、绿)(1)LED1:检测开发板(2)LED2:普通IO控制闪烁(3)LED3:PWM信号控制闪烁2、蜂鸣器实验(1)蜂鸣器1:单频音(步进变音调)(2)蜂鸣器2:奏乐(祝你平安)3、数码管实验(1)数码管1(显示123456)(2)数码管2(动态显示0~F)(3)数码管3(流动光圈)(4)数码管4(来回光标)4、4×1独立按键实验(1)4×1键盘1:扫描数码管显示(2)4×1键盘2:中断数码管显示(3)4×1键盘3:控制LED(4)4×1键盘4:控制蜂鸣器5、4×4矩阵键盘实验(1)4×4键盘1:行列扫描数码管显示(2)4×4键盘2:行列扫描1602液晶显示(3)4×4键盘3:控制LED蜂鸣器6、1602液晶实验(1)1602液晶1:动态字符显示(2)1602液晶2:静态字符显示(3)1602液晶3:内部时钟显示7、3.3V-5V电平转换实验(1)电平转换1:输出5V方波(2)电平转换2:输出不同占空比的方波(3)电平转换3:MCLK,SMCLK,ACLK8、RS232接口实验(1)RS232接口1:MCU发送数据PC机显示(2)RS232接口2:按键控制MCU发送数据PC机显示(3)RS232接口3:PC机发送数据MCU液晶显示(4)RS232接口4:MCU回发接收到的PC机数据(5)RS232接口5:RS232控制蜂鸣器9、RS485接口实验(1)RS485接口1:发送程序(2)RS485接口2:接收程序10、USB接口实验(1)USB接口1:简单连接测试(2)USB接口2:USB接收数据(3)USB接口3:USB发送数据11、PS2接口实验(1)PS2接口1:PS2控制1602显示(2)PS2接口2:PS2控制数码管显示(3)PS2接口3:PS2控制LED和蜂鸣器12、12-Bit高精度温度传感器实验(1)温度传感器1:DS18B20在数码管显示(2)温度传感器2:DS18B20在液晶显示13、RTC实时时钟实验(1)实时时钟1:DS1302测试(2)实时时钟2:DS1302电子钟14、2k Bit EEPROM实验(1)EEPROM1:AT24C02测试(2)EEPROM2:读出数据通过串口在PC机显示15、12-Bit模数转换器(ADC)接口实验(1)模数转换器1:ADC在数码管显示(2)模数转换器2:ADC在1602液晶在显示(3)模数转换器3:ADC通过串口在PC机显示16、8-Bit数模转换器(DAC)实验(1)数模转换器1:DAC控制LED(2)数模转换器2:DAC输出电压,ADC采样转换并在液晶上显示17、12864液晶实验(与12864液晶配套)(1)12864液晶并口1:字符显示(2)12864液晶并口2:汉字显示(3)12864液晶并口3:图形显示(4)12864液晶并口4:综合演示(5)12864液晶串口5:字符显示(6)12864液晶串口6:汉字显示(7)12864液晶串口7:图形显示(8)12864液晶串口8:综合演示18、射频模块CC1000实验(1)射频模块1:发送数据(2)射频模块2:接收数据19、ucos移植注:17、18程序随模块赠送三、开发板综合程序【30】1、键盘综合实验(1)4×4键盘+蜂鸣器+LED+数码管显示(2)4×4键盘+蜂鸣器+LED+1602液晶显示(3)4×4键盘+蜂鸣器+LED+PC机显示(4)PS2键盘+UART+PC机显示(5)PS2键盘+USB+PC机显示2、接口综合实验(1)USB UART(2)UART USB(3)RS232 RS485(4)RS485 RS2323、温度时间综合实验(1)DS18B20 + DS1302 + 数码管(2)DS18B20 + DS1302 + USB(3)DS18B20 + DS1302 + UART(4)DS18B20 + DS1302 + 16024、AD DA综合实验(1)ADC + 1602(2)ADC + UART(3)ADC + USB(4)DAC + LED + KEY(5)DAC + UART(6)DAC + USB(7)ADC + UART + DS1302(8)ADC + DAC + 1602 + KEY(9)ADC + DAC + UART + KEY5、其他综合实验(1)AT24C02高级应用(搜索,擦除,读出全部)(2)DS1302高级应用(内部RAM存取数据)6、12864液晶综合实验(1)汉字库(2)图形库7、3.2寸TFT触摸屏实验(1)静态图片(2)动画/***************************************************程序功能:BoardConfig.h 头文件---------------------------------------------------***************************************************/ typedef unsigned char uchar;typedef unsigned int uint;//控制位的宏定义#define Ctrl_Out P3DIR |= BIT3 + BIT6 + BIT7;#define Ctrl_0 P3OUT &= ~(BIT3 + BIT6 + BIT7) #define SRCLK_1 P3OUT |= BIT7#define SRCLK_0 P3OUT &= ~BIT7#define SER_1 P3OUT |= BIT6#define SER_0 P3OUT &= ~BIT6#define RCLK_1 P3OUT |= BIT3#define RCLK_0 P3OUT &= ~BIT3//板上资源配置函数void BoardConfig(uchar cmd){uchar i;Ctrl_Out;Ctrl_0;for(i = 0; i < 8; i++){SRCLK_0;if(cmd & 0x80) SER_1;else SER_0;SRCLK_1;cmd <<= 1;}RCLK_1;_NOP();RCLK_0;}/***************************************************程序功能:控制8个LED闪烁,用于测试下载功能是否正常---------------------------------------------------测试说明:观察LED闪烁***************************************************/#include <msp430x14x.h>//#include "BoardConfig.h"/****************主函数****************/void main(void){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗// BoardConfig(0xf0); //关闭数码管和电平转换,打开流水灯CCTL0 = CCIE; //使能CCR0中断CCR0 = 2047; //设定周期0.5STACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式P6DIR = 0xff; //设置P6口方向为输出P6OUT = 0xff;_EINT(); //使能全局中断LPM3; //CPU进入LPM3模式}/*******************************************函数名称:Timer_A功能:定时器A的中断服务函数参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){P6OUT ^= 0xff; //P2口输出取反}/***********************************************程序功能:实现流水灯以三种流动方式和四种流动速度的不同组合而进行点亮"流动"------------------------------------------------测试说明:观察流水灯流动顺序和速度的变化************************************************//***********************************************程序功能:实现流水灯以三种流动方式和四种流动速度的不同组合而进行点亮"流动"------------------------------------------------测试说明:观察流水灯流动顺序和速度的变化************************************************/#include <msp430x14x.h>#include "BoardConfig.h"uint i = 0,j = 0,dir = 0;uint flag = 0,speed = 0; //flag--灯光流动方式,speed--灯光流动速度/****************主函数****************/void main(void){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗// BoardConfig(0xf0);CCTL0 = CCIE; //使能CCR0中断CCR0 = 50000;TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,8分频增计数模式P6DIR = 0xff; //设置P2口方向为输出P6OUT = 0xff;_EINT(); //使能全局中断LPM0; //CPU进入LPM0模式}/*******************************************函数名称:Timer_A功能:定时器A的中断服务函数,在这里通过标志控制流水灯的流动方向和流动速度参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){if(flag == 0){P6OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1}else if(flag == 1){P6OUT = ~(0x01<<(i++)); //灯的点亮顺序D1 -> D8}else{if(dir) //灯的点亮顺序D8 -> D1,D1 -> D8,循环绕圈{P6OUT = ~(0x80>>(i++));}else{P6OUT = ~(0x01<<(i++));}}if(i == 8){i = 0;dir = ~dir;}j++;if(j == 40){i = 0;j = 0;flag++;if(flag == 4) flag = 0;switch(speed){case 0:TACTL &=~ (ID0 + ID1);TACTL |= ID_3;break;case 1:TACTL &=~ (ID0 + ID1);TACTL |= ID_2;break;case 2:TACTL &=~ (ID0 + ID1);TACTL |= ID_1;break;case 3:TACTL &=~ (ID0 + ID1);TACTL |= ID_0;break;default:break;}if(flag != 3) speed++;if(speed == 4) speed = 0;}}/*******************************************************程序功能:用从P2.3和P2.4输出的PWM波形驱动LED闪烁P2.3口输出方波的占空比为75%P2.4口输出方波的占空比为25%-------------------------------------------------------测试说明:观察LED的亮灭的时间长短用来连2.3到6.1口看*******************************************************/#include <msp430x14x.h>//#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // 关狗//BoardConfig(0xb0); // 关闭数码管和电平转换,打开流水灯P2DIR = 0xff; // P2端口设置为输出P2OUT = 0xff; // 关闭其他LEDP2SEL |= BIT3 + BIT4; // P2.3和P2.4连接内部模块CCR0 = 4096-1; // PWM周期为1SCCTL1 = OUTMOD_7; // CCR1 reset/setCCR1 = 3072; // CCR1 PWM duty cycleCCTL2 = OUTMOD_7; // CCR2 reset/setCCR2 = 1024; // CCR2 PWM duty cycleTACTL = TASSEL_1 + ID_3 + MC_1; // ACLK/8, up mode_BIS_SR(LPM3_bits); // Enter LPM3}//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK//// Description: Output buffered MCLK, SMCLK and ACLK.// ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2// //* XTAL's REQUIRED - NOT INSTALLED ON FET *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//内部已经连好了的//// MSP430F149// -----------------// /|\| XIN|-// | | | 32k// --|RST XOUT|-// | |// | XT2IN|-// | | XTAL (455k - 8Mhz)// |RST XT2OUT|-// | |// | P5.4|-->MCLK = DCO Max// | P5.5|-->SMCLK = XT2// | P5.6|-->ACLK = 32kHz//// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer DCOCTL = DCO0 + DCO1 + DCO2; // Max DCOBCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSELBCSCTL2 |= SELS; // SMCLK = XT2P5DIR |= 0x70; // P5.6,5,4 outputsP5SEL |= 0x70; // P5.6,5,5 optionswhile(1){}}//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, LPM3 Using WDT ISR, 32kHz ACLK//// Description: This program operates MSP430 normally in LPM3, pulsing P3.4// at 4 second intervals. WDT ISR used to wake-up system. All I/O configured// as low outputs to eliminate floating inputs. Current consumption does// increase when LED is powered on P3.4. Demo for measuring LPM3 current.// ACLK= LFXT1/4= 32768/4, MCLK= SMCLK= default DCO// //* External watch crystal on XIN XOUT is required for ACLK *////暗久才亮一下和亮暗和时钟没关系啊// MSP430F149// ---------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.5|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);//BCSCTL1 |= DIVA_2; // ACLK/4WDTCTL = WDT_ADL Y_1000; // WDT 1s/4 interval timerIE1 |= WDTIE; // Enable WDT interruptP1DIR = 0xFF; // All P1.x outputsP1OUT = 0; // All P1.x resetP2DIR = 0xFF; // All P2.x outputsP2OUT = 0; // All P2.x resetP3DIR = 0xFF; // All P3.x outputsP3OUT = 0x30; // All P3.x resetP4DIR = 0xFF; // All P4.x outputsP4OUT = 0; // All P4.x resetP5DIR = 0xFF; // All P5.x outputsP5OUT = 0; // All P5.x resetP6DIR = 0xFF; // All P6.x outputsP6OUT = 0x80; // All P6.x resetwhile(1){uint i;_BIS_SR(LPM3_bits + GIE); // Enter LPM3P3OUT &= ~BIT5; // Set P3.5 LED on亮for (i = 18000; i>0; i--); // DelayP3OUT |= BIT5; // Clear P3.5 LED off暗}}#pragma vector=WDT_VECTOR__interrupt void watchdog_timer (void){_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)}//******************************************************************************* // MSP-FET430P140 Demo - Software Toggle P3.4//// Description: Toggle P3.4 by xor'ing P3.4 inside of a software loop.// ACLK= n/a, MCLK= SMCLK= default DCO ~800k//// MSP430F149// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//******************************************************************************#include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerP3DIR |= BIT4; // Set P3.4 to output directionfor (;;){volatile unsigned int i;P3OUT ^= BIT4; // Toggle P3.4 using exclusive-ORi = 50000; // Delaydo (i--);while (i != 0);}}//****************************************************************************** // MSP-FET430P140 Demo - WDT, Toggle P3.4, Interval Overflow ISR, DCO SMCLK//P3.4使用软件WDT中断时间。
1.数据传送指令MOV 源操作数移至目的操作数MOV.B scr,dst /MOV[.W] scr,dst CLR 清除目的操作数CLR.B dst /CLR[.W] dstPOP 字从堆栈弹出至目的操作数POP.B dst /POP[.W] dstPUSH 将字压进堆栈PUSH.B src /PUSH[.W] src SWPB 交换字节SWPB dstSXT 扩展符号SXT dst2.数据运算指令ADC 将进位位加至目的操作数ADC.B dst /ADC dst或ADC[.W] dst ADD 源操作数加至目的操作数ADD src,dst /ADD[.W] src,dst ADDC 原操作数和进位加至目的操作数ADDC.B src,dst /ADDC[.W] src,dst DADC 加上十进制的进位位DADC.B dst /DADC [.W] src,dst DADD 将十进制的进位位和源操作数加至目的操作数DADD.B src,dst /DADD[.W] src,dst INC 目的操作数加1 INC.B dst /INC[.W] dstINCD 目的操作数加2 INCD.B dst /INCD[.W] dstSUB 从目的操作数中减去源操作数SUB src,dst /SUB[.W] src,dst SUBC 从目的操作数中减去源操作数和借位/非进位SUBC src,dst /SUBC[.W] src,dst DEC 目的操作数减1 DEC.B dst /DEC[.W] dstDECD 目的操作数减2 DECD.B dst /DECD[.W] dstSBC 从目的操作数减去借位SBC.B dst /SBC[.W] dstCMP 比较源操作数和目的操作数CMP.B src,dst /CMP[.W] src,dst TST 测试目的操作数TST.B dst /TST[.W] dst3.逻辑运算和位操作类指令AND 源操作数和目的操作数与AND.B src,dst /AND[.W] src,dstBIC清除目的操作数的各位BIC.B src,dst /BIC [.W] src,dstBIS 设置目的操作数的各位BIS.B src,dst /BIS[.W] src,dstBIT 测试目的操作数的各位BIT.B src,dst /BIT[.W] src,dstXOR 源操作数和目的操作数异或XOR.B src,dst /XOR[.W] src,dstINV 目的操作数求反INV.B dst /INV[.W] dstRLA 算数左移RLA.B dst /RLA[.W] dstRLC 通过进位位左移RLC.B dst /RLC[.W] dstRRA 算数右移RRA.B dst /RRA[.W] dstRRC 通过进位位右移RRC.B dst /RRC[.W] dstCLRC 清除进位位CLRCCLRN 清除负位CLRNCLRZ 清除零位CLRZSETC 设置进位位SETCSETN 设置负位SETNSETZ 设置零位SETZDINT 禁止(一般)中断DINTEINT 使能(一般)中断EINT4.跳转与程序流程的控制类指令BR 转移至目的操作数BR dstCALL 调用子程序CALL dstJC/JHS JC 设置进位位时程序跳转JC 标号JHS 大于和等于时程序跳转JHS 标号JEQ/JZ JEQ 等于时程序跳转JEQ 标号JZ 为零时程序跳转JZ标号JGE 大于等于时程序跳转JGE 标号JL 小于时程序跳转JL 标号JMP 程序无条件跳转JMP 标号JN 为负时程序跳转JN标号JNC/JLO JNC 进位未设置时程序跳转JNC 标号JLO 小于时程序跳转JLO 标号JNE/JNZ JNE 不等时程序跳转JNE 标号JNZ 不为零时程序跳转JNZ 标号RET 从子程序返回RETRETI 从中断返回RETINOP 空操作NOP。
/ 2001-08-06版权所有©2001 广州单片机网站1MSP430 系列汇编指令集简介MSP430 的内核CPU 结构是按照精简指令集和高透明指令的宗旨来设计的使用的指令有硬件执行的内核指令和基于现有硬件结构的高效率的仿真指令仿真指令使用内核指令及芯片额外配置的常数发生器CG1 CG2MSP430 指令的寻址方式包括立即寻址索引寻址符号寻址和绝对寻址这四种方式均可用于源操作数而索引符号和绝对寻址方式只可用于目的操作数源操作数的指令集需占用代码存储器中的1~3个字寻址方式寻址方式源操作数目标操作数语法As Ad说明寄存器寻址Yes Yes MOV Rs, Rd 00 0 寄存器内容是操作数索引寻址Yes Yes MOV x(Rn), y(Rm) 01 1 (Rn+x)指向操作数x 储存在下一个字中符号寻址Yes Yes MOV EDE, TON1 01 1 (PC+x)指向操作数x 储存在下一个字中绝对寻址Yes Yes MOV &MEM, &TCDAT 01 1 跟随在指令后的字包含绝对地址间接寻址Yes MOV @Rn, y(Rm) 10 Rn 用作指向操作数的指针间接自动增量Yes MOV @Rn+, Rm 11 Rn 用作指向操作数的指针,其后Rn 被增量立即数寻址Yes MOV #x, TON1 11 跟随在指令后的字包含立即数x 使用间接自动增量模式@PC+Rn n=0~15 Rs 源寄存器Rd 目标寄存器寻址方式例子操作寄存器寻址MOV R10, R11 R10 → R11索引寻址MOV 2(R5), 6(R6) M(2+R5) → M(6+R6)符号寻址MOV EDE, TON1 M(EDE) → M(TON1)绝对寻址MOV &MEM, &TCDAT M(MEM) → M(TCDAT)间接寻址MOV @R10, Tab(R6) M(R10) → M(Tab+R6)间接自动增量MOV @R10+, R11 M(R10) → R11, R10+2 →R10立即数寻址MOV #0AAH, TON1 #0AAH → M(TON1)指令概述共51 条指令状态位操作码操作V N Z CADC[.W]; ADC.B dst dst + C -> dst * * * *ADD[.W]; ADD.B src, dst src + dst -> dst * * * *ADDC[.W]; ADDC.B src, dst src + dst + C -> dst * * * *AND[.W]; AND.B src, dst src .and. dst -> dst 0 * * *BIC[.W]; BIC.B src, dst .not.src .and. dst -> dst - - - -BIS[.W]; BIS.B src, dst src .or. dst -> dst - - - -BIT[.W]; BIT.B src, dst src .and. dst 0 * * *BR dst 转移到- - - -CALL dst PC + 2 ->堆栈, dst -> PC - - - -CLR[.W];CLR.B dst 清除目的操作数- - - -CLRC 清除进位位- - - 0CLRN 清除负位- 0 - -CLRZ 清除零位- - 0 -CMP[.W];CMP.B dst dst - src * * * */ 2001-08-06版权所有©2001 广州单片机网站2DADC[.W];DADC.B dst dst + C -> dst (十进制) * * * *DADD[.W];DADD.B src, dst src + dst + C -> dst (十进制) * * * * DEC[.W];DEC.B dst dst - 1 -> dst * * * *DECD[.W];DECD.B dst dst - 2 -> dst * * * *DINT 禁止中断- - - -EINT 使能中断- - - -INC[.W];INC.B dst dst + 1 -> dst 目的操作数增1 * * * * INCD[.W];INCD.B dst dst + 2 -> dst 目的操作数增2 * * * * INV[.W];INV.B dst 目的操作数求反* * * *JC/JHS 标号进位位被置时转移到标号语句- - - -JEQ/JZ 标号零位被置时转移到标号语句- - - -JGE 标号N .xor. V = 0 时转移到标号语句- - - -JL 标号N .xor. V = 0 时转移到标号语句- - - -JMP 标号无条件转移到标号语句- - - -JN 标号负位被置时转移到标号语句- - - -JNC/JLO 标号进位位复位时转移到标号语句- - - -JNE/JNZ 标号零位复位时转移到标号语句- - - -MOV[.W];MOV.B src, dst src -> dst - - - -NOP 空操作- - - -POP[.W];POP.B dst 项目从堆栈弹出, SP + 2 -> SP - - - - PUSH[.W];PUSH.B src SP – 2 -> SP , src -> @SP - - - -RETI 从中断返回TOS -> SR SP + 2 -> SPTOS -> PC SP + 2 -> SZP - - - -RET 从子程序返回TOS -> SR SP + 2 -> SP - - - -RLA[.W];RLA.B dst 算术左移* * * *RLC[.W];RLC.B dst 带进位位左移* * * *RRA[.W];RRA.B dst 算术右移0 * * *RRC[.W];RRC.B dst 带进位位右移* * * *SBC[.W];SBC.B dst 从目的操作数减去借位* * * *SETC 置进位位- - - 1SETN 置负位- 1 - -SETZ 置零位- - 1 -SUB[.W];SUB.B src, dst dst + .not. src + 1 -> dst * * * *SUBC[.W];SUBC.B src, dst dst + .not. src + C -> dst * * * *SWAP dst 交换字节- - - -SXT dst dst 位7 -> 位8......位15 0 * * *TST[.W];TST.B dst 测试目的操作数0 * * 1XOR[.W];XOR.B src, dst src .xor. dst -> dst * * * *注状态位中* 表示影响- 表示不影响0 表示清零1 表示置位指令格式双操作数指令由4 个域组成共有16 位代码● 操作码域 4bit 操作码/ 2001-08-06版权所有 2001 广州单片机网站3● 源域 6bit 源寄存器 + As (4 位寄存器数0~15 + 2 个寻址位)● 字节操作识别符 1bit B/W B/W=1 以字节形式执行B/W=0 以字形式执行● 目的域 5bit 目的寄存器 + Ad (4 位寄存器数0~15 + 1 个寻址位)15 12 11 8 7 6 5 4 3 0操作码源寄存器Ad B/W As 目的寄存器单操作数指令由2 个域组成共有16 位代码● 操作码域 9bit 操作码● 字节操作识别符 1bit B/W (B/W=1 以字节形式执行B/W=0 以字形式执行● 目的域 6bit 目的寄存器 + Ad (4 位寄存器数0~15 + 1 个寻址位)15 12 7 6 5 4 3 00 0 0 1 x x x x x x B/W Ad 目的寄存器条件转移和无条件转移指令由2 个域组成共有16 位代码● 操作码域 6bit● 转移偏转域 10bit B/W (B/W=1 以字节形式执行B/W=0 以字形式执行15 13 12 10 9 00 0 1 x x x x x x x x x x x x x操作码转移码符号偏移条件转移使指令可转移到相对于当前地址范围在–512 ~ +512 字之间的地址指令集说明( 51 条指令以字母为序)ADC[.W] 将进位加至目的操作数语法ADC dst 或ADC.W dst操作dst + C -> dst仿真ADDC #0.dst说明进位C 加至目的操作数操作数以前的内容丢失状态位N 结果为负时置位为正时复位Z 结果为零时置位其它情况时复位C dst 从0FFFFH 增至0000 时置位其它情况复位V 发生算术溢出时置位其它情况时复位方式位OscOff CPUOff 和GIE 不受影响例子R13 指向的16 位数值加到R12 指向的32 位数值ADD @R13, 0(R12) ;加LSDsADC 2(R12) ;将进位加至MSDADC.B 将进位加至目的操作数语法ADC.B dst操作dst + C -> dst仿真ADDC.B #0.dst说明进位C 加至目的操作数操作数以前的内容丢失状态位N 结果为负时置位为正时复位Z 结果为零时置位其它情况时复位C dst 从0FFFFH 增至0000 时置位其它情况复位V 发生算术溢出时置位其它情况时复位/ 2001-08-06版权所有 2001 广州单片机网站4方式位OscOff CPUOff 和GIE 不受影响例子R13 指向的8 位数值加到R12 指向的16 位数值ADD.B @R13, 0(R12) ;加LSDsADC.B 1(R12) ;将进位加至MSDADD[.W] 源操作数加至目的操作数语法ADD src, dst 或ADD.W src, dst操作src + dst -> dst说明源操作数加至目的操作数源操作数不受影响目的操作数以前的内容丢失状态位N 结果为负时置位为正时复位Z 结果为零时置位其它情况时复位C 结果产生进位时置位否则复位V 发生算术溢出时置位其它情况时复位方式位OscOff CPUOff 和GIE 不受影响例子R5 加上10 由一个进位使程序转移到TONIADD #10, R5 ;JC TONI ;产生进位...... ;无进位ADD.B 源操作数加至目的操作数语法ADD.B src, dst操作src + dst -> dst说明源操作数加至目的操作数源操作数不受影响目的操作数以前的内容丢失状态位N 结果为负时置位为正时复位Z 结果为零时置位其它情况时复位C 结果产生进位时置位否则复位V 发生算术溢出时置位其它情况时复位方式位OscOff CPUOff 和GIE 不受影响例子R5 加上10 由一个进位使程序转移到TONIADD #10, R5 ;将近10 加至R5 的低位字节JC TONI ;若(R5)>=246[0AH + 0F6H] 则产生进位...... ;无进位ADDC[.W] 源操作数加至目的操作数语法ADDC src, dst 或ADDC.W src, dst操作src + dst + C -> dst说明源操作数和进位C 加至目的操作数源操作数不受影响目的操作数以前的内容丢失状态位N 结果为负时置位为正时复位Z 结果为零时置位其它情况时复位C 结果的MSB产生进位时置位否则复位V 发生算术溢出时置位其它情况时复位方式位OscOff CPUOff 和GIE 不受影响例子R13 指向的32 位数值加至R13 中的指针之上11 个字(20/2 +2/2)的32 位计数器ADD @R13+, 20(R13) ;无进位加LSDsADDC @R13+, 20(R13) ;带进位加MSDs...... ;ADDC.B 源操作数加至目的操作数语法ADDC.B src, dst操作src + dst + C -> dst说明源操作数和进位C 加至目的操作数源操作数不受影响目的操作数以前的内容丢失/ 2001-08-06版权所有 2001 广州单片机网站5状态位N 结果为负时置位为正时复位Z 结果为零时置位其它情况时复位C 结果的MSB产生进位时置位否则复位V 发生算术溢出时置位其它情况时复位方式位OscOff CPUOff 和GIE 不受影响例子R13 指向的24 位数值加至R13 中的指针之上11 个字的24 位计数器ADD.B @R13+, 10(R13) ;无进位加LSDsADDC.B @R13+, 10(R13) ;带进位加中间位ADDC.B @R13+, 10(R13) ;带进位加MSDs...... ;AND.[W] 源操作数和目的操作数与语法AND src, dst 或AND.W src, dst操作src .AND. dst -> dst说明源操作数和目的操作数逻辑与结果放入目的操作状态位N 结果为MSB为1 时置位为0 时复位Z 结果为零时置位其它情况时复位C 结果不为0 时置位其它情况时复位(= .NOT. Zero)V 复位方式位OscOff CPUOff 和GIE 不受影响例子R5 中被置的位用作TOM 寻址字的一个标志(#0AA55H) 如果结果为0 程序转到TON1 处MOV #0AA55H, R5 ;将标志装入R5 寄存器AND R5, TOM ;TOM 用R5 寻址标志字JZ TON1 ;...... ;结果为非0;或AND #0AA55H, TOMJZ TON1AND.B 源操作数和目的操作数与语法AND.B src, dst操作src .AND. dst -> dst说明源操作数和目的操作数逻辑与结果放入目的操作状态位N 结果为MSB为1 时置位为0 时复位Z 结果为零时置位其它情况时复位C 结果不为0 时置位其它情况时复位(= .NOT. Zero)V 复位方式位OscOff CPUOff 和GIE 不受影响例子标志位#0A5H 和低位字节的TOM 逻辑与如果结果为0 程序转移到标号TON1 处AND.B #0A5H, TOM ; 用R5 标记低位字节TOMJZ TON1 ;...... ;结果为非0BIC[.W] 清0 目的操作数的各位语法BIC src, dst 或BIC.W src, dst操作.NOT. src .AND. dst -> dst说明求反后的源操作数和目的操作数逻辑与结果放入目的操作源操作数不变状态位N 不影响Z 不影响C 不影响/ 2001-08-06版权所有 2001 广州单片机网站6V 不影响方式位OscOff CPUOff 和GIE 不受影响例子RAM 字LEO 的6 个MSBs 被清0BIC #0FC00H, LEO ; 清0MEM LEO 中的6 个MSBsBIC.B 清0 目的操作数的各位语法BIC.B src, dst操作.NOT. src .AND. dst -> dst说明求反后的源操作数和目的操作数逻辑与结果放入目的操作源操作数不变状态位N 不影响Z 不影响C 不影响V 不影响方式位OscOff CPUOff 和GIE 不受影响例子(1) RAM 字LEO 的5 个MSBs 被清0BIC.B #0F8H, LEO ; 清0 RAM LEO 中的5 个MSBs(2) 清0 端口引脚P0 和P1P0OUT .equ 011H ;定义端口地址P0 .equ 01HP1 .equ 02HBIC.B #P0+P1, $P0OUT ;置P0 和P1 为低电平BIS[.W] 设置目的操作数的各位语法BIS src, dst 或BIS.W src, dst操作src .OR. dst -> dst说明源操作数和目的操作数逻辑或结果放入目的操作源操作数不变状态位N 不影响Z 不影响C 不影响V 不影响方式位OscOff CPUOff 和GIE 不受影响例子1 RAM 字TOM 的6 个MSBs 被置位BIS #003FH, TOM ; 设置RAM 区域TOM 中的6 个LSBs2 启动一个A/D 转换器ASOC .equ 1 ;开始转换位ACTL .equ 114H ;ADC 控制寄存器BIS #ASOC, &ACTL ;启动A/D 转换BIS.B 设置目的操作数的各位语法BIS.B src, dst操作src .OR. dst -> dst说明源操作数和目的操作数逻辑或结果放入目的操作源操作数不变状态位N 不影响Z 不影响C 不影响V 不影响方式位OscOff CPUOff 和GIE 不受影响例子1 RAM 字TOM 的3 个MSBs 被置位BIS.B #0E0H, TOM ; 设置RAM 区域TOM 中的3 个MSBs(2) 设置端口引脚P0 和P1 为高电平/ 2001-08-06版权所有 2001 广州单片机网站7P0OUT .equ 011H ;定义端口地址P0 .equ 01HP1 .equ 02HBIS.B #P0+P1, $P0OUT ;置P0 和P1 为高电平BIT[.W] 测试目的操作数的各位语法BIT src, dst 或BIT.W src, dst操作src .AND. dst -> dst说明源操作数和目的操作数逻辑与其结果只影响状态位目的操作数和源操作数不变状态位N 结果为MSB为1 时置位为0 时复位Z 结果为零时置位其它情况时复位C 结果不为0 时置位其它情况时复位(= .NOT. Zero)V 复位方式位OscOff CPUOff 和GIE 不受影响例子1 如果R8 中的位9 被置位程序转移到标号语句TOM 处BIT #0200H, R8 ; R8 的位9 是否被置JNZ TOM ;是转换到TOM2 确定哪一个A/D 通道由MUX 配置ACTL .equ 114H ;ADC 控制寄存器BIT #4, &ACTL ;通道0 是否被选择JNZ END ;是则程序转移到ENDBIT.B 测试目的操作数的各位语法BIT.B src, dst操作src .AND. dst -> dst说明源操作数和目的操作数逻辑与其结果只影响状态位目的操作数和源操作数不变状态位N 结果为MSB为1 时置位为0 时复位Z 结果为零时置位其它情况时复位C 结果不为0 时置位其它情况时复位(= .NOT. Zero)V 复位方式位OscOff CPUOff 和GIE 不受影响例子如果R8 中的位3 被置位程序转移到标号语句TOM 处BIT.B #8H, R8 ; R8 的位3 是否被置JC TOM ;是转换到TOM2 确定哪一个A/D 通道由MUX 配置ACTL .equ 114H ;ADC 控制寄存器BIT #4, &ACTL ;通道0 是否被选择JNZ END ;是则程序转移到ENDBR, BRANCH 转换到目的操作数语法BR dst操作dst -> PC仿真MOV dst, PC说明无条件转移到64K 地址空间的任一地址处可使用所有的源寻址方式转换指令是一个字指令状态位不影响状态位方式位OscOff CPUOff 和GIE 不受影响例子所有寻址方式示例BR #EXEC ;转换到标号EXEC 或直接转换例#0A4H;内核指令MOV @PC+, PCBR EXEC ;转换到标号EXEC 包含的地址/ 2001-08-06版权所有 2001 广州单片机网站8;内核指令MOV x(PC), PC 间接寻址BR &EXEC ;转换到绝对地址包含的地址;内核指令MOV x(0), PC 间接寻址BR R5 ;转换到R5 包含的地址;内核指令MOV R5, PC 用R5 间接寻址BR @R5 ;转换到R5 指向的字的包含的地址;内核指令MOV @R5, PC 用R5 间接寻址BR @R5+ ;转换到R5 指向的字的包含的地址R5 中的指针加1;内核指令MOV @R5, PC 用R5 间接寻址R5 增1BR x(R5) ;转换到R5+1 指向的地址包含的地址例从x 开始的地址表;x 可以是一个地址或一个标号;内核指令MOV x(R5), PC 用R5+x 间接寻址CALL 调用子程序语法CALL dst操作dst -> tmpSP – 2 -> SPPC -> @SP 将PC 更新至TOStmp -> PC 将dst 保存至PC说明调用64K 地址空间中任一地址处的子程序可使用所有的寻址方式返回地址(后续指令的地址)储存在堆栈中调用指令是一个字指令状态位不影响状态位例子所有寻址方式示例CALL #EXEC ;调用标号EXEC 或直接调用例#0A4H; SP – 2 -> SP, PC + 2 -> @SP, @PC+ -> PCCALL EXEC ;调用EXEC 包含的地址; SP – 2 -> SP, PC + 2 -> @SP, x(PC)+ -> PC;间接寻址CALL &EXEC ;调用绝对地址EXEC 中包含的地址; SP – 2 -> SP, PC + 2 -> @SP, x(PC)+ -> PC;间接寻址CALL R5 ;调用R5 包含的地址; SP – 2 -> SP, PC + 2 -> @SP, R5 -> PC;用R5 间接寻址CALL @R5 ;调用R5 指向的字的包含的地址; SP – 2 -> SP, PC + 2 -> @SP, @R5 -> PC;用R5 间接寻址CALL @R5+ ;调用 R5 指向的字的包含的地址R5 中的指针加1; SP – 2 -> SP, PC + 2 -> @SP, @R5 -> PC;用R5 间接寻址然后R5 自动加1CALL x(R5) ;调用R5+1 指向的地址包含的地址例从x 开始的地址表; SP – 2 -> SP, PC + 2 -> @SP, @R5 -> PC;用R5+x 间接寻址CLR[.W] 清除目的操作数语法CLR dst 或CLR.W dst操作0 -> dst仿真MOV #0, dst说明清除目的操作数/ 2001-08-06版权所有 2001 广州单片机网站9状态位不影响状态位例子(1) RAM 字TONI 被清除CLR TONI ;0 -> TONI(2) 寄存器R5 被清除CLR R5CLR.B 清除目的操作数语法CLR.B dst操作0 -> dst仿真MOV.B #0, dst说明清除目的操作数状态位不影响状态位例子RAM 字TONI 被清除CLR.B TONI ;0 -> TONICLRC 清除目的操作数语法CLRC操作0 -> C仿真BIC #1, SR说明进位位被清零清除进位位指令是一个字指令状态位N 不影响Z 不影响C 清零V 不影响方式位OscOff CPUOff 和GIE 不受影响例子R13 指向的16 位十进制数值加至R12 指向的32 位数值CLRC ;C = 0DADD @R13, 0(R12) ;16 位数值加至32 位数值的低位字DADC 2(R12) ;进位加至32 位数值的高位字CLRN 清除负位语法CLRN操作0 -> N 或 ( .NOT. src .AND. dst -> dst )仿真BIC #4, SR说明常数#04H 求反后(0FFFBH)和目的操作数逻辑与结果放入目的操作数清除负位指令是一个字指令状态位N 复位至 0Z 不影响C 不影响V 不影响方式位OscOff CPUOff 和GIE 不受影响例子状态寄存器中的负位被清零这样可以避免用负数调用子程序时的特殊处理CLRN ;CALL SUBR......SUBR: JN SUBRET ;如果输入为负无操作并返回......SUBRET: RETCLRZ 清除零位语法CLRZ/ 2001-08-06版权所有2001 广州单片机网站10操作0 -> Z 或( .NOT. src .AND. dst -> dst )仿真BIC #2, SR说明常数#02H 求反后(0FFFDH)和目的操作数逻辑与结果放入目的操作数清除负位指令是一个字指令状态位N 不影响Z 复位至0C 不影响V 不影响方式位OscOff CPUOff 和GIE 不受影响例子状态寄存器中的零位被清零CLRZ ;CMP[.W] 比较源操作数和目的操作数语法CMP src, dst 或CMP.W src, dst操作dst + .NOT. src + 1 或dst - src说明从目的操作数中减去源操作数方法是将源操作数求反再加1 源操作数和目的操作数不受影响不保存结果只影响状态位状态位N 结果为负时置位为正时复位(src >= dst )Z 结果为零时置位其他情况时复位(src = dst )C 结果为MSB产生进位时置位否则复位V 发生算术溢出时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子(1) 比较R5 和R6 如果相等程序继续从标号EQUAL 处运行CMP R5, R6 ;R5 = R6 ?JEQ EQUAL ;是程序跳转(2) 比较两个RAM 块如果不等程序转移到标号ERRORMOV #NUM, R5 ;被比较的字数L$1: CMP &BLOCK1, &BLOCK2 ;两个字相等吗JNZ ERROR ;不等则转移到ERRORDEC R5 ;被比较字数减1JNZ L$1 ;下一次比较CMP.B 比较源操作数和目的操作数语法CMP.B src, dst操作dst + .NOT. src + 1 或dst - src说明从目的操作数中减去源操作数方法是将源操作数求反再加1 源操作数和目的操作数不受影响不保存结果只影响状态位状态位N 结果为负时置位为正时复位(src >= dst )Z 结果为零时置位其他情况时复位(src = dst )C 结果为MSB产生进位时置位否则复位V 发生算术溢出时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子(1) 比较EDE 和TONI 寻址的RAM 字节如果相等程序继续从标号EQUAL 处运行CMP.B EDE, TONI ;MEM(EDE) = MEM(TONI) ?JEQ EQUAL ;是程序跳转(2) 检查连至端口引脚P0 和P1 的两个键如果按下键1 程序转移到标号MENU1 如果按下键2 程序转移到标号MENU2P0IN .EQU 010HKEY1 .EQU 01H/ 2001-08-06版权所有2001 广州单片机网站11KEY2 .EQU 02HCMP.B #KEY1, &P0INJEQ MENU1CMP.B #KEY2, &P0INJEQ MENU2DADC[.W] 加上十进制的进位位语法DADC dst 或DADC.W dst操作dst + C -> dst (十进制)仿真DADD #0, dst说明进位位C 作为十进制加至目的操作数状态位N MSB为1 时置位Z dst 为零时置位其他情况时复位C 目的操作数从9999 增至时置位其他情况时复位V 不确定方式位OscOff CPUOff 和GIE 不受影响例子R5 中的4 位十进制数加至R8 指向的8 位十进制数CLRC ;复位进位位DADD R5, 0(R8) ;加LSDs + CDADC 2(R8) ;将进位位加至MSDsDADC.B 加上十进制的进位位语法DADC.B dst操作dst + C -> dst (十进制)仿真DADD.B #0, dst说明进位位C 作为十进制加至目的操作数状态位N MSB为1 时置位Z dst 为零时置位其他情况时复位C 目的操作数从9999 增至时置位其他情况时复位V 不确定方式位OscOff CPUOff 和GIE 不受影响例子R5 中的2 位十进制数加至R8 指向的4 位十进制数CLRC ;复位进位位DADD.B R5, 0(R8) ;加LSDs + CDADC.B 1(R8) ;将进位位加至MSDsDADD[.W] 将十进制的进位位和源操作数加至目的操作数语法DADD src, dst 或DADD.W src, dst操作src + dst + C -> dst (十进制)说明源操作数和目的操作数被当作4 个带有正符号的二-十进制BCD 数十进制的源操作数和进位C 被加至目的操作数源操作数不受影响目的操作数以前的内容丢失些结果对于非二- 十进制数是不确定的状态位N MSB为1 时置位其他情况时复位Z 结果为零时置位其他情况时复位C 结果大于9999 增至时置位V 不确定方式位OscOff CPUOff 和GIE 不受影响例子R5 和R6 中的8 位二-十进制数加至R3 和R4 中的8 位二-十进制数(R3 和R4 含有MSDs)CLRC ;清进位位DADD R5, R3 ;加LSDs/ 2001-08-06版权所有2001 广州单片机网站12DADD R6, R4 ;带进位位加MSDsJC OVERFLOW ;若产生进位转移至错误处理子程序DADD.B 将十进制的进位位和源操作数加至目的操作数语法DADD.B src, dst操作src + dst + C -> dst (十进制)说明源操作数和目的操作数被当作4 个带有正符号的二-十进制BCD 数十进制的源操作数和进位C 被加至目的操作数源操作数不受影响目的操作数以前的内容丢失些结果对于非二- 十进制数是不确定的状态位N MSB为1 时置位其他情况时复位Z 结果为零时置位其他情况时复位C 结果大于9999 增至时置位V 不确定方式位OscOff CPUOff 和GIE 不受影响例子RAMbyte CNT 中的2 位十进制数值增1CLRC ;复位进位位DADD.B #1, CNT ;十进制数值增1或SETCDADD.B #0, 1(R8) ;相当于DADC.B CNTDEC[.W] 目的操作数减1语法DEC dst 或DEC.W dst操作dst - 1 -> dst仿真SUB #1, dst说明目的操作数减1 以前的内容丢失状态位N 结果为负时置位为正时复位Z dst 包含1 时置位其他情况时复位C dst 包含0 时置位其他情况时复位V 产生算术溢出时置位其他情况时复位目的操作数的初始值为08000H 时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子R10 减1DEC R10 ;R10 减1;将从EDE 开始的255 字节存储区块移到从TONI 开始的存储区;地址表不能重叠目的地址TONI 的起始点不能位于EDE 至EDE + 0FEH 的范围内;MOV #EDE, R6,MOV #255, R10L$1: MOV.B @R6+, TONI-EDE-1(R6)DEC R10JNZ L$1DEC.B 目的操作数减1语法DEC.B dst操作dst - 1 -> dst仿真SUB #1, dst说明目的操作数减1 以前的内容丢失状态位N 结果为负时置位为正时复位Z dst 包含1 时置位其他情况时复位/ 2001-08-06版权所有2001 广州单片机网站13C dst 包含0 时置位其他情况时复位V 产生算术溢出时置位其他情况时复位目的操作数的初始值为08000H 时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子地址LEO 处的存储器字节减1DEC.B LEO ;MEM(LEO)减1;将从EDE 开始的255 字节存储区块移到从TONI 开始的存储区;地址表不能重叠目的地址TONI 的起始点不能位于EDE 至EDE + 0FEH 的范围内;MOV #EDE, R6,MOV #255, R10L$1: MOV.B @R6+, TONI-EDE-1(R6)DEC.B LEOJNZ L$1DECD[.W] 目的操作数减2语法DECD dst 或DECD.W dst操作dst - 2 -> dst仿真SUB #2, dst说明目的操作数减2 以前的内容丢失状态位N 结果为负时置位为正时复位Z dst 包含2 时置位其他情况时复位C dst 包含0 或1 时置位其他情况时复位V 产生算术溢出时置位其他情况时复位目的操作数的初始值为08001H 或08000H 时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子R10 减2DECD R10 ;R10 减2;将从EDE 开始的255 字节存储区块移到从TONI 开始的存储区;地址表不能重叠目的地址TONI 的起始点不能位于EDE 至EDE + 0FEH 的范围内;MOV #EDE, R6,MOV #255, R10L$1: MOV.B @R6+, TONI-EDE-2(R6)DEC R10JNZ L$1DECD.B 目的操作数减2语法DECD.B dst操作dst - 2 -> dst仿真SUB #2, dst说明目的操作数减2 以前的内容丢失状态位N 结果为负时置位为正时复位Z dst 包含2 时置位其他情况时复位C dst 包含0 或1 时置位其他情况时复位V 产生算术溢出时置位其他情况时复位目的操作数的初始值为081H 或080H 时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子地址LEO 处的存储器字节减2/ 2001-08-06版权所有 2001 广州单片机网站14DECD.B LEO ;MEM(LEO)减2状态字节STATUS 减2DECD.B STATUSDINT 禁止(一般) 中断语法DINT操作0 -> GIE 或 (0FFF7H .AND. SR -> SR / .NOT. src .AND. dst -> dst ) 仿真BIC #8, SR说明禁止所有中断状态位N 不影响Z 不影响C 不影响V 不影响方式位OscOff CPUOff 不受影响 GIE 复位例子状态寄存器中的一般中断使能位GIE 清零可允许非中断移动一个32 位数值这样可保证在任何中断移动期间该数值不会被修改DINT ;所有使用GIE 位的中断事件被禁止MOV COUNTHI, R5 ;复制数值MOV COUNTHO, R6EINT ; 所有使用GIE 位的中断事件被使能注意禁止中断---- 在DINT 执行期间当中断请求生效时才能执行禁止中断指令DINT 后面的指令如果任何代码顺序需要保护自身不被中断则至少应该在些代码之前一个指令时执行DINT 指令EINT 使能( 一般) 中断语法EINT操作1 -> GIE 或 (0008H .OR. SR -> SR / .NOT. src .OR. dst -> dst )仿真BIS #8, SR说明使能所有中断常数08H 与状态寄存器SR 逻辑或其结果放入SR状态位N 不影响Z 不影响C 不影响V 不影响方式位OscOff CPUOff 不受影响 GIE 置位例子状态寄存器中的一般中断使能位GIE 被置P0IFG 是可锁存所有中断事件的寄存器地址PUSH.B &P0INBIC.B @SP, &P0IFG ;仅复位接收到的标记EINT ;预置保存在堆栈中的口0 中断标记允许其它中断BIT #Mask, @SPJEQ MaskOK ;现有的标记与标志相同程序跳转......MaskOK: BIC #Mask, @SP......INCD SP ;在中断子程序开始时倒回PUSH 指令修改堆栈指针RETI注意使能中断---任何情况下都可执行使能中断指令EINT 后面的指令甚至在中断服务请求悬而未决时INC[.W] 目的操作数加1语法INC dst 或INC.W dst操作dst + 1 -> dst仿真ADD #1, dst/ 2001-08-06版权所有 2001 广州单片机网站15说明目的操作数加1 以前的内容丢失状态位N 结果为负时置位为正时复位Z dst 包含0FFFFH 时置位其他情况时复位C dst 包含0FFFFH 时置位其他情况时复位V dst 包含07FFFH 时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子软件堆栈( 不是系统堆栈)顶部的字节数据被子移动SSP .EQU R4INC SSP ;通过给目的操作数据加1 来移动TOSS(SW 堆栈的顶部) ;SSP 是一个字寄存器所以不要使用INC.BINC.B 目的操作数加1语法INC.B dst操作dst + 1 -> dst仿真ADD #1, dst说明目的操作数加1 以前的内容丢失状态位N 结果为负时置位为正时复位Z dst 包含0FFH 时置位其他情况时复位C dst 包含0FFH 时置位其他情况时复位V dst 包含07FH 时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子过程STATUS 的状态字节加1 当它等于11 时程序转移到OVFL INC.B STATUSCMP.B #11, STATUSJEQ OVFLINCD[.W] 目的操作数加2语法INCD dst 或INCD.W dst操作dst + 2 -> dst仿真ADD #2, dst说明目的操作数加2 以前的内容丢失状态位N 结果为负时置位为正时复位Z dst 包含0FFFEH 时置位其他情况时复位C dst 包含0FFFEH 或0FFFFH 时置位其他情况时复位V dst 包含07FFEH 或0FFFFH 时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子无需使用寄存器即可移动堆栈顶部的项SUB......PUSH R5 ;R5 是计算的结果保存在堆栈中INCD SP ;通过给目的操作数加2 从堆栈中移走TOS;SP 是一个字寄存器所以不要使用INC.BINCD.B 目的操作数加2语法INCD.B dst操作dst + 2 -> dst仿真ADD.B #2, dst说明目的操作数加2 以前的内容丢失状态位N 结果为负时置位为正时复位Z dst 包含0FEH 时置位其他情况时复位/ 2001-08-06版权所有 2001 广州单片机网站16C dst 包含0FEH 时置位其他情况时复位V dst 包含07EH 时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子堆栈顶部的字节加2INCD.B 0(SP) ;TOS 处的字节加2INV[.W] 目的操作数求反语法INV dst 或INV.W dst操作.NOT.dst -> dst仿真XOR #0FFFFH, dst说明目的操作数取反以前的内容丢失状态位N 结果为负时置位为正时复位Z dst 包含0FFFFH 时置位其他情况时复位C 结果不为零时置位其他情况时复位 ( = .NOT.Zero ) V 初始目的操作数为负时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子R5 的内容被取消(2 的补码)MOV #00AEH, R5 ; R5=00AEHINV R5 ;R5 求反 R5=0FF51HINC R5 ;取消R5 R5=0FF52HINV.B 目的操作数求反语法INV dst 或INV.W dst操作.NOT.dst -> dst仿真XOR #0FFH, dst说明目的操作数取反以前的内容丢失状态位N 结果为负时置位为正时复位Z dst 包含0FFH 时置位其他情况时复位C 结果不为零时置位其他情况时复位 ( = .NOT.Zero ) V 初始目的操作数为负时置位其他情况时复位方式位OscOff CPUOff 和GIE 不受影响例子存储字节LEO 的内容被取消MOV #0AEH, LEO ; MEM(LEO)=0AEHINV.B LEO ;LEO 求反 MEM(LEO)=051HINC.B LEO ;取消LEO MEM(LEO)=052HJC 进位位为1 时程序跳转JHS 大于或等于时程序跳转语法JC 标号JHS 标号。
指令集描述P(220—257)* DECX.A目的操作数减1* DECX.[W] 目的操作数减1* DECX.B 目的操作数减1语法DECV.A dstDECX dst 或DECX.W dstDECX.B dst操作dst – 1 →dst仿真SUBX.A#1,dstSUBX #1,dstSUBX.B #1,dst说明目的操作数减1 以前的内容丢失状态位N :结果为负时置位为正时复位Z : dst包含1时置位其他情况时复位C : dst包含0时置位其他情况时复位V : 产生算术溢出时置位其他情况时复位目的操作数的初始值为08000H时置位其他情况时复位方式位OscOff(晶振控制位),CPUOff(CPU控制位)和GIE(中断标志位)不受影响例子目的地址操作数减一DECX.A TONI ; TONI减一* DECDX.[W] 目的操作数减2* DECDX.B 目的操作数减2语法DECDX.A dstDECDX dst or DECDX.W dsDECDX.B dst操作dst - 2 -> dst仿真SUBX.A#2,dstSUBX #2,dstSUBX.B #2,dst说明目的操作数减2 以前的内容丢失状态位N : 结果为负时置位为正时复位Z : dst包含2时置位其他情况时复位C : dst包含0或1时置位其他情况时复位V : dst产生算术溢出时置位其他情况时复位目的操作数的初始值为08001H或08000H时置方式位OscOff, CPUOff 和GIE不受影响例子目的地址操作数减二DECDX.A TONI ; Decrement TONI* INCX.[W] 目的操作数加1* INCX.B 目的操作数加1语法INCX.A dstINCX dst or INCX.W dstINCX.B dst操作dst + 1 →dst仿真ADDX.A#1,dstADDX #1,dstADDX.B #1,dst说明目的操作数加1 以前的内容丢失状态位N : 结果为负时置位为正时复位Z : dst包含0FFFFFH时置位其他情况时复位dst包含0FFFFH时置位其他情况时复位dst包含0FFFH时置位其他情况时复位C: dst包含0FFFFFH时置位其他情况时复位dst包含0FFFFH时置位其他情况时复位dst包含0FFFH时置位其他情况时复位V : dst包含07FFFH时置位其他情况时复位dst包含07FFFH时置位其他情况时复位dst包含07FH时置位其他情况时复位方式位OscOff ,CPUOff 和GIE不受影响例子目的地址操作数加一INCX.A TONI ; Increment TONI (20-bits)* INCDX.A目的操作数加2* INCDX.[W] 目的操作数加2* INCDX.B 目的操作数加2语法INCDX.A dstINCDX dst or INCDX.W dstINCDX.B dst操作dst + 1 →dst仿真ADDX.A#2,dstADDX #2,dstADDX.B #2,dst说明目的操作数加2以前的内容丢失状态位N: 结果为负时置位为正时复位Z : dst包含0FFFFEH时置位其他情况时复位dst包含0FFFEH时置位其他情况时复位dst包含0FEH时置位其他情况时复位C: dst包含0FFFFEH或0FFFFFH时置位其他情况时复位dst包含0FFFEH或0FFFFH时置位其他情况时复位dst包含0FEH或0FFH时置位其他情况时复位V: dst包含07FFFEH或0FFFFH时置位其他情况时复位dst包含07FFEH或0FFFH时置位其他情况时复位dst包含07EH或0FH时置位其他情况时复位方式位OscOff ,CPUOff 和GIE不受影响例子目的地址操作数加二INCDX.B LEO ; Increment LEO by two* INVX.A目的操作数求反* INVX.[W] 目的操作数求反* INVX.B 目的操作数求反语法INVX.A dstINVX dst or INVX.W dstINVX.B dst操作.NOT.dst →dst仿真XORX.A#0FFFFFh,dstXORX #0FFFFh,dstXORX.B #0FFh,dst说明目的操作数取反以前的内容丢失状态位N : 结果为负时置位为正时复位Z :dst 包含0FFFFFH时置位其他情况时复位dst 包含0FFFFH时置位其他情况时复位dst 包含0FFH时置位其他情况时复位C :结果不为零时置位其他情况时复位( = .NOT.Zero )V 初始目的操作数为负时置位其他情况时复位方式位OscOff CPUOff 和GIE不受影响例子R5 求反INVX.A R5 ; R5求反MOVX.A源操作数移至目的操作数MOVX.[W] 源操作数移至目的操作数MOVX.B 源操作数移至目的操作数语法MOVX.A src,dstMOVX src,dst or MOVX.W src,dstMOVX.B src,dst操作src →dst说明源操作数被移至目的操作数源操作数不受影响目的操作数以前的内容丢失状态位N: 不影响状态位Z: 不影响状态位C: 不影响状态位V: 不影响状态位方式位OscOff ,CPUOff 和GIE不受影响例子移动18000H 到EDEMOVX. A#018000h, &EDE ; Move 18000h to EDE例子地起码表EDE(字数据)的内容被复制到表TOM 地址表的长度为030H MOV #EDE, R10 ;准备指针Loop MOV @R10+, TOM-EDE-2(R10) ;将R10 中的指针用于两表DEC R9 ;计数器减1JNZ Loop ;计数器<>0 继续........ ;完成例子地起码表EDE(字数据)的内容被复制到表TOM 地址表的长度为020H MOV #EDE, R10 ;准备指针MOV #020H, R9 ;计数器Loop MOV @R10+, TOM-EDE-2(R10) ;将R10 中的指针用于两表DEC R9 ;计数器减1JNZ Loop ;计数器<>0 继续........ ;完成28种MOVX寻址方式中的10种,一个指令可以使用MOVX,这样可以节省二个字节编码周期。
这只是我在学习TI公司生产的16位超的功耗单片机MSP430的随笔,希望能对其他朋友有所借鉴,不对之处还请多指教。
下面,开始430之旅。
讲解430的书现在也有很多了,不过大多数都是详细说明底层硬件结构的,看了不免有些空洞和枯燥,我认为了解一个MCU的操作首先要对其基础特性有所了解,然后再仔细研究各模块的功能。
1、首先你要知道msp430的存储器结构。
典型微处理器的结构有两种:冯 ? 诺依曼结构----程序存储器和数据存储器统一编码;哈佛结构----程序存储器和数据存储器。
MSP430系列单片机属于前者,而常用的mcs51系列属于后者。
0-0xf特殊功能寄存器;0x10-0x1ff外围模块寄存器;0x200-?根据不同型号地址从低向高扩展;0x1000-0x107f seg_b0x1080_0x10ff seg_a 供flash信息存储,剩下的从0xffff 开始向下扩展,根据不同容量,例如149为60KB,0xffff-0x11002、复位信号是MCU工作的起点,430的复位型号有两种:上电复位信号POR和上电清楚信号PUC。
POR信号只在上电和RST/NMI复位管脚被设置为复位功能,且低电平时系统复位。
而PUC信号是POR信号产生,以及其他如看门狗定时溢出、安全键值出现错误是产生。
但是,无论那种信号触发的复位,都会使MSP430在地址0xffff处读取复位中断向量,然后程序从中断向量所指的地址开始执行。
复位后的状态不写了,详见参考书,嘿嘿。
3、系统时钟是一个程序运行的指挥官,时序和中断也是整个程序的核心和中轴线。
430最多有三个振荡器:DCO内部振荡器;LFXT1外接低频振荡器,常见的32768HZ,不用外接负载电容;也可接高频450KHZ-8M,需接负载电容;XT2接高频450KHZ-8M,加外接电容。
430有三种时钟信号:MCLK系统主时钟,可分频1/2/4/8,供CPU使用,其他外围模块在有选择情况下也可使用;SMCLK系统子时钟,供外围模块使用,可选则不同振荡器产生的时钟信号;ACLK辅助时钟,只能由LFXT1产生,供外围模块。
#ifndef __msp430x14x#define __msp430x14x/************************************************************ * STANDARD BITS************************************************************/#define BIT0 0x0001#define BIT1 0x0002#define BIT2 0x0004#define BIT3 0x0008#define BIT4 0x0010#define BIT5 0x0020#define BIT6 0x0040#define BIT7 0x0080#define BIT8 0x0100#define BIT9 0x0200#define BITA 0x0400#define BITB 0x0800#define BITC 0x1000#define BITD 0x2000#define BITE 0x4000#define BITF 0x8000/************************************************************ * STATUS REGISTER BITS************************************************************/#define C 0x0001#define Z 0x0002#define N 0x0004#define V 0x0100#define GIE 0x0008#define CPUOFF 0x0010#define OSCOFF 0x0020#define SCG0 0x0040#define SCG1 0x0080/* Low Power Modes coded with Bits 4-7 in SR */#ifndef __IAR_SYSTEMS_ICC /* Begin #defines for assembler */#define LPM0 CPUOFF#define LPM1 SCG0+CPUOFF#define LPM2 SCG1+CPUOFF#define LPM3 SCG1+SCG0+CPUOFF#define LPM4 SCG1+SCG0+OSCOFF+CPUOFF/* End #defines for assembler */#else /* Begin #defines for C */#define LPM0_bits CPUOFF#define LPM1_bits SCG0+CPUOFF#define LPM2_bits SCG1+CPUOFF#define LPM3_bits SCG1+SCG0+CPUOFF#define LPM4_bits SCG1+SCG0+OSCOFF+CPUOFF#include <In430.h>#define LPM0 _BIS_SR(LPM0_bits) /* Enter Low Power Mode 0 */#define LPM0_EXIT _BIC_SR(LPM0_bits) /* Exit Low Power Mode 0 */#define LPM1 _BIS_SR(LPM1_bits) /* Enter Low Power Mode 1 */#define LPM1_EXIT _BIC_SR(LPM1_bits) /* Exit Low Power Mode 1 */#define LPM2 _BIS_SR(LPM2_bits) /* Enter Low Power Mode 2 */#define LPM2_EXIT _BIC_SR(LPM2_bits) /* Exit Low Power Mode 2 */#define LPM3 _BIS_SR(LPM3_bits) /* Enter Low Power Mode 3 */#define LPM3_EXIT _BIC_SR(LPM3_bits) /* Exit Low Power Mode 3 */#define LPM4 _BIS_SR(LPM4_bits) /* Enter Low Power Mode 4 */#define LPM4_EXIT _BIC_SR(LPM4_bits) /* Exit Low Power Mode 4 */#endif /* End #defines for C *//************************************************************ * PERIPHERAL FILE MAP************************************************************//************************************************************ * 特殊功能寄存器地址和控制位************************************************************/ /*中断使能1*/#define IE1_ 0x0000sfrb IE1 = IE1_;#define WDTIE 0x01 /*看门狗中断使能*/#define OFIE 0x02 /*外部晶振故障中断使能*/#define NMIIE 0x10 /*非屏蔽中断使能*/#define ACCVIE 0x20 /*可屏蔽中断使能/flash写中断错误*/#define URXIE0 0x40 /*串口0接收中断使能*/#define UTXIE0 0x80 /*串口0发送中断使能*//*中断标志1*/#define IFG1_ 0x0002sfrb IFG1 = IFG1_;#define WDTIFG 0x01 /*看门狗中断标志*/#define OFIFG 0x02 /*外部晶振故障中断标志*/#define NMIIFG 0x10 /*非屏蔽中断标志*/#define URXIFG0 0x40 /*串口0接收中断标志*/#define UTXIFG0 0x80 /*串口0发送中断标志*//* 中断模式使能1 */#define ME1_ 0x0004sfrb ME1 = ME1_;#define URXE0 0x40 /* 串口0接收中断模式使能*/#define USPIE0 0x40 /* 同步中断模式使能*/#define UTXE0 0x80 /* 串口0发送中断模式使能*//* 中断使能2 */#define IE2_ 0x0001sfrb IE2 = IE2_;#define URXIE1 0x10 /* 串口1接收中断使能*/#define UTXIE1 0x20 /* 串口1发送中断使能*//* 中断标志2 */#define IFG2_ 0x0003sfrb IFG2 = IFG2_;#define URXIFG1 0x10 /* 串口1接收中断标志*/#define UTXIFG1 0x20 /* 串口1发送中断标志*//* 中断模式使能2 */#define ME2_ 0x0005sfrb ME2 = ME2_;#define URXE1 0x10 /* 串口1接收中断模式使能*/#define USPIE1 0x10 /* 同步中断模式使能*/#define UTXE1 0x20 /* 串口1发送中断模式使能*//************************************************************* 看门狗定时器的寄存器定义************************************************************/#define WDTCTL_ 0x0120sfrw WDTCTL = WDTCTL_;#define WDTIS0 0x0001 /*选择WDTCNT的四个输出端之一*/#define WDTIS1 0x0002 /*选择WDTCNT的四个输出端之一*/#define WDTSSEL 0x0004 /*选择WDTCNT的时钟源*/#define WDTCNTCL 0x0008 /*清除WDTCNT端: 为1时从0开始计数*/#define WDTTMSEL 0x0010 /*选择模式0: 看门狗模式; 1: 定时器模式*/#define WDTNMI 0x0020 /*选择NMI/RST 引脚功能0:为RST; 1:为NMI*/#define WDTNMIES 0x0040 /*WDTNMI=1时.选择触发延0:为上升延1:为下降延*/ #define WDTHOLD 0x0080 /*停止看门狗定时器工作0:启动;1:停止*/#define WDTPW 0x5A00 /* 写密码:高八位*//* SMCLK= 1MHz定时器模式*/#define WDT_MDLY_32 WDTPW+WDTTMSEL+WDTCNTCL /* TSMCLK*2POWER15=32ms 复位状态*/#define WDT_MDLY_8 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0 /* TSMCLK*2POWER13=8.192ms " */#define WDT_MDLY_0_5 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1 /* TSMCLK*2POWER9=0.512ms " */#define WDT_MDLY_0_064 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0 /* TSMCLK*2POWER6=0.512ms " *//* ACLK=32.768KHz 定时器模式*/#define WDT_ADLY_1000 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL /* TACLK*2POWER15=1000ms " */#define WDT_ADLY_250 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0 /* TACLK*2POWER13=250ms " */#define WDT_ADLY_16 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1 /* TACLK*2POWER9=16ms " */#define WDT_ADLY_1_9 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0 /* TACLK*2POWER6=1.9ms " *//* SMCLK=1MHz看门狗模式*/#define WDT_MRST_32 WDTPW+WDTCNTCL /* TSMCLK*2POWER15=32ms 复位状态*/#define WDT_MRST_8 WDTPW+WDTCNTCL+WDTIS0 /* TSMCLK*2POWER13=8.192ms " */#define WDT_MRST_0_5 WDTPW+WDTCNTCL+WDTIS1 /* TSMCLK*2POWER9=0.512ms " */#define WDT_MRST_0_064 WDTPW+WDTCNTCL+WDTIS1+WDTIS0 /* TSMCLK*2POWER6=0.512ms " *//* ACLK=32KHz看门狗模式*/#define WDT_ARST_1000 WDTPW+WDTCNTCL+WDTSSEL /* TACLK*2POWER15=1000ms " */#define WDT_ARST_250 WDTPW+WDTCNTCL+WDTSSEL+WDTIS0 /* TACLK*2POWER13=250ms " */#define WDT_ARST_16 WDTPW+WDTCNTCL+WDTSSEL+WDTIS1 /* TACLK*2POWER9=16ms " */ #define WDT_ARST_1_9 WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0 /* TACLK*2POWER6=1.9ms " *//************************************************************硬件乘法器的寄存器定义************************************************************/#define MPY_ 0x0130 /* 无符号乘法*/sfrw MPY = MPY_;#define MPYS_ 0x0132 /* 有符号乘法*/sfrw MPYS = MPYS_;#define MAC_ 0x0134 /* 无符号乘加*/sfrw MAC = MAC_;#define MACS_ 0x0136 /* 有符号乘加*/sfrw MACS = MACS_;#define OP2_ 0x0138 /* 第二乘数*/sfrw OP2 = OP2_;#define RESLO_ 0x013A /* 低6位结果寄存器*/sfrw RESLO = RESLO_;#define RESHI_ 0x013C /* 高6位结果寄存器*/sfrw RESHI = RESHI_;#define SUMEXT_ 0x013E /*结果扩展寄存器*/const sfrw SUMEXT = SUMEXT_;/************************************************************ * DIGITAL I/O Port1/2 寄存器定义有中断功能************************************************************/#define P1IN_ 0x0020 /* P1 输入寄存器*/const sfrb P1IN = P1IN_;#define P1OUT_ 0x0021 /* P1 输出寄存器*/sfrb P1OUT = P1OUT_;#define P1DIR_ 0x0022 /* P1 方向选择寄存器*/sfrb P1DIR = P1DIR_;#define P1IFG_ 0x0023 /* P1 中断标志寄存器*/sfrb P1IFG = P1IFG_;#define P1IES_ 0x0024 /* P1 中断边沿选择寄存器*/sfrb P1IES = P1IES_;#define P1IE_ 0x0025 /* P1 中断使能寄存器*/sfrb P1IE = P1IE_;#define P1SEL_ 0x0026 /* P1 功能选择寄存器*/sfrb P1SEL = P1SEL_;#define P2IN_ 0x0028 /* P2 输入寄存器*/const sfrb P2IN = P2IN_;#define P2OUT_ 0x0029 /* P2 输出寄存器*/sfrb P2OUT = P2OUT_;#define P2DIR_ 0x002A /* P2 方向选择寄存器*/sfrb P2DIR = P2DIR_;#define P2IFG_ 0x002B /* P2 中断标志寄存器*/sfrb P2IFG = P2IFG_;#define P2IES_ 0x002C /* P2 中断边沿选择寄存器*/sfrb P2IES = P2IES_;#define P2IE_ 0x002D /* P2 中断使能寄存器*/sfrb P2IE = P2IE_;#define P2SEL_ 0x002E /* P2 功能选择寄存器*/sfrb P2SEL = P2SEL_;/************************************************************ * DIGITAL I/O Port3/4寄存器定义无中断功能************************************************************/#define P3IN_ 0x0018 /* P3 输入寄存器*/const sfrb P3IN = P3IN_;#define P3OUT_ 0x0019 /* P3 输出寄存器*/sfrb P3OUT = P3OUT_;#define P3DIR_ 0x001A /* P3 方向选择寄存器*/sfrb P3DIR = P3DIR_;#define P3SEL_ 0x001B /* P3 功能选择寄存器*/sfrb P3SEL = P3SEL_;#define P4IN_ 0x001C /* P4 输入寄存器*/const sfrb P4IN = P4IN_;#define P4OUT_ 0x001D /* P4 输出寄存器*/sfrb P4OUT = P4OUT_;#define P4DIR_ 0x001E /* P4 方向选择寄存器*/sfrb P4DIR = P4DIR_;#define P4SEL_ 0x001F /* P4 功能选择寄存器*/sfrb P4SEL = P4SEL_;/************************************************************ * DIGITAL I/O Port5/6 I/O口寄存器定义PORT5和6 无中断功能************************************************************/#define P5IN_ 0x0030 /* P5 输入寄存器*/const sfrb P5IN = P5IN_;#define P5OUT_ 0x0031 /* P5 输出寄存器*/sfrb P5OUT = P5OUT_;#define P5DIR_ 0x0032 /* P5 方向选择寄存器*/sfrb P5DIR = P5DIR_;#define P5SEL_ 0x0033 /* P5 功能选择寄存器*/sfrb P5SEL = P5SEL_;#define P6IN_ 0x0034 /* P6 输入寄存器*/const sfrb P6IN = P6IN_;#define P6OUT_ 0x0035 /* P6 输出寄存器*/sfrb P6OUT = P6OUT_;#define P6DIR_ 0x0036 /* P6 方向选择寄存器*/sfrb P6DIR = P6DIR_;#define P6SEL_ 0x0037 /* P6 功能选择寄存器*/sfrb P6SEL = P6SEL_;/************************************************************* USART 串口寄存器"UCTL","UTCTL","URCTL"定义的各个位可串口1 串口2公用************************************************************//* UCTL 串口控制寄存器*/#define PENA 0x80 /*校验允许位*/#define PEV 0x40 /*偶校验为0时为奇校验*/#define SPB 0x20 /*停止位为2 为0时停止位为1*/#define CHAR 0x10 /*数据位为8位为0时数据位为7位*/#define LISTEN 0x08 /*自环模式(发数据同时在把发的数据接收回来)*/#define SYNC 0x04 /*同步模式为0异步模式*/#define MM 0x02 /*为1时地址位多机协议(异步) 主机模式(同步);为0时线路空闲多机协议(异步) 从机模式(同步)*/#define SWRST 0x01 /*控制位*//* UTCTL 串口发送控制寄存器*/#define CKPH 0x80 /*时钟相位控制位(只同步方式用)为1时时钟UCLK延时半个周期*/#define CKPL 0x40 /*时钟极性控制位为1时异步与UCLK相反;同步下降延有效*/#define SSEL1 0x20 /*时钟源选择位:与SSEL0组合为0,1,2,3四种方式*/#define SSEL0 0x10 /*"0"选择外部时钟,"1"选择辅助时钟,"2","3"选择系统子时钟*/#define URXSE 0x08 /*接收触发延控制位(只在异步方式下用)*/#define TXWAKE 0x04 /*多处理器通信传送控制位(只在异步方式下用)*/#define STC 0x02 /*外部引脚STE选择位为0时为4线模式为1时为3线模式*/#define TXEPT 0x01 /*发送器空标志*//* URCTL 串口接收控制寄存器同步模式下只用两位:FE和OE*/#define FE 0x80 /*帧错标志*/#define PE 0x40 /*校验错标志位*/#define OE 0x20 /*溢出标志位*/#define BRK 0x10 /*打断检测位*/#define URXEIE 0x08 /*接收出错中断允许位*/#define URXWIE 0x04 /*接收唤醒中断允许位*/#define RXWAKE 0x02 /*接收唤醒检测位*/#define RXERR 0x01 /*接收错误标志位*//************************************************************* USART 0 串口0寄存器定义************************************************************/#define U0CTL_ 0x0070 /* 串口0基本控制寄存器*/sfrb U0CTL = U0CTL_;#define U0TCTL_ 0x0071 /* 串口0发送控制寄存器*/ sfrb U0TCTL = U0TCTL_;#define U0RCTL_ 0x0072 /* 串口0接收控制寄存器*/ sfrb U0RCTL = U0RCTL_;#define U0MCTL_ 0x0073 /* 波特率调整寄存器*/sfrb U0MCTL = U0MCTL_;#define U0BR0_ 0x0074 /* 波特率选择寄存器0 */sfrb U0BR0 = U0BR0_;#define U0BR1_ 0x0075 /* 波特率选择寄存器1 */sfrb U0BR1 = U0BR1_;#define U0RXBUF_ 0x0076 /* 接收缓存寄存器*/const sfrb U0RXBUF = U0RXBUF_;#define U0TXBUF_ 0x0077 /* 发送缓存寄存器*/sfrb U0TXBUF = U0TXBUF_;/* 改变的寄存器名定义*/#define UCTL0_ 0x0070 /* UART 0 Control */sfrb UCTL0 = UCTL0_;#define UTCTL0_ 0x0071 /* UART 0 Transmit Control */ sfrb UTCTL0 = UTCTL0_;#define URCTL0_ 0x0072 /* UART 0 Receive Control */sfrb URCTL0 = URCTL0_;#define UMCTL0_ 0x0073 /* UART 0 Modulation Control */ sfrb UMCTL0 = UMCTL0_;#define UBR00_ 0x0074 /* UART 0 Baud Rate 0 */sfrb UBR00 = UBR00_;#define UBR10_ 0x0075 /* UART 0 Baud Rate 1 */sfrb UBR10 = UBR10_;#define RXBUF0_ 0x0076 /* UART 0 Receive Buffer */ const sfrb RXBUF0 = RXBUF0_;#define TXBUF0_ 0x0077 /* UART 0 Transmit Buffer */sfrb TXBUF0 = TXBUF0_;#define UCTL_0_ 0x0070 /* UART 0 Control */sfrb UCTL_0 = UCTL_0_;#define UTCTL_0_ 0x0071 /* UART 0 Transmit Control */ sfrb UTCTL_0 = UTCTL_0_;#define URCTL_0_ 0x0072 /* UART 0 Receive Control */ sfrb URCTL_0 = URCTL_0_;#define UMCTL_0_ 0x0073 /* UART 0 Modulation Control */ sfrb UMCTL_0 = UMCTL_0_;#define UBR0_0_ 0x0074 /* UART 0 Baud Rate 0 */sfrb UBR0_0 = UBR0_0_;sfrb UBR1_0 = UBR1_0_;#define RXBUF_0_ 0x0076 /* UART 0 Receive Buffer */const sfrb RXBUF_0 = RXBUF_0_;#define TXBUF_0_ 0x0077 /* UART 0 Transmit Buffer */sfrb TXBUF_0 = TXBUF_0_;/************************************************************ * USART 1 串口1寄存器定义************************************************************/#define U1CTL_ 0x0078 /* 串口1基本控制寄存器*/sfrb U1CTL = U1CTL_;#define U1TCTL_ 0x0079 /* 串口1发送控制寄存器*/sfrb U1TCTL = U1TCTL_;#define U1RCTL_ 0x007A /* 串口1接收控制寄存器*/sfrb U1RCTL = U1RCTL_;#define U1MCTL_ 0x007B /* 波特率调整控制寄存器*/sfrb U1MCTL = U1MCTL_;#define U1BR0_ 0x007C /* 波特率选择寄存器0 */sfrb U1BR0 = U1BR0_;#define U1BR1_ 0x007D /* 波特率选择寄存器1 */sfrb U1BR1 = U1BR1_;#define U1RXBUF_ 0x007E /* 接收缓存*/const sfrb U1RXBUF = U1RXBUF_;#define U1TXBUF_ 0x007F /* 发送缓存*/sfrb U1TXBUF = U1TXBUF_;/* 改变的寄存器名定义*/#define UCTL1_ 0x0078 /* UART 1 Control */sfrb UCTL1 = UCTL1_;#define UTCTL1_ 0x0079 /* UART 1 Transmit Control */sfrb UTCTL1 = UTCTL1_;#define URCTL1_ 0x007A /* UART 1 Receive Control */sfrb URCTL1 = URCTL1_;#define UMCTL1_ 0x007B /* UART 1 Modulation Control */sfrb UMCTL1 = UMCTL1_;#define UBR01_ 0x007C /* UART 1 Baud Rate 0 */sfrb UBR01 = UBR01_;#define UBR11_ 0x007D /* UART 1 Baud Rate 1 */sfrb UBR11 = UBR11_;#define RXBUF1_ 0x007E /* UART 1 Receive Buffer */const sfrb RXBUF1 = RXBUF1_;sfrb TXBUF1 = TXBUF1_;#define UCTL_1_ 0x0078 /* UART 1 Control */sfrb UCTL_1 = UCTL_1_;#define UTCTL_1_ 0x0079 /* UART 1 Transmit Control */sfrb UTCTL_1 = UTCTL_1_;#define URCTL_1_ 0x007A /* UART 1 Receive Control */sfrb URCTL_1 = URCTL_1_;#define UMCTL_1_ 0x007B /* UART 1 Modulation Control */sfrb UMCTL_1 = UMCTL_1_;#define UBR0_1_ 0x007C /* UART 1 Baud Rate 0 */sfrb UBR0_1 = UBR0_1_;#define UBR1_1_ 0x007D /* UART 1 Baud Rate 1 */sfrb UBR1_1 = UBR1_1_;#define RXBUF_1_ 0x007E /* UART 1 Receive Buffer */const sfrb RXBUF_1 = RXBUF_1_;#define TXBUF_1_ 0x007F /* UART 1 Transmit Buffer */sfrb TXBUF_1 = TXBUF_1_;/************************************************************ * Timer A 定时器A寄存器定义************************************************************/#define TAIV_ 0x012E /* Timer A 中断向量寄存器*/sfrw TAIV = TAIV_;#define TACTL_ 0x0160 /* Timer A 控制寄存器*/sfrw TACTL = TACTL_;#define TACCTL0_ 0x0162 /* Timer A 捕获/比较控制寄存器0 */sfrw TACCTL0 = TACCTL0_;#define TACCTL1_ 0x0164 /* Timer A 捕获/比较控制寄存器1 */sfrw TACCTL1 = TACCTL1_;#define TACCTL2_ 0x0166 /* Timer A 捕获/比较控制寄存器2 */sfrw TACCTL2 = TACCTL2_;#define TAR_ 0x0170 /* Timer A 16位计数器内容*/sfrw TAR = TAR_;#define TACCR0_ 0x0172 /* Timer A 捕获/比较寄存器0 */sfrw TACCR0 = TACCR0_;#define TACCR1_ 0x0174 /* Timer A 捕获/比较寄存器1 */sfrw TACCR1 = TACCR1_;#define TACCR2_ 0x0176 /* Timer A 捕获/比较寄存器2 */sfrw TACCR2 = TACCR2_;/* 改变的寄存器名定义*/#define CCTL0_ 0x0162 /* Timer A Capture/Compare Control 0 */ sfrw CCTL0 = CCTL0_;#define CCTL1_ 0x0164 /* Timer A Capture/Compare Control 1 */ sfrw CCTL1 = CCTL1_;#define CCTL2_ 0x0166 /* Timer A Capture/Compare Control 2 */ sfrw CCTL2 = CCTL2_;#define CCR0_ 0x0172 /* Timer A Capture/Compare 0 */sfrw CCR0 = CCR0_;#define CCR1_ 0x0174 /* Timer A Capture/Compare 1 */sfrw CCR1 = CCR1_;#define CCR2_ 0x0176 /* Timer A Capture/Compare 2 */sfrw CCR2 = CCR2_;/*TACTL 控制寄存器16个位寄存器定义*/#define TASSEL2 0x0400 /* 未用*/#define TASSEL1 0x0200 /* 时钟输入源控制位1 */#define TASSEL0 0x0100 /* 时钟输入源控制位0 */#define ID1 0x0080 /* 分频系数选择位1 */#define ID0 0x0040 /* 分频系数选择位0 */#define MC1 0x0020 /* 计数模式控制位1 */#define MC0 0x0010 /* 计数模式控制位0 */#define TACLR 0x0004 /* 置1位清除定时器*/#define TAIE 0x0002 /* 定时器中断允许*/#define TAIFG 0x0001 /* 定时器中断标志*/#define MC_0 00*0x10 /* 停止模式*/#define MC_1 01*0x10 /* 增计数模式*/#define MC_2 02*0x10 /* 连续计数模式*/#define MC_3 03*0x10 /* 增/减计数模式*/#define ID_0 00*0x40 /* 直通*/#define ID_1 01*0x40 /* 2分频*/#define ID_2 02*0x40 /* 4分频*/#define ID_3 03*0x40 /* 8分频*/#define TASSEL_0 00*0x100 /* 时钟源为TACLK */#define TASSEL_1 01*0x100 /* 时钟源为ACLK */#define TASSEL_2 02*0x100 /* 时钟源为SMCLK */#define TASSEL_3 03*0x100 /* 时钟源为INCLK *//* Timer A ,Timer B 可公用捕获/比较控制寄存器X */#define CM1 0x8000 /* 捕获模式选择位1 */#define CM0 0x4000 /* 捕获模式选择位0 */#define CCIS1 0x2000 /* 捕获输入信号源选择位1 */#define CCIS0 0x1000 /* 捕获输入信号源选择位0 */#define SCS 0x0800 /* 信号同步位0:异步捕获;1:同步捕获*/#define SCCI 0x0400 /* 锁存输入信号*/#define CAP 0x0100 /* 模式选择: 0:比较模式;1:捕获模式*/#define OUTMOD2 0x0080 /* 输出模式选择位2 */#define OUTMOD1 0x0040 /* 输出模式选择位1 */#define OUTMOD0 0x0020 /* 输出模式选择位0 */#define CCIE 0x0010 /* 中断允许位*/#define CCI 0x0008 /* 读出输入信号源位ccis0\1 */#define OUT 0x0004 /* 输出信号(选择输出模式0) */#define COV 0x0002 /* 捕获溢出标志*/#define CCIFG 0x0001 /* 中断标志*/#define OUTMOD_0 0*0x20 /* 输出模式*/#define OUTMOD_1 1*0x20 /* 置位模式*/#define OUTMOD_2 2*0x20 /* 翻转/复位模式*/#define OUTMOD_3 3*0x20 /* 置位/复位模式*/#define OUTMOD_4 4*0x20 /* 翻转模式*/#define OUTMOD_5 5*0x20 /* 复位模式*/#define OUTMOD_6 6*0x20 /* 翻转/置位模式*/#define OUTMOD_7 7*0x20 /* 复位/置位模式*/#define CCIS_0 0*0x1000 /* 选择CCIXA为捕获事件的输入信号源*/#define CCIS_1 1*0x1000 /* 选择CCIXB为捕获事件的输入信号源*/#define CCIS_2 2*0x1000 /* 选择GND为捕获事件的输入信号源*/#define CCIS_3 3*0x1000 /* 选择VCC为捕获事件的输入信号源*/#define CM_0 0*0x4000 /* 禁止捕获模式*/#define CM_1 1*0x4000 /* 上升延捕获模式*/#define CM_2 2*0x4000 /* 下降沿捕获模式*/#define CM_3 3*0x4000 /* 上升沿和下降沿都捕获模式*//************************************************************ * Timer B 定时器B寄存器定义************************************************************/#define TBIV_ 0x011E /* 中断向量寄存器:BIT1-BIT3有效*/sfrw TBIV = TBIV_;#define TBCTL_ 0x0180 /* 定时器B控制寄存器:全部控制都集中在这*/ sfrw TBCTL = TBCTL_;#define TBCCTL0_ 0x0182 /* 定时器B捕获/比较控制寄存器0*/sfrw TBCCTL0 = TBCCTL0_;#define TBCCTL1_ 0x0184 /* 定时器B捕获/比较控制寄存器1 */sfrw TBCCTL1 = TBCCTL1_;#define TBCCTL2_ 0x0186 /* 定时器B捕获/比较控制寄存器2 */sfrw TBCCTL2 = TBCCTL2_;#define TBCCTL3_ 0x0188 /* 定时器B捕获/比较控制寄存器3 */sfrw TBCCTL3 = TBCCTL3_;#define TBCCTL4_ 0x018A /* 定时器B捕获/比较控制寄存器4 */sfrw TBCCTL4 = TBCCTL4_;#define TBCCTL5_ 0x018C /* 定时器B捕获/比较控制寄存器5 */sfrw TBCCTL5 = TBCCTL5_;#define TBCCTL6_ 0x018E /* 定时器B捕获/比较控制寄存器6 */sfrw TBCCTL6 = TBCCTL6_;#define TBR_ 0x0190 /* 计数器*/sfrw TBR = TBR_;#define TBCCR0_ 0x0192 /* 定时器B捕获/比较寄存器0 */sfrw TBCCR0 = TBCCR0_;#define TBCCR1_ 0x0194 /* 定时器B捕获/比较寄存器1 */sfrw TBCCR1 = TBCCR1_;#define TBCCR2_ 0x0196 /* 定时器B捕获/比较寄存器2 */sfrw TBCCR2 = TBCCR2_;#define TBCCR3_ 0x0198 /* 定时器B捕获/比较寄存器3 */sfrw TBCCR3 = TBCCR3_;#define TBCCR4_ 0x019A /* 定时器B捕获/比较寄存器4 */sfrw TBCCR4 = TBCCR4_;#define TBCCR5_ 0x019C /* 定时器B捕获/比较寄存器5 */sfrw TBCCR5 = TBCCR5_;#define TBCCR6_ 0x019E /* 定时器B捕获/比较寄存器6 */sfrw TBCCR6 = TBCCR6_;/* 定时器B控制寄存器:全部控制都集中在这*/#define SHR1 0x4000 /* 装载比较锁存器控制位1 :受TBCCTLx中的CCLDx位控制*/#define SHR0 0x2000 /* 装载比较锁存器控制位0 :受TBCCTLx中的CCLDx位控制*/#define TBCLGRP1 0x4000 /* 装载比较锁存器控制位1 :受TBCCTLx中的CCLDx位控制*/ #define TBCLGRP0 0x2000 /* 装载比较锁存器控制位0 :受TBCCTLx中的CCLDx位控制*/ #define CNTL1 0x1000 /* 定时器位数长度控制位1 */#define CNTL0 0x0800 /* 定时器位数长度控制位0 */#define TBSSEL2 0x0400 /* 未用*/#define TBSSEL1 0x0200 /* 时钟输入源控制位1 */#define TBSSEL0 0x0100 /* 时钟输入源控制位0 */#define TBCLR 0x0004 /* 置1清除定时器*/#define TBIE 0x0002 /* 中断允许*/#define TBIFG 0x0001 /* 中断标志*/#define TBSSEL_0 0*0x0100 /* 时钟源为:TBCLK */#define TBSSEL_1 1*0x0100 /* 时钟源为: ACLK */#define TBSSEL_2 2*0x0100 /* 时钟源为:SMCLK */#define TBSSEL_3 3*0x0100 /* 时钟源为:INCLK */#define CNTL_0 0*0x0800 /* 16 位计数模式*/#define CNTL_1 1*0x0800 /* 12 位计数模式*/#define CNTL_2 2*0x0800 /* 10 位计数模式*/#define CNTL_3 3*0x0800 /* 8 位计数模式*/#define SHR_0 0*0x2000 /* 单独装载(初始值) */#define SHR_1 1*0x2000 /* 分三组装载: 1 - 3 groups (1-2, 3-4, 5-6) */#define SHR_2 2*0x2000 /* 分二组装载: 2 - 2 groups (1-3, 4-6)*/#define SHR_3 3*0x2000 /* 不分组装载: 3 - 1 group (all) */#define TBCLGRP_0 0*0x2000 /* 单独装载(初始值) */#define TBCLGRP_1 1*0x2000 /* 分三组装载: 1 - 3 groups (1-2, 3-4, 5-6) */#define TBCLGRP_2 2*0x2000 /* 分二组装载: 2 - 2 groups (1-3, 4-6)*/#define TBCLGRP_3 3*0x2000 /* 不分组装载: 3 - 1 group (all) *//* Additional Timer B Control Register bits are defined in Timer A */#define SLSHR1 0x0400 /* Compare latch load source 1 */#define SLSHR0 0x0200 /* Compare latch load source 0 */#define CLLD1 0x0400 /* 定义比较锁存器TBCLx的装载方式控制位1 */#define CLLD0 0x0200 /* 定义比较锁存器TBCLx的装载方式控制位0 */#define SLSHR_0 0*0x0200 /* 立即装载*/#define SLSHR_1 1*0x0200 /* TBR 计数到0时装载*/#define SLSHR_2 2*0x0200 /* 在增减模式下,计数到TBCLx或0时装载; 在连续计数模式下,计数到0时装载*/#define SLSHR_3 3*0x0200 /* 当计数到TBCL0时装载*/#define CLLD_0 0*0x0200 /* 立即装载*/#define CLLD_1 1*0x0200 /* TBR 计数到0时装载*/#define CLLD_2 2*0x0200 /* 在增减模式下,计数到TBCLx或0时装载; 在连续计数模式下,计数到0时装载*/#define CLLD_3 3*0x0200 /* 当计数到TBCL0时装载*//************************************************************* Basic Clock Module************************************************************/#define DCOCTL_ 0x0056 /* DCO 时钟频率控制寄存器:复位后的值位060h*/sfrb DCOCTL = DCOCTL_;#define BCSCTL1_ 0x0057 /* 系统时钟控制寄存器1 :复位后的值位084h*/sfrb BCSCTL1 = BCSCTL1_;#define BCSCTL2_ 0x0058 /* 系统时钟控制寄存器2 :复位后的值位000h*/sfrb BCSCTL2 = BCSCTL2_;/* DCO 时钟频率控制寄存器*/#define MOD0 0x01 /* DCO插入周期控制位0 */#define MOD1 0x02 /* DCO插入周期控制位1 */#define MOD2 0x04 /* DCO插入周期控制位2 */#define MOD3 0x08 /* DCO插入周期控制位3 */#define MOD4 0x10 /* DCO插入周期控制位4 */#define DCO0 0x20 /* 8种频率控制位0 */#define DCO1 0x40 /* 8种频率控制位1 */#define DCO2 0x80 /* 8种频率控制位2 *//* 系统时钟控制寄存器1 :复位后的值位084h*/#define RSEL0 0x01 /* 选择内部电阻控制位0 */#define RSEL1 0x02 /* 选择内部电阻控制位1 */#define RSEL2 0x04 /* 选择内部电阻控制位2 */#define XT5V 0x08 /* 必须为0*/#define DIVA0 0x10 /* ACLK分频系数控制位0*/#define DIVA1 0x20 /* ACLK分频系数控制位1 */#define XTS 0x40 /* LFXT1工作模式控制位0:低频模式. / 1: 高频模式. */ #define XT2OFF 0x80 /* XT2CLK 使能控制位0:开启; 1:关闭*/#define DIVA_0 0x00 /* ACLK分频系数为: 1 */#define DIVA_1 0x10 /* ACLK分频系数为: 2 */#define DIVA_2 0x20 /* ACLK分频系数为: 4 */#define DIVA_3 0x30 /* ACLK分频系数为: 8 *//* 系统时钟控制寄存器2 :复位后的值位000h*/#define DCOR 0x01 /* 内外电阻选择控制位*/#define DIVS0 0x02 /* SMCLK分频控制位0*/#define DIVS1 0x04 /* SMCLK分频控制位1 */#define SELS 0x08 /* SMCLK 时钟源选择位t 0COCLK / 1:XT2CLK/LFXTCLK */ #define DIVM0 0x10 /* MCLK分频控制位0 */#define DIVM1 0x20 /* MCLK分频控制位1 */#define SELM0 0x40 /* MCLK 时钟输入源选择位0 */#define SELM1 0x80 /* MCLK 时钟输入源选择位1 */#define DIVS_0 0x00 /* SMCLK 分频系数为: 1 */#define DIVS_1 0x02 /* SMCLK 分频系数为: 2 */#define DIVS_2 0x04 /* SMCLK 分频系数为: 4 */#define DIVS_3 0x06 /* SMCLK 分频系数为: 8 */#define DIVM_0 0x00 /* MCLK 分频系数为: 1 */#define DIVM_1 0x10 /* MCLK 分频系数为: 2 */#define DIVM_2 0x20 /* MCLK 分频系数为: 4 */#define DIVM_3 0x30 /* MCLK 分频系数为: 8 */#define SELM_0 0x00 /* MCLK 时钟输入源: DCOCLK */#define SELM_1 0x40 /* MCLK 时钟输入源: DCOCLK */#define SELM_2 0x80 /* MCLK 时钟输入源: XT2CLK/LFXTCLK */#define SELM_3 0xC0 /* MCLK 时钟输入源: LFXTCLK *//************************************************************* * Flash Memory FLASH操作寄存器定义*************************************************************/#define FCTL1_ 0x0128 /* FLASH控制寄存器1:控制编程、擦除*/sfrw FCTL1 = FCTL1_;#define FCTL2_ 0x012A /* FLASH 控制寄存器2 :控制时钟分频*/sfrw FCTL2 = FCTL2_;#define FCTL3_ 0x012C /* FLASH 控制寄存器3:状态标志*/sfrw FCTL3 = FCTL3_;#define FRKEY 0x9600 /* 读FLASH 密码*/#define FWKEY 0xA500 /* 写FLASH 密码*/#define FXKEY 0x3300 /* for use with XOR instruction *//* FLASH控制寄存器1:控制编程、擦除*/#define ERASE 0x0002 /* 擦除段使能*/#define MERAS 0x0004 /* 主存擦除使能*/#define WRT 0x0040 /* 编程使能*/#define BLKWRT 0x0080 /* 段编程使能*//* FLASH 控制寄存器2 :控制时钟分频*/#define FN_0 0x0000 /*直通*/#define FN_1 0x0001 /*2分频*/#define FN_2 0x0002 /*3分频*/#define FN_3 0x0003 /*4分频*/#define FN_4 0x0004 /*5分频*/#define FN_5 0x0005 /*6分频*/#define FN_6 0x0006 /*7分频*/#define FN_7 0x0007 /*8分频*/#define FN_8 0x0008 /*9分频*/#define FN_9 0x0009 /*10分频*/#define FN_10 0x000A /*11分频*/#define FN_11 0x000B /*12分频*/#define FN_12 0x000C /*13分频*/#define FN_13 0x000D /*14分频*/#define FN_14 0x000E /*15分频*/#define FN_15 0x000F /*16分频*/#define FN_16 0x0010 /*17分频*/#define FN_17 0x0011 /*18分频*/#define FN_18 0x0012 /*19分频*/#define FN_19 0x0013 /*20分频*/#define FN_20 0x0014 /*21分频*/#define FN_21 0x0015 /*22分频*/#define FN_22 0x0016 /*23分频*/#define FN_23 0x0017 /*24分频*/#define FN_24 0x0018 /*25分频*/#define FN_25 0x0019 /*26分频*/#define FN_26 0x001A /*27分频*/#define FN_27 0x001B /*28分频*/#define FN_28 0x001C /*29分频*/#define FN_29 0x001D /*30分频*/#define FN_30 0x001E /*31分频*/#define FN_31 0x001F /*32分频*/#define FN_32 0x0020 /*33分频*/#define FN_33 0x0021 /*34分频*/#define FN_34 0x0022 /*35分频*/#define FN_35 0x0023 /*36分频*/#define FN_36 0x0024 /*37分频*/#define FN_37 0x0025 /*38分频*/#define FN_38 0x0026 /*39分频*/#define FN_39 0x0027 /*40分频*/#define FN_40 0x0028 /*41分频*/#define FN_41 0x0029 /*42分频*/#define FN_42 0x002A /*43分频*/#define FN_43 0x002B /*44分频*/#define FN_44 0x002C /*45分频*/#define FN_45 0x002D /*46分频*/#define FN_46 0x002E /*47分频*/#define FN_47 0x002F /*48分频*/#define FN_48 0x0030 /*49分频*/#define FN_49 0x0031 /*50分频*/#define FN_50 0x0032 /*51分频*/#define FN_51 0x0033 /*52分频*/#define FN_52 0x0034 /*53分频*/#define FN_53 0x0035 /*54分频*/#define FN_54 0x0036 /*55分频*/#define FN_55 0x0037 /*56分频*/#define FN_56 0x0038 /*57分频*/#define FN_57 0x0039 /*58分频*/#define FN_58 0x003A /*59分频*/#define FN_59 0x003B /*60分频*/#define FN_60 0x003C /*61分频*/#define FN_61 0x003D /*62分频*/#define FN_62 0x003E /*63分频*/#define FN_63 0x003F /*64分频*/#define FSSEL_0 0x0000 /* Flash时钟选择: ACLK */ #define FSSEL_1 0x0040 /* Flash时钟选择: MCLK */ #define FSSEL_2 0x0080 /* Flash时钟选择: SMCLK */ #define FSSEL_3 0x00C0 /* Flash时钟选择: SMCLK */ /* FLASH 控制寄存器3:状态标志*/#define BUSY 0x0001 /* Flash忙标志*/#define KEYV 0x0002 /* Flash安全键值出错标志*/#define ACCVIFG 0x0004 /* Flash非法访问中断标志*/#define WAIT 0x0008 /* 等待指示信号位*/#define LOCK 0x0010 /* 锁定位*/#define EMEX 0x0020 /* 紧急退出位*//************************************************************ * Comparator A 比较器A寄存器定义************************************************************/#define CACTL1_ 0x0059 /* 比较器A控制寄存器1 */sfrb CACTL1 = CACTL1_;#define CACTL2_ 0x005A /* 比较器A控制寄存器2 */sfrb CACTL2 = CACTL2_;#define CAPD_ 0x005B /*比较器A端口禁止寄存器*/sfrb CAPD = CAPD_;/* 比较器A控制寄存器1 */#define CAIFG 0x01 /*比较器A中断标志*/#define CAIE 0x02 /* 比较器A中断使能*/#define CAIES 0x04 /* 比较器A中断边沿触发选择0:上升延1:下降延*/ #define CAON 0x08 /* 比较器电源开关*/#define CAREF0 0x10 /* 选择参考源位0 */#define CAREF1 0x20 /* 选择参考源位1 */#define CARSEL 0x40 /* 选择内部参考源加到比较器的正端或负端*/#define CAEX 0x80 /* 交换比较器的输入端*/#define CAREF_0 0x00 /* 选择参考源0 : Off 使用外部参考源*/#define CAREF_1 0x10 /* 选择参考源1 : 0.25*Vcc为参考源*/#define CAREF_2 0x20 /* 选择参考源2 : 0.5*Vcc为参考源*/#define CAREF_3 0x30 /* 选择参考源3 : Vt*//* 比较器A控制寄存器2 */#define CAOUT 0x01 /* 比较器输出*/#define CAF 0x02 /* 选择比较器是否经过RC低通滤波器*/#define P2CA0 0x04 /* 外部引脚信号连接到比较器A的CA0 */#define P2CA1 0x08 /* 外部引脚信号连接到比较器A的CA1 */#define CACTL24 0x10#define CACTL25 0x20#define CACTL26 0x40#define CACTL27 0x80#define CAPD0 0x01 /* Comp. A Disable Input Buffer of Port Register .0 */#define CAPD1 0x02 /* Comp. A Disable Input Buffer of Port Register .1 */#define CAPD2 0x04 /* Comp. A Disable Input Buffer of Port Register .2 */#define CAPD3 0x08 /* Comp. A Disable Input Buffer of Port Register .3 */#define CAPD4 0x10 /* Comp. A Disable Input Buffer of Port Register .4 */#define CAPD5 0x20 /* Comp. A Disable Input Buffer of Port Register .5 */#define CAPD6 0x40 /* Comp. A Disable Input Buffer of Port Register .6 */#define CAPD7 0x80 /* Comp. A Disable Input Buffer of Port Register .7 *//************************************************************* ADC12 A/D采样寄存器定义************************************************************//*ADC12转换控制类寄存器*/#define ADC12CTL0_ 0x0;' /* ADC12 Control 0 */sfrw ADC12CTL0 = ADC12CTL0_;#define ADC12CTL1_ 0x01A2 /* ADC12 Control 1 */sfrw ADC12CTL1 = ADC12CTL1_;/*ADC12中断控制类寄存器*/#define ADC12IFG_ 0x01A4 /* ADC12 Interrupt Flag */sfrw ADC12IFG = ADC12IFG_;#define ADC12IE_ 0x01A6 /* ADC12 Interrupt Enable */sfrw ADC12IE = ADC12IE_;#define ADC12IV_ 0x01A8 /* ADC12 Interrupt Vector Word */sfrw ADC12IV = ADC12IV_;/*ADC12存贮器类寄存器*/#define ADC12MEM_ 0x0140 /* ADC12 Conversion Memory */#ifndef __IAR_SYSTEMS_ICC#define ADC12MEM ADC12MEM_ /* ADC12 Conversion Memory (for assembler) */ #else#define ADC12MEM ((int*) ADC12MEM_) /* ADC12 Conversion Memory (for C) */ #endif#define ADC12MEM0_ ADC12MEM_ /* ADC12 Conversion Memory 0 */sfrw ADC12MEM0 = ADC12MEM0_;#define ADC12MEM1_ 0x0142 /* ADC12 Conversion Memory 1 */sfrw ADC12MEM1 = ADC12MEM1_;#define ADC12MEM2_ 0x0144 /* ADC12 Conversion Memory 2 */sfrw ADC12MEM2 = ADC12MEM2_;#define ADC12MEM3_ 0x0146 /* ADC12 Conversion Memory 3 */sfrw ADC12MEM3 = ADC12MEM3_;#define ADC12MEM4_ 0x0148 /* ADC12 Conversion Memory 4 */sfrw ADC12MEM4 = ADC12MEM4_;#define ADC12MEM5_ 0x014A /* ADC12 Conversion Memory 5 */sfrw ADC12MEM5 = ADC12MEM5_;#define ADC12MEM6_ 0x014C /* ADC12 Conversion Memory 6 */sfrw ADC12MEM6 = ADC12MEM6_;#define ADC12MEM7_ 0x014E /* ADC12 Conversion Memory 7 */。
MSP430汇编指令集1000字MSP430是单片机系列的一种,其指令集为精简指令集(RISC)风格。
下面列出了MSP430汇编指令集的大致分类和一些具体指令,主要参考了TI官方的MSP430 Architecture Guide。
一、数据传送指令:1. MOV:将源操作数复制到目的操作数中;2. LPM:从程序存储器读取指定地址中的内容;3. SWPB:交换操作数(低字节和高字节互换)。
二、算术指令:1. ADD:将两个操作数相加并将结果存储到目的操作数中;2. SUB:将两个操作数相减并将结果存储到目的操作数中;3. INC:将操作数加1并将结果存在目的操作数中;4. DEC:将操作数减1并将结果存在目的操作数中;5. DADD:带进位加法;6. CMP:比较两个操作数,并将结果存储到程序状态字寄存器中。
三、逻辑指令:1. AND:将两个操作数进行按位与操作,并将结果存储到目的操作数中;2. OR:将两个操作数进行按位或操作,并将结果存储到目的操作数中;3. XOR:将两个操作数进行按位异或操作,并将结果存储到目的操作数中;4. RRA:将操作数右移一位,并将最高位存储到溢出位(程序状态字寄存器)中。
四、移位指令:1. RLC:将操作数左移一位,并将最高位的值存储到溢出位中;2. RRC:将操作数右移一位,并将最低位的值存储到溢出位中;3. SWAP:低字节和高字节互换;4. SXT:将操作数的最高位扩展到目的操作数的所有高位。
五、跳转和分支指令:1. JMP:无条件跳转到指定地址;2. RET:从子程序中返回到调用程序;3. CLR:将操作数清零;4. TEST:测试操作数的值是否为0,是则跳转到指定地址;5. JZ:操作数为0则跳转到指定地址;6. JNZ:操作数不为0则跳转到指定地址;7. JAE:无符号数操作数小于或等于指定无符号数则跳转到指定地址;8. JBE:无符号数操作数大于或等于指定无符号数则跳转到指定地址。
Page 1 of 12MSP430F2系列16位超低功耗单片机模块原理第4章 Basic Clock + 基础时钟模块+版本: 1.4日期: 2007.6.原文: TI MSP430x2xxfamily.pdf翻译: 张超 哈尔滨理工大学编辑: DC 微控技术论坛版主注:以下文章是翻译TI MSP430x2xxfamily.pdf 文件中的部分内容。
由于我们翻译水平有限,有整理过程中难免有所不足或错误;所以以下内容只供参考.一切以原文为准。
详情请密切留意微控技术论坛。
第四章 基础时钟模块+4.1基础时钟模块+介绍基础时钟模块+支持低系统消耗和超低功耗。
采用三种片内时钟信号,用户可以选择合适的性能和低功耗。
基础时钟模块只需接一个外部电阻、一个或两个外部晶体、或者用振荡器,通过软件控制。
基础时钟模块+有4个时钟源:LFXT1CLK:由低频时钟晶体或外接32768Hz时钟源产生的低频/高频振荡器或由标准晶体、振荡器,或外部400KH z~16M Hz的外部时钟源提供。
XT2CLK:可供选择的高频振荡器,由标准晶体、振荡器,或外部400KH z~16M Hz的外部时钟源提供。
DCOCLK:片内可数字控制的振荡器。
VLOCLK:片内超低功耗、12KH z的低频振荡器。
基础时钟模块可提供的三种时钟信号:ACLK:辅助时钟。
ACLK由软件选择来自LFXT1CLK和VLOCLK之一的时钟信号。
ACLK 经1,2,4,8分频后得到。
ACLK可由软件选作各个外围模块。
MCLK:主时钟。
MCLK由软件选择来自LFXT1CLK,VLOCLK,XT2CLK(如果片内提供),DCOCLK之一的时钟信号。
MCLK由1,2,4,8分频得到。
MCLK用于CPU和系统。
SMCLK:子系统时钟。
SMCLK由软件选择来自LFXT1CLK,VLOCLK,XT2CLK(片内提供),DCOCLK之一的时钟信号。
SMCLK由1,2,4,8分频得到。
4)对应的SFR的中断位#define OFIFG 0x02#define OFIE 0x02九、SVSSVSCTL(0x0056) /* SVS Control */#define SVSFG (0x01) /* SVS Flag */#define SVSOP (0x02) /* SVS output (read only) */#define SVSON (0x04) /* Switches the SVS on/off */#define PORON (0x08) /* Enable POR Generation if Lo w Voltage */#define VLDON (0x10)#define VLDOFF (0x00)#define VLD_1_8V (0x10)十一、Timer A31)寄存器:TAIV (0x012E) 中断向量寄存器TACTL (0x0160) 控制寄存器CCTL0(0x0162) 捕获比较控制寄存器0CCTL1(0x0164) 捕获比较控制寄存器1CCTL2(0x0166) 捕获比较控制寄存器2TAR(0x0170) 寄存器CCR0(0x0172) 捕获比较寄存器0CCR1(0x0174) 捕获比较寄存器1CCR2(0x0176) 捕获比较寄存器22)TACTL中的各位SSEL1 SSEL0 输入信号TASSEL2 (0x0400) 未用0 0 TACLK(特定的外部信号)TASSEL1 (0x0200) 时钟选择0 1 ACLKTASSEL0 (0x0100) 时钟选择 1 0 MCLKID1 (0x0080) 输入信号分频:00 直通;01:2分频ID0 (0x0040) 与ID1一起:10 4分频11:8分频MC1 (0x0020) 两位一起:00 停止;01:增记数到CCR0;MC0 (0x0010) 模式控制:10 连续增记数,11 增记数到CCR0,减记数到0H;TACLR (0x0004) 定时器清除位TAIE (0x0002) 中断允许TAIFG (0x0001) 定时器溢出标志#define MC_0 (0*0x10u) /* Timer A mode control: 0 - Stop */#define MC_1 (1*0x10u) /* Timer A mode control: 1 - Up to C CR0 */#define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */#define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */ #define ID_0 (0*0x40u) /* Timer A input divider: 0 - /1 */#define ID_1 (1*0x40u) /* Timer A input divider: 1 - /2 */#define ID_2 (2*0x40u) /* Timer A input divider: 2 - /4 */#define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */#define TASSEL_0 (0*0x100u) /* Timer A clock source select: 0 - T ACLK */#define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */#define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */#define TASSEL_3 (3*0x100u) /* Timer A clock source select: 3 - INCLK */3)捕获比较控制寄存器CCTLX对应的位CM1 (0x8000) 00 禁止01 上升沿捕获CM0 (0x4000) 10 下降沿捕获11 上升沿与下降沿都捕获CCIS1 (0x2000) CCIS0和CCIS1输入选择00 选择CCIXA;CCIS0 (0x1000) 01 选择CCIXB,10 GND 11 VCC SCS (0x0800) 0异步捕获 1 同步捕获SCCI (0x0400) 捕获比较输入信号与比较输出EQUX同步CAP (0x0100) 0 比较模式 1 捕获模式OUTMOD2 (0x0080)OUTMOD1 (0x0040)OUTMOD0 (0x0020)CCIE (0x0010) 1 允许中断 0 禁止中断CCI (0x0008) 捕获/比较输入信号选择OUT (0x0004)COV (0x0002)CCIFG (0x0001) 中断标志(与CCRX有关)#define OUTMOD_0 (0*0x20u) /* PWM output mode: 0 - output only */ #define OUTMOD_1 (1*0x20u) /* PWM output mode: 1 - set */#define OUTMOD_2 (2*0x20u) /* PWM output mode: 2 - PWM toggle/re set */#define OUTMOD_3 (3*0x20u) /* PWM output mode: 3 - PWM set/reset */#define OUTMOD_4 (4*0x20u) /* PWM output mode: 4 - toggle */#define OUTMOD_5 (5*0x20u) /* PWM output mode: 5 - Reset */#define OUTMOD_6 (6*0x20u) /* PWM output mode: 6 - PWM toggle/ set */#define OUTMOD_7 (7*0x20u) /* PWM output mode: 7 - PWM reset/s et */#define CCIS_0 (0*0x1000u) /* Capture input select: 0 - CCIxA */ #define CCIS_1 (1*0x1000u) /* Capture input select: 1 - CCIxB */ #define CCIS_2 (2*0x1000u) /* Capture input select: 2 - GND */#define CCIS_3 (3*0x1000u) /* Capture input select: 3 - Vcc */#define CM_0 (0*0x4000u) /* Capture mode: 0 - disabled */#define FSSEL_2 (0x0080) /* Flash clock select: 2 - SMCLK */#define FSSEL_3 (0x00C0) /* Flash clock select: 3 - SMCLK */#define BUSY (0x0001) /* Flash busy: 1 */#define KEYV (0x0002) /* Flash Key violation flag */#define ACCVIFG (0x0004) /* Flash Access violation flag */#define WAIT (0x0008) /* Wait flag for segment write */#define LOCK (0x0010) /* Lock bit: 1 - Flash is locked (read onl y) */#define EMEX (0x0020) /* Flash Emergency Exit */十三、比较器#define CACTL1 (0x0059) /* Comparator A Control 1 */#define CACTL2 (0x005A) /* Comparator A Control 2 */#define CAPD (0x005B) /* Comparator A Port Disable */#define CAIFG (0x01) /* Comp. A Interrupt Flag */#define CAIE (0x02) /* Comp. A Interrupt Enable */#define CAIES (0x04) /* Comp. A Int. Edge Select: 0:rising / 1: falling */#define CAON (0x08) /* Comp. A enable */#define CAREF0 (0x10) /* Comp. A Internal Reference Select 0 */ #define CAREF1 (0x20) /* Comp. A Internal Reference Select 1 */ #define CARSEL (0x40) /* Comp. A Internal Reference Enable */ #define CAEX (0x80) /* Comp. A Exchange Inputs */#define CAREF_0 (0x00) /* Comp. A Int. Ref. Select 0 : Off */ #define CAREF_1 (0x10) /* Comp. A Int. Ref. Select 1 : 0.25*Vcc */ #define CAREF_2 (0x20) /* Comp. A Int. Ref. Select 2 : 0.5*Vcc */ #define CAREF_3 (0x30) /* Comp. A Int. Ref. Select 3 : Vt*/#define CAOUT (0x01) /* Comp. A Output */#define CAF (0x02) /* Comp. A Enable Output Filter */#define P2CA0 (0x04) /* Comp. A Connect External Signal to C A0 : 1 */#define P2CA1 (0x08) /* Comp. A Connect External Signal to C A1 : 1 */#define CACTL24 (0x10)#define CACTL25 (0x20)#define CACTL26 (0x40)#define CACTL27 (0x80)#define CAPD0 (0x01) /* Comp. A Disable Input Buffer of Port Register .0 */#define CAPD1 (0x02) /* Comp. A Disable Input Buffer of Port Register .1 */#define CAPD2 (0x04) /* Comp. A Disable Input Buffer of Port Register .2 */#define CAPD3 (0x08) /* Comp. A Disable Input Buffer of Port Register .3 */#define CAPD4 (0x10) /* Comp. A Disable Input Buffer of Port Register .4 */#define CAPD5 (0x20) /* Comp. A Disable Input Buffer of Port Register .5 */#define CAPD6 (0x40) /* Comp. A Disable Input Buffer of Port Register .6 */#define CAPD7 (0x80) /* Comp. A Disable Input Buffer of Port Register .7 */十四、中断向量#define BASICTIMER_VECTOR (0 * 2u) /* 0xFFE0 Basic Timer */#define PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */#define PORT1_VECTOR (4 * 2u) /* 0xFFE8 Port 1 */#define TIMERA1_VECTOR (5 * 2u) /* 0xFFEA Timer A CC1-2, TA */#define TIMERA0_VECTOR (6 * 2u) /* 0xFFEC Timer A CC0 */#define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */ #define COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */ #define NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maskable */#define RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priori ty] */。
MSP430按键程序范例(附原理图)#i ncludevoid Init_Port(void){//将P1口所有的管脚在初始化的时候设置为输入方式 P1DIR = 0; //将P1口所有的管脚设置为一般I/O口P1SEL = 0;// 将P1.4 P1.5 P1.6 P1.7设置为输出方向P1DIR |= BIT4;P1DIR |= BIT5;P1DIR |= BIT6;P1DIR |= BIT7;//先输出低电平P1OUT = 0x00;// 将中断寄存器清零P1IE = 0;P1IES = 0;P1IFG = 0;//打开管脚的中断功能//对应的管脚由高到低电平跳变使相应的标志置位P1IE |= BIT0;P1IES |= BIT0;P1IE |= BIT1;P1IES |= BIT1;P1IE |= BIT2;P1IES |= BIT2;P1IE |= BIT3;P1IES |= BIT3;_EINT();//打开中断return;}void Delay(void){int i;for(i = 100;i--;i > 0) ;//延时一点时间}int KeyProcess(void){int nP10,nP11,nP12,nP13;int nRes = 0;//P1.4输出低电平P1OUT &= ~(BIT4);nP10 = P1IN & BIT0;if (nP10 == 0) nRes = 13; nP11 = P1IN & BIT1; if (nP11 == 0) nRes = 14; nP12 = P1IN & BIT2; if (nP12 == 0) nRes = 15; nP13 = P1IN & BIT3; if (nP13 == 0) nRes = 16; //P1.5输出低电平P1OUT &= ~(BIT4);nP10 = P1IN & BIT0;if (nP10 == 0) nRes = 9; nP11 = P1IN & BIT1; if (nP11 == 0) nRes = 10; nP12 = P1IN & BIT2; if (nP12 == 0) nRes = 11; nP13 = P1IN & BIT3; if (nP13 == 0) nRes = 12; //P1.6输出低电平P1OUT &= ~(BIT4);nP10 = P1IN & BIT0;if (nP10 == 0) nRes = 5; nP11 = P1IN & BIT1; if (nP11 == 0) nRes = 6; nP12 = P1IN & BIT2; if (nP12 == 0) nRes = 7; nP13 = P1IN & BIT3; if (nP13 == 0) nRes = 8; //P1.7输出低电平P1OUT &= ~(BIT4);nP10 = P1IN & BIT0;if (nP10 == 0) nRes = 1; nP11 = P1IN & BIT1;if (nP11 == 0) nRes = 2; nP12 = P1IN & BIT2;if (nP12 == 0) nRes = 3; nP13 = P1IN & BIT3;if (nP13 == 0) nRes = 4; P1OUT = 0x00;//恢复以前值。