首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

4*4键盘输入部分与89X5X单片机的P1口相连(C程序)

4*4键盘输入部分与89X5X单片机的P1口相连(C程序)

#i nclude<reg51f.h>
#i nclude<intrins.h>

bit  FLAG=0;
char m,ptr=0;
static  const  char tab[16]={0x01,0x02,0x03,0x0c,
                             0x04,0x05,0x06,0x0d,
        0x07,0x08,0x09,0x0e,
        0x0a,0x00,0x0b,0x0f};
char  number[4]={0x00,0x00,0x00,0x00};

void delay(void)
{
unsigned   char  i,j;
   for(i=0;i<10;i++)
     for(j=0;j<120;j++)
      ;
}

void scan(void)
{
      char  a1=0xf7 ,i;
   FLAG=0;
   ptr=0;
   for(i=0;i<4;i++)
   {
        1=a1;
  m=P1;
  switch(m & 0xf0)
  {
           case 0x70: ptr=i*4;
                     FLAG=1;
                      break;
           case 0xB0: ptr=i*4+1;
                     FLAG=1;
                      break;
           case 0xD0: ptr=i*4+2;
                     FLAG=1;
                      break;
           case 0xE0: ptr=i*4+3;
                     FLAG=1;
                     break;
              default: break;
        
          }
           if(FLAG==1)break;
         a1=a1>>1|0x80;
       }
     return;
}


void frequency(void)
{  
     unsigned  char  i=0x00;
          delay();
     while(m==P1) ;
  
     while(i<4)
     {
       scan();
      if(FLAG==1)
      {
           if(tab[ptr]==0x0b)
        { P0=0xff;
          return;}
  
     else {  
             if(tab[ptr]<0x0a)
             {
            number=tab[ptr];
                         switch(tab[ptr])
                         {
                         case 0x000=0x00;
                                     break;
                            case 0x010=0x01;
                                    break;
                         case 0x020=0x02;
                                    break;
                            case 0x030=0x03;
                                    break;
                            case 0x040=0x04;
                                      break;
                         case 0x050=0x05;
                                      break;
                         case 0x060=0x06;
                                     break;
                          case 0x070=0x07;
                                     break;
                         case 0x080=0x08;
                                      break;
                         case 0x090=0x09;
                                     break;
                           default: break;
                       }
                 i++;
       }
        
      }
      delay();
       while(m==P1) ;
   delay();
   }
        
           delay();
     }
      
   do
       {
          scan();
        }while(FLAG==0);
       if(tab[ptr]==0x0a)
        {
           P0=0x0a;
         }
      else {  
          0=0xff;
        return;
        
        
        }
          delay();
         while(m==P1) ;
   delay();
      
   return;
}

void temp(void)
{
    if(tab[ptr]==0x0c)
   frequency();
  
  //if(tab[ptr]==0x0d)
    //zhengfu();

    delay();
   while(m==P1) ;
   delay();
   return;
}


void main()
{
   while(1)
     {
       scan();
    if(FLAG==1) temp();
    delay();

      }
}

返回列表