【MSP430F149学习】14 外部中断
准备工具:电脑;TS8900--MSP430F149开发板;USB线一根
开发环境:IAR EW for MSP430 V5.30
用中断方式读取四个独立式按键的键值,同时将按键的键值在数码管上显示出来
与I/O中断相关寄存器
PxIFG 中断标志寄存器
该寄存器只有 P1 和 P2 口才有,该寄存器有 8 个标志位,标志相应引脚是否有中断请求。
PxIFG .x:中断标志
0: 该引脚无中断请求
1: 该引脚有中断请求
PxIE 中断允许寄存器
该寄存器只有 P1 和 P2 口才有,该寄存器有 8 个标志位,标志相应引脚是否能响应中断请求。
PxIFG .x:中断允许标志
0: 该引脚中断禁止
1: 该引脚中断允许
PxIES 中断触发沿控制寄存器
该寄存器只有 P1 和 P2 口才有,该寄存器有 8 个标志位,标志相应引脚的中断触发沿。
PxIFG .x:中断触发沿选择
0: 上升沿产生中断
1: 下降沿产生中断
程序代码:
/***************************************************
程序功能:用中断方式读取四个独立式按键的键值,同时将
按键的键值在数码管上显示出来
----------------------------------------------------
测试说明:按动K1~k4四个按键,观察数码管显示
***************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
#define keyin (P1IN & 0x0f)
#define wei_h P5OUT |= BIT5
#define wei_l P5OUT &= ~BIT5
#define duan_l P6OUT &= ~BIT6
#define duan_h P6OUT |= BIT6
//数码管7位段码:0--f
uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar KeyVal = 0; // 按键的键值
void delay(void);
/********************主函数********************/
void main( void )
{
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF1OUT = 0XFF;
P2DIR = 0XFF2OUT = 0XFF;
P3DIR = 0XFF3OUT = 0XFF;
P4DIR = 0XFF4OUT = 0XFF;
P5DIR = 0XFF5OUT = 0XFF;
P6DIR = 0XFF6OUT = 0XFF;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P1IES = 0x0f; // P1.0~P1.3选择下降沿中断
P1IE = 0x0f; // 打开中断使能
P1DIR = 0xf0; //设置P1.0~P.3为输入状态
P1OUT = 0x0f; //设置P1.0~P.3输出高电平
_EINT(); //打开全局中断控制位
while(1)
{
P4OUT = scandata[KeyVal]; //P4口输出段码值
duan_h;
duan_l;
P4OUT=0x00; //输出位选信号
wei_h;
wei_l;
}
}
/*******************************************
函数名称:delay
功 能:用于消抖的延时
参 数:无
返回值 :无
********************************************/
void delay(void)
{
uint tmp;
for(tmp = 12000;tmp > 0;tmp--);
}
/*******************************************
函数名称:PORT1_ISR
功 能:P1端口的中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
if(P1IFG & 0x0f)
{
switch(P1IFG)
{
case 0x01:
if(keyin == 0x0e) //如果是第一个按键被按下
{
delay();
if(keyin == 0x0e)
{
while(keyin != 0x0f); //等待按键放开
KeyVal = 1; //更新键值
P1IFG = 0; //清除中断标志
return;
}
}
case 0x02:
if(keyin == 0x0d) //如果是第二个按键被按下
{
delay();
if(keyin == 0x0d)
{
while(keyin != 0x0f); //等待按键放开
KeyVal = 2; //更新键值
P1IFG = 0; //清除中断标志
return;
}
}
case 0x04:
if(keyin == 0x0b) //如果是第三个按键被按下
{
delay();
if(keyin == 0x0b)
{
while(keyin != 0x0f); //等待按键放开
KeyVal = 3; //更新键值
P1IFG = 0; //清除中断标志
return;
}
}
case 0x08:
if(keyin == 0x07) //如果是第四个按键被按下
{
delay();
if(keyin == 0x07)
{
while(keyin != 0x0f); //等待按键放开
KeyVal = 4; //更新键值
P1IFG = 0; //清除中断标志
return;
}
}
default:
while(keyin != 0x0f); //等待按键放开
KeyVal = 0; //更新键值
P1IFG = 0; //清除中断标志
return;
}
}
}
下载运行效果:
【MSP430F149学习】汇总贴
|