新手,求指教。
定义的P1.0端口中断,现在中断老是进不去。红外接收用的VS1838。
#include<msp430f1611.h>
int time=0;//计数时间
int flag=0;//引导码标志
int count=1;//计数位数
int cel=0;//解码完标志
//unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int add,dat,lcd;
#define SET_RS P3OUT|=BIT0;
#define RST_RS P3OUT&=~BIT0;
#define SET_W P3OUT|=BIT1;
#define RST_W P3OUT&=~BIT1;
#define SET_E P3OUT|=BIT2;
#define RST_E P3OUT&=~BIT2;
void delay_us(unsigned t)
{
unsigned int i;
while(t--)
for(i=1330;i>0;i--);
}
//****************液晶模块************************
void write_com(unsigned char a) //写入指令
{
// ReadStatusLCD();
RST_RS;
delay_us(5);
RST_W;
delay_us(5);
P4OUT=a;
delay_us(5);
SET_E;
delay_us(5);
RST_E;
}
void write_dat(unsigned char a) //写入数据
{
// ReadStatusLCD();
SET_RS;
delay_us(5);
RST_W;
delay_us(5);
P4OUT=a;
delay_us(5);
SET_E;
delay_us(5);
RST_E;
}
void getlcd()
{
switch(dat>>8)
{
case 0x16:lcd=0x30;break;
case 0x0c:lcd=0x31;break;
case 0x18:lcd=0x32;break;
case 0x5e:lcd=0x33;break;
case 0x08:lcd=0x34;break;
case 0x1c:lcd=0x35;break;
case 0x5a:lcd=0x36;break;
case 0x42:lcd=0x37;break;
case 0x52:lcd=0x38;break;
case 0x4a:lcd=0x39;break;
default:break;
}
}
void LcdShow( void )
{
write_com(0x80+0); //定位光标至第一行
delay_us(50);
write_dat(lcd);
}
//****************液晶模块************************
void main(void)
{
WDTCTL=WDTHOLD+WDTPW;
TACTL=TASSEL_1+TACLR;
P1SEL|=0x00;
P1DIR=0x00;//输入
P1IES|=0x01;//下降沿捕获
P1IE|=0x01;//p1.0允许中断
//****************液晶初始化****************************
P4DIR=0XFF; //P4定义为数据接口
P3DIR |=BIT0+BIT1+BIT2; //P3定义为控制接口
RST_E; //置位使能端
write_com(0x38); //8位数据接口,显示2行,5*7点阵显示
delay_us(5);
write_com(0x38);
delay_us(5);
write_com(0x38);
delay_us(5);
write_com(0x38); //8位数据接口,显示2行,5*7点阵显示
delay_us(5);
write_com(0x08); //显示关闭
delay_us(5);
write_com(0x01); //清屏
delay_us(5);
write_com(0x0c); //显示开关
delay_us(5);
write_com(0x06); //设置光标随写入数据右移
delay_us(5);
//****************液晶初始化****************************
lcd=0x30;LcdShow();
_EINT();
while(1)
{
if(cel)//如果解码完
{
getlcd();
LcdShow();
}
}
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_(void)
{
time=TAR;
TAR=0;
P1IFG&=~BIT0;
P1IE&=~BIT0;
if(flag==0)
{
if(time>=320&&time<=500)
{
flag=1;
}
P1IES&=~BIT0;//下降沿中断
P1IE|=BIT0;//允许中断
}
if(flag)//y有引导码
{
if(time>14&&time<20)
{
if(count<=16)
{
add|=0<<(16-count);
}
else dat|=0<<(16-count);
}
else
{
if(count<=16)
{
add|=1<<(16-count);
}
else dat|=1<<(16-count);
}
P1IES&=~BIT0;//下降沿中断
P1IE|=BIT0;//允许中断
}
if(count==32)
{
cel=1;//解码完标志
TACTL&=~MC1;//关计数器
flag=0;//引导码标志清0
count=1;
}
else
{
TACTL|=MC1;
}
P1IFG=0x00;
}