求助!!!基于430f5529的4乘4键盘输入3位数字在数码管上显示的

2019-07-15 15:57发布

这是我们的代码 ,但目前状况就是按下[color=rgb(68, 68, 68) !important]开发板上1.1口按键可以触发中断开始键盘扫描,但是按4乘4按键后再按下开发板上2.2口的按键确认输入完毕,但一直获取不到键值在数码管上显示,哭哭,求助,希望大家能帮忙看下代码帮我们找找原因,谢谢啦!~
#include <msp430f5529.h>
unsigned char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //共阴数码管字码表0~9
unsigned  int a,b=0;
void init(void)
{
P3DIR = 0XFF;//P3 segment port
P6DIR = 0X0e;//P6.1~6.3 digit ports
P4DIR = 0X06;//P4.2 P4.1 latch enable of HC573,P4.2 位选锁存,P4.1段选锁存
return;
}

void digsel(unsigned char dig)//位选信号,P6.1~P6.3对应dig=0~2
{
P4OUT |= BIT2;
P6OUT = (~(BIT1 << dig)) & P6OUT;
P4OUT ^= BIT2;
return;
}
void hscan_init()
{
        //行输入 上拉
        P2DIR&=~(BIT0+BIT2+BIT3);
        P2OUT |= BIT0+BIT2+BIT3;
        P2REN |= BIT0+BIT2+BIT3;
        //列输出
        P2DIR |= BIT4+BIT5+BIT6+BIT7;
        P2OUT &=~(BIT4+BIT5+BIT6+BIT7);
}
void lscan_init()
{
        //列输入 上拉
        P2DIR &=~(BIT4+BIT5+BIT6+BIT7);
        P2OUT |= BIT4+BIT5+BIT6+BIT7;
        P2REN |= BIT4+BIT5+BIT6+BIT7;
        //行输出
        P2DIR |= BIT0+BIT2+BIT3;
        P2OUT &=~(BIT0+BIT2+BIT3);
}
void keyscan()
{
        unsigned char H,L;
        H=0;L=0;

        hscan_init();
        H=P2IN&(BIT0+BIT2+BIT3);

        lscan_init();
        L=P2IN&(BIT4+BIT5+BIT6+BIT7);
        switch(H)
        {
        case 12:H=0; break;  //00001100 第0行
        case 9:H=1; break; //00001001第1行
        case 5:H=2; break;  //00000101第2行
        default: H=16;break;   //00001111
        }
        switch(L)
        {
        case 224:L=0; break;//11100000  第0列
        case 208:L=1; break;//11010000   第1列
        case 176:L=2; break; //10110000 第2列
        case 112:L=3; break; //01110000 第3列
        default: L=16;break;
        }
        if(H!=16&&L!=16)
                a=H*4+L;
}

void display(unsigned int number)        //能否改成循环程序???
{
digsel(2);

P3OUT = 0;//display shadow dispel
P4OUT |= BIT1;
P3OUT = seg[b%1000/100];     //百位
P4OUT ^= BIT1;
P6OUT ^= BIT3;
__delay_cycles(3900);

digsel(1);

P3OUT = 0;//display shadow dispel
P4OUT |= BIT1;
P3OUT = seg[b%100/10];     //个位
P4OUT ^= BIT1;
P6OUT ^= BIT2;
__delay_cycles(3900);

digsel(0);

P3OUT = 0;//display shadow dispel
P4OUT |= BIT1;
P3OUT = seg[b%10];     //小数位
P4OUT ^= BIT1;
P6OUT ^= BIT1;
__delay_cycles(3900);
}

int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
    init();
    P8DIR|=BIT1;
    P2REN|=BIT1;
    P2OUT|=BIT1;
    P1REN|=BIT1;
    P1OUT|=BIT1;
    P1IES|=BIT1;
    P1IFG&=~BIT1;
    P1IE|=BIT1;
    __bis_SR_register(LPM4_bits+GIE);
}

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
                while(1)
                {
                        if(P2IN&BIT1!=0)
                        {
                                        
                                                        keyscan();
                                            P8OUT|=BIT1;
                                            b=a+b*10;
                        }
                        else
                        {
                                __delay_cycles(10000);         //延时10ms,按键去抖
                                if((P2IN & BIT1) == 0)          //按键真正按下
                                        {
                                        while((P2IN & BIT1) == 0);  //等待按键抬起
                                           {
                                        P8OUT&=~BIT1;
                                        display(b);
                               }
                                          }
                        }
                        P1IFG&=~BIT1;
        }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。