key.c

来自「这是用89S52做的带时间日历功能的计算器。调试通过。」· C语言 代码 · 共 86 行

C
86
字号
#include <AT89X51.h>
#include <intrins.H>

/*     
                          _____        
        ___________P2.4__|     |                   
       |   ________P2.5__| AND |____INT0           
       |  |   _____p2.6__|     |
       |  |  |   __p2.7__|_____|
 p1.3__|__|__|__|
 p1.2__|__|__|__|
 p1.1__|__|__|__|
 p1.0__|__|__|__|

*/

void key_delay(char);    //键盘延时
char key(void);          //键盘返回键值程序
void nokey(void);        //防止误操作
//char number(void);







char key(void)
{unsigned char a;
 unsigned char key=0,i;
 TR0=0;
 P2=0xff;_nop_();_nop_();
 for(i=0;i<=3;i++)
  {
   P1=~(0x01<<i);
   key_delay(1);
   a=P2&0xf0;
   if(a==0xe0)
       { key=(i*4)+4; break;}
     else if(a==0xd0)
          { key=(i*4)+3; break;}
        else if(a==0xb0)
             { key=(i*4)+2;  break;}
           else if(a==0x70)
                { key=(i*4)+1; break;}
              else ;
   } 
  if(key>16||key<1) key=255;   
  TR0=1;
  return key;
}



char number(void)
{char x;
 x=key();
 if(x==1) x=7;
  else if(x==2) x=8;
   else if(x==3) x=9;
    else if(x==5) x=4;
     else if(x==6) x=5;
      else if(x==7) x=6;
       else if(x==9) x=1;
        else if(x==10) x=2;
         else if(x==11) x=3;
          else if(x==13) x=0;
		   else x=255;
  return x;}
  
void nokey(void)       //防止连操作
{unsigned char i;
 P1=0x00;P2=0xff;
 key_delay(10);
 i=P2&0xf0;
 while(i!=0xf0)
 { P1=0x00;P2=0xff;
   key_delay(10); i=P2&0xf0;}      //取P2高四位
 }

void key_delay(char x)
{char i=10;
 for(;x>0;x--)
  {i=10; while((i--)>0) _nop_();}
 }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?