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

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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
小小白
1楼-- · 2019-03-25 04:57
 精彩回答 2  元偷偷看……
_Justin
2楼-- · 2019-03-25 05:09
编译是只要你的语法没有问题就能通过编译,但是要程序跑起来那就另说了,还得调试的。。。
又看了看,发现你的程序有点问题吧,能编译通过我感觉真的很疼!
1.在void display()这个函数中,你把P0=weima;至少知道点是那个wei吧
2.在主函数中,你的display(keyscan(),1);这里明明定义就一个位数,下面的那个for(i=0;i<weishu;i++)中,它最多能加到1!!!!那你下面的switch()语句有什么用的呢?
3.就是keyscan()函数中了,我猜你用的是矩阵键盘吧,要是这样的话。。。。。。似乎就不会了吧!

[ 本帖最后由 _Justin 于 2011-10-24 16:20 编辑 ]
goto0514
3楼-- · 2019-03-25 07:04
貌似程序跑飞了!

一周热门 更多>