矩阵键盘扫描显示,编译通过,但实验板上没有效果,困惑呀!!!

2019-03-24 19:32发布

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay10ms();
void delay(uint t);
void display(uint num,uchar weishu);
uchar keyscan();
sbit wei=P2^7;
sbit duan=P2^6;
uchar code weima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code duanma[]={    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
void main()
{
   while(1)
    {
       if(keyscan()!=16)
      display(keyscan(),1);
 }
  
}  void delay(uint t)
{
   while(t--)
    ; 
}
 
void display(uint num,uchar weishu)
{ uchar i;
  while(1)
  {
   for(i=0;i<weishu;i++) 
    {
      P0=0xff;    //很重要,用来每次显示前的各段清除
  duan=1;
  duan=0;
   
   
   
    P0=weima;
    wei=1;
    wei=0;
    if(num<=9)
      P0=duanma[num];
    else if(num<=99)
      {
     switch (i)
       {
      case 0: P0=duanma[num/10];break;
      case 1: P0=duanma[num%10];break;
    }
   }
  else if(num<=999)
    {  switch (i)
     { case 0: P0=duanma[num/100];break;
    case 1: P0=duanma[num/10%10];break;
    case 2: P0=duanma[num%10]; break;
        }
    }
  else if(num<=9999)
    { 
       switch (i)
     
   {case 0: P0=duanma[num/1000];break;
    case 1: P0=duanma[num/100%10];break;
    case 2: P0=duanma[num/10%10];break;
    case 3: P0=duanma[num%10];break;
    }
    }
  duan=1;
  duan=0;
  delay(300);
 }
   } } 
void delay10ms()
{
  unsigned char i,j;
  for(i=20;i>0;i--)
  for(j=248;j>0;j--);
}
uchar keyscan()
{ uchar templ,temph,key;
  P3=0x0f;
  temph=P3;
  if(temph!=0x0f)
    {
    delay10ms();
    temph=P3;
    if(temph!=0x0f)
       {
      temph=P3;
      P3=0xf0;
      templ=P3;
      while(P3!=0xf0);
      key=templ|temph;
      switch (key)
      {
      case 01111110 : return 0;break;
      case 10111110 : return 1;break;
      case 11011110 : return 2;break;
      case 11101110 : return 3;break;
      case 01111101 : return 4;break;
      case 10111101 : return 5;break;
      case 11011101 : return 6;break;
      case 11101101 : return 7;break;
      case 01111011 : return 8;break;
      case 10111011 : return 9;break;
      case 11011011 : return 10;break;
      case 11101011 : return 11;break;
      case 01110111 : return 12;break;
      case 10110111 : return 13;break;
      case 11010111 : return 14;break;
      case 11100111 : return 15;break;       }
    }
  
 }
  return 16;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。