华北科技学院毕业设计(论文)
端口P1,P2的功能可以通过它们的7个控制寄存器来实现。这里,Px代表P1或P2。 (1)PxDIR:输入/输出方向寄存器。 8位相互独立,可以分别定义8个引脚的输入/输出方向。8位再PUC后都被复位。使用输入/输出功能时,应该先定义端口的方向 。作为输入时只能读,作为输出时,可读可写。0:输入模式;1:输出模式。
(2)PXIN:输入寄存器,为只读寄存器。用户不能对它进行写入,只能通过读取其寄存器的内容来知道I/O口的输入信号。所以其引脚的方向要选为输入。如再键盘键盘扫描程序中经常要读取行线或者列线的端口寄存器值来判断案件情况。
(3)PXOUT:输出寄存器。该寄存器为I/O端口的输出缓冲寄存器,再读取时输出缓存的内容与引脚方向定义无关。改变方向寄存器的内容,输出缓存的内容不受影响。
(4)PXIFG:中断标志寄存器。他的8个标志位标志相应引脚是否有中断请求有待处理。0:无中断请求, 1:有中断请求。其中断标志分别为PXIFG.0~PXIFG.7。应该注意的是:PXIFG.0~PXIFG.7共用一个中断向量,为多源中断。当任一事件引起的中断进行处理时,PXIFG.0~PXIFG.7不会自动复位,必须由软件来判断是对哪一个事件,并将相应的标志复位。另外,外部中断事件的时间必须保持不低于1.5倍的MCLK时间,以保证中断请求被接受,且使相应中断标志位置位。
(5)PXIES:中断触发沿选择寄存器。如果允许PX口的某个引脚中断,还需定义该引脚的中断触发方式。0:上升沿触发使相应标志置位,1:下降沿触发相应标志置位。如:MOV.B #07H, &P1IES ;p1低3位下降沿触发中断。
(6)PXIE:中断使能寄存器。PX口的每一个引脚都有一位用以控制该引脚是否允许中断。0:禁止中断 ,1:允许中断。MOV.B #0E0H, &P2IE ;P2高3位允许中断。
(7)PXSEL:功能选择寄存器。P1,P2两端口还具有其他片内外设功能,将这些功能与芯片外的联系通过复用P1,P2引脚的方式来实现。PXSEL用来选择引脚的I/O端口功能与外围模块功能。0:选择引脚为I/O端口,1:选择引脚为外围模块功能。如:P1SEL|=0X10; //P1.4为外围模块功能。端口P3、P4、P5、P6没有中断能力,其余功能同PI,P2。除掉端口P1,P2与中断相关的3个寄存器,端口P3,P4,P5,P6的4个寄存器(用法同P1,P2)分别为PXDIR,PXIN,PXOUT,PXSEL可供用户使用
P口实验
利用P口的中断功能实验:
MAIN MOV #SFE(CSTACK),SP /*初始化堆栈指针*/
MOV #(WDTHOLD+WDTPW),&WDTCTL/*停看门狗定时器*/
第 21 页 共 77 页
婴儿室环境监测电路设计
LOOP2 BIS #GIE,SR /*普通中断允许*/ EINT /*开中断*/
MOV.B #000H,&P1DIR /*定义P1口为输入方向*/ MOV.B #000H,&P1SEL /*定义P1口为P端口功能*/ MOV.B #002H,&P1IE /*P1.1口为中断允许*/
MOV.B #000H,&P1IES /*定义P1.1口为上升沿产生中断*/ JMP LOOP2 /*循环等待中断*/ 下面为中断程序的测试
LOOP1 MOV.B #001H,&P1DIR /*定义P1.0口为输出口*/
MOV.B #001H,&P1OUT /*定义P1.0口输出的为高电平,发光二极管灯亮*/ MOV.B #000H,&P1IE /*返回中断前的PC及其他状态*/ MOV.B #000H,&P1OUT /*将P1.0口置低,发光二极管灯灭*/ RETI /*中断返回*/
COMMON INTVEC /*列中断向量表*/ ORG PORT1_VECTOR
DW LOOP1 /*中断向量的入口地址为LOOP1*/ END
实验结果为:在运行中,当给P1.1口一个高电平时,PC装入中断程序的地址LOOP1,进入中断程序段,P.0口被置高,此时发光二极管灯亮,两个指令周期之后灯灭,此后又返回中断前的地址开始执行,等待下一次中断的到来. 3.1.3 MSP430指令的介绍
MSP430 有自身 语言,汇编语言也不同于其他类型的单片机,伪指令也是变幻莫测,但又很重要,一般的写法需要注意的地方如下。
(1)、―#include‖ 不能大写。
(2)、程序段前的伪指令可以套用下列模板,在以后的几章中的程序都采用此模板,只是中间的主程序变化而已:
#include \把库文件包括进来 ,这个库文件是必须的,其他的库文件视需要而定*/
第 22 页 共 77 页
华北科技学院毕业设计(论文)
RSEG UDATA0/*定义数据段一般默认数据段段地址是从 0200H 开始的也可以自己定义数据段开始地址,但必须在 0200H 到 09FFH*/
DS 0/*表示数据段从默认的段开始,偏移地址为 0,若为 DS N,表示数据段的偏移地址从 N 开始,此时的物理地址为(0200+N)H*/
ADINPUT EQU 00200H /*将 0200H 地址命名为 ADINPUT,此后程序中的地址 0200H 可以用 ADINPUT 表示,便于程序的可读性,注意:标号必须顶格写*/
A DW 5H/*定义 A 字变量的值为 5H,此时将会将 5H 写到数据段的当前偏移地址上,便于后面使用,变量也得顶格写*/ RSEG CSTACK/*定义堆栈段*/
DS 0/*段偏移值为 0H,物理地址为默认开始地址值*/ RSEG CODE/*定义代码段 1*/ DS 0/*代码段 1*/
RESET/*标号,表示程序段的开始地址,将被写入复位向量中*/ MOV #SFE(CSTACK),SP/*初始化堆栈指针*/
MOV #(WDTHOLD+WDTPW),&WDTCTL/*停止看门狗定时器*/
COMMON INTVEC /*表示中断向量定义*/ /*下面的伪指令都不顶格*/ ORG XXX 1 / *XXX1 表示中断向量表中的具体的中断向量 1*/ DWYYY1 /*YYY 是中断程序入口标号,表示中断程序首地址*/ ORG XXX2 /* XXX2 表示中断向量表中的具体的中断向量 2/ DWYYY2 /*YYY2 是中断程序入口标号,表示中断程序首地址*/
ORG RESET_VECTOR /*复位向量,每个程序必须的,放在段开始前的伪指令中*/ DWRESET /*程序开始的地址标号*/ END /*程序结束*/
(3)、几个规定:所有的标号都要顶格写,所有的变量都要顶格写,所有的伪指令和指令都不能顶格写,CALL 调用子程序是在标号前用―#‖,而其他的转移指令中的标号前不用―#‖,对外设的寄存器,当程序开始时,许多是复位为零的,如果要置位为 1,可以直接将每一位的名称作立即数写例如指令:
MOV #(WDTHOLD+WDTPW),&WDTCTL 就是将WDTCTL寄存器中的WDTHOLD和WDTPW位置位为高,很容易读程序内容。
(4)、关于几类定义的区别:EQU、=、SET、VAR、ASSIGN 都是给标号变量定义
第 23 页 共 77 页
婴儿室环境监测电路设计
地址值的伪指令,都可以出现在程序中的任何位置,但用法不一样,= 、EQU 是定义一个永久地址标号变量,一旦定义,在程序中的这个标号将固定在定义的地址上,不能改动。而 SET、VAR、ASSIGN 是暂时的地址标号变量,可以在程序中改动,一旦定义了一个标号地址,就可以对这个标号作地址访问,但必须是在数据段。另外,DB 、DW 是定义变量在数据段当前的偏移位置,是作为数据定义的,不是作为地址定义的,例如:
AA DB 2H /*此时在数据段的当前位置写入了 2H 到存储器,以后用 AA 时就是用数据2H,注:AA 顶格写*/可以在以后的程序中看到这些区别。其他的指令和伪指令都可以在相关资料上查找到,以上是经常出现的问题,一般核心程序。 3.1.4 MSP430中断介绍和存储器断介绍
中断在 MSP430 中得以广泛的应用,它可以快速进入中断程序,之后返回中断前的状态,其时序为:
PC 执行程序→中断允许置位→SR 中的 GIE 置位→EINT(中断开)→中断到,中断标志位(IFG)置位→执行中断程序→从中断向量表中读取中断程序的入口地址,进入中断程序→RETI 中断返回→回到原来地址。
中断向量和上电起始位地址位于ROM中的0FFFFh-0FFE0h范围内,向量中包含各种中断处理程序的16位入口地址, 中断使能寄存器1和2如下图3-2
使能中断1 0H 7 6 ACCVIE NMIIE 3 2 OFIE WDTIE 使能中断2 1H BTIE 6 5 4 3 2 1 0 图3-2 中断使能寄存器1和2
WDTIE:看门狗定时器中断允许信号; OFIE:振荡器错误中断允许信号: NMIE:非可屏蔽中断允许信号
ACCVIE:(非)可屏蔽中断允许信号,如果在FLASH存储器或模块忙时进行错误读写;
第 24 页 共 77 页

