我现在用MSP430G2553做键盘实验,但是老是不成功,我还没按键盘,总是直接级进中断了。用的是中断的方法做的。由于我的4*4键盘坏了,所以我自己在面包板上面搭了一个只能有4个按键的键盘,但是作用完全一样,因为我用查询的方式写的代码已经验证成功了。现在附上代码:
//由于在面包板上实现,连接口原因只能做出4个键盘端口,即1,2,3,4
//P1.0,P1.1,P1.2,P1.3作为中端端口;P1.4,P1.5,P1.6,P1.7设置为键盘的输出口
/***********************************************************/
#include <intrinsics.h>
#include <msp430g2553.h>
#include <msp430.h>
#define uchar unsigned char
#define uint unsigned int
void delay(void); //延时函
//键盘中断服务程序
void msp_port(void);//初始化函数
/****************延时函数*******************/
void delay()
{
for(uint n=0;n<100;n++)
{
;
}
}
/****************初始化函数*******************/
void msp_port() //初始化函数
{
P1SEL=0X00;//设置P1端口为普通的I/O
P1DIR=0X0F;//设置P1.0,P1.1,P1.2,P1.3为输入;P1.4,P1.5,P1.6,P1.7为输出
P2SEL=0X00;//设置P2端口为普通的I/O
P2DIR=0XFF;//设置P2口都为输出端口
P1OUT=0X00;//开始P1口输出都为0
P2OUT=0X1f;//开始P2口输出都为0x1f,可以检测LED灯是否正常
/*开始设置相应的中断寄存器*/
//开始将P1端口的3个中断寄存器内部的值都清零
P1IE=0;
P1IFG=0;//中断标志位
P1IES=0;
//设置P1断口中断时的工作状态
//该实验中只用到P1的前4个端口
P1IE=0X0F;
P1IES=0X0F;//设置为下降沿触发
delay();
_EINT();//开中断即打开可屏蔽中断
return;
}
/****************键盘中断服务程序*******************/
#pragma vector=PORT1_VECTOR // P1 端口中断服务程序
__interrupt void PORT1_key1(void)
{
delay();
P2OUT=0X08;//检验进中断
switch(P1IFG&0x0f)//将P1IFG的数据当做判断标准,共有4中可能性0X01, 0X02, 0X03, 0X04
{
case 0x01: P2OUT=0X01;
break;
case 0x02: P2OUT=0X02;
break;
case 0x03: P2OUT=0X03;
break;
case 0x04: P2OUT=0X04;
break;
}
P1IFG=0X00;
delay();
P2OUT=0X07;;//检验出中断
}
void main()
{
WDTCTL=WDTPW+WDTHOLD;
msp_port();
while(1)
{}
}
在面包板上面的搭建方式是:给P1.0,P1.1,P1.2,P1.3,l连接上拉电阻电压接在3.3v处,举个例子吧端口P1.0的中断
P1.0开了中断,当键盘按下的时候P1.0由于是下降沿触发,就进入中断,那么P1IFG=0X01,经过swtich()语句进行判断
输出1;但是事与愿违,妈的,总是直接进中断,即使进了并且无视swtich()语句。
怒请大神指点。。。。。
此帖出自
小平头技术问答
一周热门 更多>