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

📄 矩阵键盘扫描程序.c

📁 这是本人花了200元买的51开发板上的所有程序资料
💻 C
字号:
//MCU:AT89S51
//晶振:12M
#include"AT89X51.H"
unsigned char code numcode[]={0xc0,0xf9,0xa4,0xb0,0x99,
                              0x92,0x82,0xf8,0x80,0x90,
                              0X88,0X83,0XC6,0XA1,0X86,0X8E,0XFF
							  };//数字0~9及ABCDEF共阳数码管代码 
unsigned char code charcode[]={0xc0,0xc7,0xc7,0x86,0x89};
                               // HELLO  字样共阳数码管代码 
                       
unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,
                              0xef,0xdf,0xbf,0x7f}; //数码管位选代码
unsigned char dispbuf[8]={16,16,16,0,1,2,3,4};
unsigned char disp_bit_count;

unsigned char disp_count;
unsigned char temp;
unsigned char key;

unsigned char i,j;


/********1ms延时子程序***********/
delay_nms(unsigned int n)
{
 unsigned int i;
 unsigned char j;

 for(i=0;i<n;i++)
    for(j=0;j<120;j++)
	  ;     //空操作
}

unsigned char keyscan(void)
{    
      P2=0xff;
      P2_4=0;
      temp=P2;
      temp=temp&0x0f;
      if (temp!=0x0f)
        {
          delay_nms(10);
          temp=P2;
          temp=temp&0x0f;
          if (temp!=0x0f)
            {
              temp=P2;
              temp=temp&0x0f;              
              switch(temp)
                {
                  case 0x0e:
                    key=7;
                    break;
                  case 0x0d:
                    key=8;
                    break;
                  case 0x0b:
                    key=9;
                    break;
                  case 0x07:
                    key=10;
                    break;
                }
              temp=P2;
              temp=temp & 0x0f;              
              while(temp!=0x0f)
                {
                  temp=P2;
                  temp=temp&0x0f;              
                }
            }
        }
 
      P2=0xff;
      P2_5=0;
      temp=P2;
      temp=temp&0x0f;
      if (temp!=0x0f)
        {
          delay_nms(10);
          temp=P2;
          temp=temp&0x0f;
          if (temp!=0x0f)
            {
              temp=P2;
              temp=temp&0x0f;              
              switch(temp)
                {
                  case 0x0e:
                    key=4;
                    break;
                  case 0x0d:
                    key=5;
                    break;
                  case 0x0b:
                    key=6;
                    break;
                  case 0x07:
                    key=11;
                    break;
                }
              temp=P2;
              temp=temp & 0x0f;              
              while(temp!=0x0f)
                {
                  temp=P2;
                  temp=temp&0x0f;              
                }
            }
        }
 
      P2=0xff;
      P2_6=0;
      temp=P2;
      temp=temp&0x0f;
      if (temp!=0x0f)
        {
          delay_nms(10);
          temp=P2;
          temp=temp&0x0f;
          if(temp!=0x0f)
            {
              temp=P2;
              temp=temp&0x0f;              
              switch(temp)
                {
                  case 0x0e:
                    key=1;
                    break;
                  case 0x0d:
                    key=2;
                    break;
                  case 0x0b:
                    key=3;
                    break;
                  case 0x07:
                    key=12;
                    break;
                }
              temp=P2;
              temp=temp&0x0f;              
              while(temp!=0x0f)
                {
                  temp=P2;
                  temp=temp&0x0f;              
                }
            }
        }
 
      P2=0xff;
      P2_7=0;
      temp=P2;
      temp=temp & 0x0f;
      if (temp!=0x0f)
        {
          delay_nms(10);
          temp=P2;
          temp=temp&0x0f;
          if (temp!=0x0f)
            {
              temp=P2;
              temp=temp & 0x0f;              
              switch(temp)
                {
                  case 0x0e:
                    key=0;
                    break;
                  case 0x0d:
                    key=13;
                    break;
                  case 0x0b:
                    key=14;
                    break;
                  case 0x07:
                    key=15;
                    break;
                }
              temp=P2;
              temp=temp & 0x0f;              
              while(temp!=0x0f)
                {
                  temp=P2;
                  temp=temp & 0x0f;              
                }
            }  
        }
    return (key);
}
 
 
void main(void)
{
   TMOD=0x02;  //使用定时器0,选择方式2(常数自动重装的8位定时器)
  TH0=0x06;   //保存数值,用于自动重装
  TL0=0x06;  //定时250uS初值
  TR0=1;    //开定时器0
  ET0=1;   //开定时器0溢出中断
  EA=1;    //开总中断
 while(1)
  {
   dispbuf[0]=keyscan();
 
  }
}

/**********T0250uS中断服务程序***************/
void t0(void) interrupt 1 using 0
{
  disp_count++;
  if(disp_count==8)
    {
      disp_count=0;
	  if(disp_bit_count>=3)
	   P0=charcode[dispbuf[disp_bit_count]];
	  else
       P0=numcode[dispbuf[disp_bit_count]];
      P1=bitcode[disp_bit_count];
	  disp_count=0;
      disp_bit_count++;
      if(disp_bit_count==8)
        {
          disp_bit_count=0;
        }

     }

 
}

⌨️ 快捷键说明

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