1第5章MSP430单片机片内外设及其应用主要内容5.1通用I/O端口5.2定时器5.3硬件乘法器5.4FLASH存储器5.5比较器A5.7通用串行通信模块的异步模式5.8通用串行通信模块的同步模式5.10模数转换模块25.1通用I/O端口在MSP430系统中,没有专门的输入/输出指令,输入输出操作都是通过数据传送指令来完成的。例如用指令MOVP1IN,R5表示读取P1端口内容,端口P1~P6都是按位寻址的,也就是说,端口每一位都可以独立用于输入/输出。3不管是灌电流还是拉电流,每个端口的输出晶体管都能限制输出电流(最大约6mA),以保证系统安全。45.1.2端口P1和P2端口P1和P2具有输入/输出、中断和外部模块功能,这些功能可以通过他们各自的7个控制寄存器的设置来实现。下面Px代表P1和P2。5(1)PxDIR输入/输出方向寄存器相互独立的8位分别定义了8个引脚的输入/输出方向。8位在PUC后都被复位。使用时先根据需要定义端口的方向以满足设计者要求。0:I/O引脚被切换成输入模式;1:I/O引脚被切换成输出模式。6(2)PxIN输入寄存器输入寄存器是CPU扫描I/O引脚信号的只读寄存器。通过读取该寄存器的内容获取I/O端口的输入信号。此时引脚的方向必须选定为输入。读出时,该引脚的方向寄存器必须设置为输入模式。7(3)PxOUT输出寄存器该寄存器为I/O端口的输出缓冲寄存器。其内容可以像操作内存数据一样写入,以达到改变I/O口状态的目的。在读取时输出缓存的内容与引脚方向定义无关。改变方向寄存器的内容,输出缓存的内容不受影响。8(4)PxIE中断使能寄存器该寄存器的各引脚都有一位用以控制该引脚是否允许中断,0:禁止该位中断;1:允许该位中断。9(5)PxIES中断触发沿选择寄存器如果允许Px口的某个引脚中断,还需定义该引脚的中断触发沿。该寄存器的8位分别定义了Px口的8个引脚的中断触发沿。0:上升沿使相应标志置位;1:下降沿使相应标志置位。10(6)PxIFG中断标志寄存器该寄存器有8个标志位,它们含有相应引脚是否有待处理中断的信息,即相应引脚是否有中断请求。如果Px的某个引脚允许中断,同时选择上升沿,则当该引脚发生电平由低向高跳变时,PxIFG的相应位就会置位,表明在该引脚上有中断事件发生。0:没有中断请求;1:有中断请求。11(7)PxSEL功能选择寄存器P1和P2两端口还有其他片内外设功能,考虑减少引脚,将这些功能与芯片外的联系通过复用P1和P2引脚的方式来实现。PxSEL用来选择引脚的I/O端口功能与外围模块功能。0:选择引脚为I/O端口;1:选择引脚为外围模块功能。125.1.3端口P3、P4、P5、P6这些端口没有中断能力,其余功能与P1和P2一样,能实现输入/输出功能和外围模块功能。每个端口有4个寄存器供用户使用。用户可通过这4个寄存器对他们进行访问和控制。每个端口的4个寄存器分别为:方向选择寄存器(PxDIR),输入寄存器(PxIN),输出寄存器(PxOUT)和功能选择寄存器。具体用法同P1、P2端口。135.1.5端口的应用端口是单片机中最经常使用的外设资源。一般在程序的初始化阶段对端口进行配置,配置时先配置功能选择寄存器PxSEL,若为IO端口功能则继续配置方向寄存器PxDIR,若为输入则继续配置中断使能寄存器PxIE,若允许中断则继续配置中断触发沿选择寄存器PxIES。需要注意的是P1、P2端口的中断为多源中断,即P1端口的8位共用一个中断向量(MSP430x14x系列为0FFF8H),P2端口的8位也共用一个中断向量(MSP430x14x系列为0FFF2H)。当Px(P1或P2)端口上的8个引脚中任何一个引脚有中断触发时,都会进入到同一个中断服务程序,在中断服务程序中,首先应该通过PxIFG判断是哪一个引脚触发的中断,再执行相应的程序,最后还要用软件清除相应的PxIFG标志位。14举例1使用软件定时周期性取反P2.1.#includemsp430x14x.hvoidmain(void){WDTCTL=WDTPW+WDTHOLD;//停止看门狗。P2DIR|=0x02;//P2.1设置为输出。for(;;){unsignedinti;P2OUT^=0x02;//取反P2.1/*软件延时*/i=50000;do(i--);while(i!=0);}}15举例2单片机在P3.1产生方波,并把P3.1与P1.7相连,P1.7接收中断,在中断服务程序中让P3.3产生方波。观察并思考:P3.3和P3.1输出方波的频率有什么关系?1617#includemsp430x14x.hvoidmain(void){WDTCTL=WDTPW+WDTHOLD;P3OUT=0x00;//P3引脚低电平P3DIR|=0xff;//P3方向输出P1DIR=0x00;P1IES=0x00;//上升沿触发P1IFG=0x00;//因为P1IES设置会使中断标志置位,故清零。P1IE|=0xff;//P1模块中断允许_EINT();//系统中断允许inti;for(;;){for(i=1;i=32000;i++);P3OUT^=0x02;//P3.1每隔8000个机器指令周期产生一次跳变}}#pragmavector=PORT1_VECTOR__interruptvoidP1_Interrupt(void){if(P1IFG==0x80)//如果P1.7中断{P1IFG=0x00;//中断标志清除P3OUT^=0x08;}//P3.3输出变化elseP1IFG=0x00;//非p1.7中断处理}18