我在调试AVR时,遇到的问题,求帮忙

2019-07-15 19:01发布

大家好,我今天使用ARMEGA128单片机,在调试矩阵键盘的时候,检测引脚是否被拉低,结果检测出来是引脚被拉高,这到是怎么回事?下面是我调试时矩阵键盘的程序,末尾是我判断引脚被拉高的程序,求大家解答一下为何会如此,是我的芯片有问题吗?#include<iom128v.h>
#define uchar unsigned char
uchar a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
                           0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0XFF};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
uchar num=0;
void delayms(uchar i)
{
         uchar j;
         for(;i>0;i--)
             for(j=110;j>0;j--);
}
void display()
{
    DDRC=0XFF;
        PORTC=~a[num];
}
void check()
{
   uchar dat;
   DDRD|=0XFF;
   PORTD=0x0f;
   delayms(2);
   DDRD=0xff;
   dat=PIND;
   if(dat!=0x0f)
   {
               delayms(5);
                dat=PIND;
                if(dat!=0x0f)
                {                                 
                    switch(dat)
                        {
                                case 0x0e:num=0;break;
                                case 0x0d:num=4;break;
                                case 0x0b:num=8;break;
                                case 0x07:num=12;break;  
                                }
                }
                DDRD=0XFF;
        PORTD=0xf0;
            DDRD=0x00;
                delayms(1);
        dat=PIND;
        if(dat!=0xf0)
        {
            delayms(5);
                        dat=PIND;
                if(dat!=0xf0)
                {
                          num=6;
                  switch(dat)
                       {
                       case 0xe0:num+=0;break;
                       case 0xd0:num+=1;break;
                       case 0xb0:num+=2;break;
                        case 0x70:num+=3;break;
                           }
                }
        }
        display();
   }
}

void main()
{
   while(1)
   {
      check();
   }
}

下面是我检验出来引脚被拉高的程序

#include<iom128v.h>
#define uchar unsigned char
uchar a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
                           0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0XFF};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
uchar num=0;
void delayms(uchar i)
{
         uchar j;
         for(;i>0;i--)
             for(j=110;j>0;j--);
}
void display()
{
    DDRC=0XFF;
        PORTC=~a[num];
}
void check()
{
   uchar dat;
   DDRD|=0XFF;
   PORTD=0x0f;
   delayms(2);
   DDRD=0xff;
   dat=PIND;
   if(dat!=0x0f)
   {
               delayms(5);
                dat=PIND;
                if(dat!=0x0f)
                {                                 
                    switch(dat)
                        {
                                case 0x0f:num=0;break;
                                case 0x1f:num=1;break;
                                case 0x2f:num=2;break;
                                case 0x3f:num=3;break;
                                case 0x4f:num=4;break;
                                case 0x5f:num=5;break;
                                case 0x6f:num=6;break;
                                case 0x7f:num=7;break;
                                case 0x8f:num=8;break;
                                case 0x9f:num=9;break;
                                case 0xaf:num=10;break;
                                case 0xbf:num=11;break;
                                case 0xcf:num=12;break;
                                case 0xdf:num=13;break;
                                case 0xfe:num=14;break;
                                default :        num=5;                  
                                }
                }
        display();
   }
}

void main()
{
   while(1)
   {
      check();
   }
}


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