求大神帮忙看看基于msp430g2553红外解码的程序问题,本人小白一枚,很白痴。
我的思路是这样的:当有键按下时,其下降沿触发中断,并且保存这是的计数值,第二次下降沿来时在记下时间,将两者相减,看减后得到的值大小判断是“0”还是“1”,以此来得到按键的编码。
但是我仿真之后貌似time_a没有计数,是怎么回事啊?程序那里写错了呢?
/***********main.c*************/
#include <msp430g2553.h>
#include "keyhand.h"
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
TACTL = TASSEL_2 + MC_1; // SMCLK, contmode
// TACCTL0 |= CCIE+CM_2+CAP+SCS;
P2DIR |= BIT4; //输出
P2DIR &= ~BIT0; //输入口
P2IES |= BIT0; //下降沿触发中断
P2IE |= BIT0;
// TACCR0 = 0;
_BIS_SR(LPM0_bits + GIE); // 进入低功耗/全局中断
// while(1)
// {
// display();
// }
}
/*
//Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR //TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
Record();
}
*/
// P2口中断服务程序
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
//if(P2IFG & 0x01)
//{
Record();
P2IFG &= ~0x01;
_DINT();
//}
}
/**********keyhand.h**************/
#define uchar unsigned char
#define uint unsigned int
uint flag;
uint temp;
uint data0,data1;
uchar bitcnt;
uchar first=1;
uint last;
void Record(void)
{
if(first==1)
{
TACTL |= MC_1;
last=0;
first=0;
}
else if(first==0)
{
P2OUT ^= BIT4; //标志位,看程序有没有执行到这一句
temp=TA0R-last;
TA0R=0;
if ((temp>1000) && (temp<1200)) temp=0; // “0”信号
else if ((temp>2000) && (temp<3500)) temp=1; //“1”信号
else if ((temp>13400) && (temp<13600)) //header信号
{
bitcnt=0;
data0=0;
data1=0;
return; //返回,等待下次开始接收
}
else{ first=1; return; }// 干扰信号,重新计数
//P2OUT ^= BIT4;
bitcnt++;
if (bitcnt<16) //开始接收前16位
{
data0=data0|temp;
data0=data0<<1;
}
else if (bitcnt==16) data0=data0|temp;
else if (bitcnt<32) //开始接收后16位
{
data1=data1|temp;
data1=data1<<1;
}
else if (bitcnt==32)
{
data1=data1|temp;
flag=1;
} // 接收完最后一位
//P2OUT ^= BIT4;
}
}
/*
uchar key_covert(uint code_data)
{
uchar j,key=0;
for(j=0;j<21;j++)
if(code_data==code[j])
{
if(j<=9)
key=j;
// else key=j+55;
}
return key;
}
*/
void display(void)
{
if(flag==1)
P2OUT ^= BIT4;
}
void uart_init(void) //串口初始化
{
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
P1SEL = BIT1+BIT2; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1+BIT2; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 = UCSWRST; //置位UCSWRST位,使UART模块的寄存器处于初始状态
UCA0CTL1 |= UCSSEL1; //UCLK=SMCLK=1MHz;
UCA0BR0 = 65; //USCI_A0 baud rate countrol
UCA0BR1 = 3; //baud rate:波特率
UCA0CTL1 &= ~UCSWRST; //置0
IE2 |= (UCA0RXIE+UCA0TXIE); //允许串口接收和发送
}
请各位大神解答,我真的弄不明白了 |