我的矩阵键盘不能扫描是为什么呀

单片机我学的不好,感觉自己写的没毛病,但是不知道哪里有问题就是出不来

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
 uint i;
uchar  temp,a,key;        //暂存器 
char ctime=0;
uchar code led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  void delay_ms(uint ms)        //延时函数,延时一段时间
{
     uint j;
    while(ms--)
     {for(j=0;j<120;j++);
    }
 }

void main()
{
  TMOD=0X01; //设定定时器为工作方式1
  TH0=(65536-45872)/256; //装初值,11.0592 MHZ晶振定时50MS,计数值为45872
  TL0=(65536-45872)%256; 
  EA=1;   //打开总中断
  ET0=1;  //打开定时器中断
  TR0=1;  //启动定时器0
  P2=0xff;
 
  while(1)
  {      
       P1=0x0f;
      P2=0xfe;           //暂停显示当前数字
      P0=led[ctime/1000];     
      delay_ms(10);
     P2=0xfd ;      
      P0=led[ctime/100%10]; 
      delay_ms(10);
     P2=0xfb;        
      P0=led[ctime/10%10];  
      delay_ms(10);
     P2=0xf7 ;    
      P0=led[ctime%10];
      delay_ms(10);
      P2=0x00;
      
}
 } 


void   int0()  interrupt  0
    {         
    P1=0xff;                                                    
    P1=0xef;                //置第1行P1.4为低电平,开始扫描第1行
    temp=P1;                //读P1口按键
    temp=temp & 0x0f;        //判断低4位是否有0,即判断列线(P1.0~P1.3)是否有0
    if (temp!=0x0f)            //若temp不等于0x0f,说明有键按下
    {
        delay_ms(10);            //延时10ms去抖        
        temp=P1;            //再读取P1口按键
        temp=temp & 0x0f;        //再判断列线(P1.0~P1.3)是否有0
        if (temp!=0x0f)                //若temp不等于0x0f,说明确实有键按下
        {
            temp=P1;            //读取P1口按键,开始判断键值
            switch(temp)
            {
                case 0xee:key=0;break;
                case 0xed:key=1;break;
                case 0xeb:key=2;break;
                case 0xe7:key=3;break;
            }
               temp=P1;            //将读取的键值送temp
            temp=temp & 0x0f;        //取出列线值(P1.0~P1.3)
            while(temp!=0x0f)        //若temp不等于0x0f,说明按键还没有释放,继续等待
            {
                temp=P1;        //若按键释放,再读取P1口
                temp=temp & 0x0f;// 判断列线(P1.0~P1.3)是否有0
            }
        }
    }

    if(key==1)    //判断按键1是否按下
    a=1;
    if(key==2)     //判断按键2是否按下
    a=2;        //按下则标志2
    if(key==3)     //判断按键3是否按下
    a=3;        //按下则标志3        
        }

   void time() interrupt 1  //定时器0中断服务程序
{
  TH0=(65536-45872)/256;   //重装初值
  TL0=(65536-45872)%256;
  
  i++;
  if(i==20)                //如果i=20,说明1s时间到
  {
   i=0;
   if(a==1){
   ctime++;
   if(ctime>9999)
   {
    ctime=0;
  }}}
 }

图怎么出不来。。

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632