⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testkey.c

📁 4*4键盘扫描 参数以定义 直接使用
💻 C
字号:
#include<reg51.h>
#include<math.h>
static const char tab[16]={0x01,0x02,0x03,0x0c,	/*键盘码00,01,02,03,*/
                     0x04,0x05,0x06,0x0d,	/*键盘码04,05,06,07,*/
                     0x07,0x08,0x09,0x0e,	/*键盘码08,09,0a,0b,*/
                     0x0a,0x00,0x0b,0x0f};/*键盘码0c,0d,0e,0f*/

 unsigned char scan(void);
 void delay1ms();

void main()
 {
     unsigned 	char data a1  ,a2 ,m,k,falg_dian;  //k as a flag of num end
     unsigned int i;
    
 /*  a1=4;
   a2=a1;
   a1=2;
 //a1=0xf7;

   a1=0x40;
    m=0x00;


    P0=0x22;
    P0=0x33;
    P0=0x44;
     P0=0x55;

  */
     i=0;
     k=1;
     falg_dian=0;
    while(k!=0)
    {
     // a1=scan();
      if(tab[a1]==0x0b)
          k=0;
        else if(tab[a1]>=0&& tab[a1]<=9)
         {
           if(falg_dian==0)
             i=i*10+tab[a1]*100;
           else
             i=i*10+tab[a1];
             i=100;
          P0= ( unsigned char )(i%10);
          P0= ( unsigned char )(0x10+((i/10)%10));
          P0= ( unsigned char )(0x20+((i/100)%10));
          P0= ( unsigned char )(0x30+((i/1000)%10));
         }
          else if(tab[a1]==10 )
           falg_dian=1;
       }

    while(1);


}

 unsigned char scan(void)				/*扫描键盘副程式*/
 {
      unsigned	char data a1,i;			/*A1=0XF7列扫描初值,I行*/
      unsigned	char data m;
      unsigned	char  FLAG0;			/*设按键回应旗号为0,键盘扫描计数指标为0*/
      unsigned    char data ptr;
       a1=0xf0 ;
       FLAG0=0;
       ptr=0;
        m=0xf0 ;
       while(m==0xf0)
       {
          P1=0xff;
          a1=0xf0;
         P1=a1;			/*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
          m=P1;
       }
       for(i=0;i<4;i++)
          delay1ms();
        a1=0xf0;
        m=0xf0 ;
       while(m==0xf0)
       {
           P1=0xff;
          a1=0xf0;
          P1=a1;			/*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
           m=P1;
       }
          a1=0xf7;
        for(i=0;i<4;i++)		/*键盘4个扫描列*/
      {
              P1=a1;			/*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
               m=P1;
                switch(m&0xf0)		/*取行的高4位元,侦测那一行被按*/
            {
            	case 0x70: ptr=i*4;	/*第一行被按否?是则扫描指标=列X4*/
                          FLAG0=1;	/*是则设FLAG0=1表有按键输入*/
                           break;	/*跳出此循环*/
                case 0xb0: ptr=i*4+1;	/*第二行被按否?是则扫描指标=列X4+1*/
                           FLAG0=1;	/*是则设FLAG0=1表有按键输入*/
                           break;	/*跳出此循环*/
                case 0xd0: ptr=i*4+2;	/*第三行被按否?是则扫描指标=列X4+2*/
                           FLAG0=1;	/*是则设FLAG0=1表有按键输入*/
                           break;	/*跳出此循环*/
                case 0xe0: ptr=i*4+3;	/*第四行被按否?是则扫描指标=列X4+3*/
                           FLAG0=1;	/*是则设FLAG0=1表有按键输入*/
                 default:  break;	/*跳出此循环*/
            }
         if(FLAG0==1)break;		/*不为1,则扫描列右移,扫描下一列*/
         a1=a1>>1|0x80;
         		/*高位补1,由于P1.7~P1.4未接+5V,而是由指令加载高电平*/
       }
       a1=0xf0;
    while(m!=0xf0)
       {
         P1 =0xff;
         a1=0xf0;
         P1=a1;			/*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/
          m=P1;
       }

       if(FLAG0==1)
         return ptr;
       else return 0x40;
 }					/*返回主程式*/
void delay1ms()
{
 IE=00;
 TMOD=0x10;
 TH1=0xfc;
 TL1=0x23;
 TR1=1;

 while(!TF1);
 TF1=0;
}

⌨️ 快捷键说明

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