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

📄 键盘显示.c

📁 键盘与显示 4*4键盘 8个数码管轮流扫描作动态显示 硬件电路需要74LS138 cd451
💻 C
字号:
#include<reg51.h>

sbit a0=P2^0;
sbit a1=P2^1;
sbit a2=P2^2;
sbit a3=P2^3;
sbit a4=P2^4;
sbit a5=P2^5;
sbit a6=P2^6;
sbit a7=P2^7;


unsigned char i,j,k,l,m,n,temp,function,shijian=0;


unsigned char key,count,num[8],bh[8];


void delay(count)	//延时count MS//
{
 for(i=0;i<5*count;i++)
 for(j=0;j<100;j++);
}


unsigned char KEYZHI()	  //按键扫描程序//
 {
  k=0;
  while(k==0)								//扫描//
   {
    do
     {
      P1=0xf0;

     }
    while ((0xf0&P1)==0xf0) ;			  //有按下?有则跳出do……while循环//

    delay(5);							  //延时,防干扰//



    if((0xf0&P1)==0xf0) k=0;			  //真的按下去了吗?延时后再作判断//
    else  k=1;
   }

   P1=0x0f;
									   //扫描行,得出行号j//
    switch(P1)
	{
	  case 0x0e: j=0;break;
	  case 0x0d: j=1;break;
	  case 0x0b: j=2;break;
	  case 0x07: j=3;break;
	  default:  break;
	}

	P1=0xf0;								//扫描列,得出列号i//
    switch(P1)
	{
	  case 0xe0: i=0;break;
	  case 0xd0: i=1;break;
	  case 0xb0: i=2;break;
	  case 0x70: i=3;break;
	  default:   break;
	}


     return(i+4*j);						//返回键值,供下面作数据处理//

}



void DF()	//等待按键释放程序//
{
 n=0;
 while(n==0)
  {
    do
    {
      P1=0x0f;
    }
    while((0x0f&P1)!=0x0f);	  //等待按键释放,即若没有放开则一直循环//

    delay(5);		//放开键后消抖//

    P1=0x0f;

    if((0x0f&P1)!=0x0f)		  //真的放开了吗?延时后再次判断//
	  n=0;
    else
	  n=1;
  }
}

void timer0_ISR() interrupt 1	//中断服务 完成选通及显示//
 {
    EA=0;                   //关中断//
    TH0=0xf9 ;
    TL0=0x17 ;
					  //一次中断只完成一个数码管的扫描//
	 if((function==0)|(function==1))	 //function变量专为闪烁配置//
	 {
	  if(function==1) 					  //function为1将实现闪烁//
	  {
	   ++shijian;
	   if(shijian==200)	  function=2;		//时间从0加到100后function变为2,进入下面的else if(…)//
	  }
	 m=P2;
	 m=0x70 & m;				 //m为位选通变量//

     switch(m)			  //扫描显示;a6,a5,a4为下次选通先给P2高位赋值//
      {
	   case 0x60 : P2=num[7];a6=1; a5=1; a4=1;  break;
	   case 0x70 : P2=num[0];a6=0; a5=0; a4=0;  break;
	   case 0x00 : P2=num[1];a6=0; a5=0; a4=1;  break;
	   case 0x10 : P2=num[2];a6=0; a5=1; a4=0;  break;
	   case 0x20 : P2=num[3];a6=0; a5=1; a4=1;  break;
	   case 0x30 : P2=num[4];a6=1; a5=0; a4=0;  break;
	   case 0x40 : P2=num[5];a6=1; a5=0; a4=1;  break;
	   case 0x50 : P2=num[6];a6=1; a5=1; a4=0;  break;
	  }
     }
    else if(function==2)
  	 {
	  P2=0x0a;						  //为灭掉数码管赋值//
	  ++shijian;
	  if(shijian==200)
	  {
	   shijian=0;
	   function=1;
	  }								  //shijian从0加到200后function为1,为下次闪烁给出条件//
	 }
     EA=1;		       //开中断//
}




void main()
{
  EA=1;							 //开中断//
  TMOD=0x01;					 //定时器模式1//
  ET0=1;
  TR0=1;
  P3=0x00;
  TH0=0xfe ;
  TL0=0x17 ;
   P3=0x00;
 for(i=0;i<=7;i++)
  num[i]=0;					   //数组作为显示缓存,预先赋初值0//
  P0=0x01;
 while(1)
  {
   P1=0x0f;

   key=KEYZHI();

   DF();

   switch(key)			   //由键值进入数据处理,最后数据存入数组中,待显示//
   {
     case 10 : function=0;temp=num[0];for(i=0;i<7;i++)  {num[i]=num[i+1];}num[7]=temp;break;	 //左移//
	 case 11 : function=0;temp=num[7];for(i=7;i>0;i--)  {num[i]=num[i-1];}num[0]=temp;break;	 //右移//
	 case 12 : function=1;break; 	//闪烁//
	 case 13 : function=0;break;	//控制闪烁//
	 case 14 : function=0;for(i=0;i<8;i++)num[i]=0; break;     //清零//
	 case 15 : function=0;for(i=0;i<8;i++)num[i]=10;break;     //消隐:数组存入10,数码管无显示//
	 default : function=0;
	           for(i=0;i<7;i++)					   //0-9数字直接显示//
               { j=i+1;  num[i]=num[j]; } num[7]=key;  break;     //num[7]存放右边第一块数码管的将要显示的数值,依次类推//

   }

  }

}

⌨️ 快捷键说明

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