|
MSP430F169单片机编程基础——(四)I/O操作
[复制链接]
四、 I/O操作
端口P1具有输入/输出、中断和外部模块功能,这些功能可通过 7个控制寄存器
各控制寄存器特点及其使用:
(一) PxDIR 输入/输出方向寄存器
相互独立的8位分别定义了Px 口的8位的输入输出方向。在PUC 复位后 PIDIR 各位均复位。
使用输入/输出功能时,应先定义端口方向。作为输入时,只能读;作为输出时,可读可写。
MSP430F169单片机编程基础——(四)I/O操作
PxDIR.x:端口输入输出方向控制
0:输入模式
1:输出模式
操作:
P1DIR |=0x10; (00010000B) // P1.4作输出,其余各位端口方向不变。
P1DIR &=0x7f; (01111111B) // P1.7作输入,其余各位端口方向不变。
(二) PxIN 输入寄存器
该寄存器是只读寄存器。只能通过读取该寄存器内容才能知道 Px 口的输入信号的状态。
读出此寄存器的内容中,只有Px口设为输入的数据位有效。
MSP430F169单片机编程基础——(四)I/O操作
对于Px口设为输出的那些位,一般来说,PxIN.x = PxOUT.x
PxIN.x:端口输入的电平
0:端口输入低电平
1:端口输入高电平
操作:
unsigned char Temp;
P1DIR &=0x77 ;(01110111B) // P1.3和P1.7输入
Temp = P1IN; // Temp为已定义的一变量,Temp 中只要第7位和第4位有效。
(三) PxOUT 输出寄存器
该寄存器可读可写,读取时,其内容与 Px 口引脚定义无关。改变方向寄存器的内容,此寄存器内容不受影响。
MSP430F169单片机编程基础——(四)I/O操作
PxOUT.x:端口输出的电平
0:端口输出低电平
1:端口输出高电平
注意:
如果P1OUT.0 = 1(P1.0输出高) ,但是 P1DIR.0 = 0(该引脚为输入模式) ,则此时 P1.0为输入;(方向寄存器>输出寄存器)
如果P1DIR.0 = 1(该引脚为输出模式) ,则此时 P1.0为输出,并且输出为高电平。 (方向寄存器默认输出为1)
操作:
P1DIR |=0x88; (10001000B) // P1.3和P1.7输出
P1OUT |=0x88; // P1.3和P1.7输出高电平
(四) PxSEL 引脚功能选择寄存器
该寄存器可读可写,如果有该引脚具有特殊功能的话,则可以通过该寄存器使用特殊功能。
MSP430F169单片机编程基础——(四)I/O操作
PxSEL.x:引脚功能选择
0:该引脚的普通O/I端口
1: 该引脚的功能端口(应用第二功能口)
(五) PxIFG 中断标志寄存器
该寄存器只有P1和P2口才有,该寄存器有 8个标志位,标志相应引脚是否有中断请求。
MSP430F169单片机编程基础——(四)I/O操作
PxIFG.x:中断标志
0:该引脚无中断请求
1:该引脚有中断请求
(六) PxIE 中断允许寄存器
该寄存器只有P1和P2口才有,该寄存器有 8个标志位,标志相应引脚是否能响应中断请求。
MSP430F169单片机编程基础——(四)I/O操作
PxIFG.x:中断允许标志
0:该引脚中断禁止
1:该引脚中断允许
(七) PxIES 中断触发沿控制寄存器
该寄存器只有P1和P2口才有,该寄存器有 8个标志位,标志相应引脚的中断触发沿。
MSP430F169单片机编程基础——(四)I/O操作
PxIFG.x:中断触发沿选择
0:上升沿产生中断
1:下降沿产生中断
例一:用软件定时使发光二级管闪烁。
程序代码如下:
#include
void main (void)
{
unsigned char i;
WDTCTL=WDTPW+WDTHOLD; // 关看门狗
P4DIR |= 0X10; // P4.0作输出(00010000B) (在实验系统板中P4.0接有一个发光二极管)
While(1)
{
i=50000;
P4OUT ^=0X01; // ^ 为异或, P4OUT ^=0X01 即 P4OUT=0Xfe(11110111B)
While(i--); // 软件定时
}
}
例二:在系统板上实现按一次按键,对应的发光二极管状态改变一次。
#include
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
P4DIR = 0XfF; // P4全部设置为输出状态,可读可写
P4OUT = 0Xff; //P4全部输出高电平
P1OUT = 0xff; //P1全部输出高电平
P1DIR = 0xf0 ; // P1.0~P1.3设置为输入状态,P1.4~P1.7设置为输出状态,0输入1输出
P1IES = 0x0f; // P1.0~P1.3设置为下升沿触发中断,P1.4~P1.7设置为上降沿触发中断,0上1下
P1IFG = 0; // P1无中断请求,中断标志清零(这个地方是不是应该是P1IFG=0X00)
P1IE = 0x0f; // P1.0~P1.3设置为中断允许,P1.4~P1.7设置为中断禁止,0禁止1允许
_EINT(); // 开总中断 (marked,can't understand it)
while(1)
_BIS_SR(LPM4_bits); // 进入低功耗模式4(marked,can't understand it)
}
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void) // 键盘中断
{
unsigned int i;
unsigned char temp;
temp = P1IFG;
for(i=0;i<0x1ff;i++); // 软件延时,从0加到256,耗时消抖
if((P1IN&temp)==(!temp)) // (marked,can't understand it)
{
switch(temp)
{
case 1: P4OUT ^=0X01;break; //P4.4状态改变,即LED1状态改变
case 2: P4OUT ^=0X02;break; //P4.4状态改变,即LED2状态改变
case 4: P4OUT ^=0X04;break; //P4.4状态改变,即LED2状态改变
case 8: P4OUT ^=0X08;break; //P4.4状态改变,即LED2状态改变
}
}
P1IFG = 0; // 清除中断请求位
}
|
|