【单片机 5.3开关检测】

慈云数据 2024-04-01 技术支持 45 0

文章目录

  • 前言
  • 一、5.3开关检测
    • 1.1没按键按下的
    • 1.2有按键按下的
    • 二、改进
      • 1.改进
      • 三、独立键盘
        • 3.1为什么要取反
        • 3.2 实用的按键
        • 总结

          前言

          提示:这里可以添加本文要记录的大概内容:

          课程需要:


          提示:以下是本篇文章正文内容,下面案例可供参考

          一、5.3开关检测

              unsigned char temp; 	/*定义临时变量temp*/
              P1=0xff;				/* P1口低4位置1,作为输入;高4位置1,发光二极管熄灭*/
              temp= P1&0xf0;			/*读P1口并屏蔽低4位,送临时变量temp */
              temp = temp >>4;		/* temp的内容右移4位,P1口高4位状态移至低4位*/
              P1= temp;				/* 临时变量值写入P1口输出*/
          //    P1= 0XF0|(P1>>4);				/* 临时变量值写入P1口输出*/
              delay(	);
          

          1.1没按键按下的

          1111 1111   P1: 1111 1111
          1111 0000   temp:1111 0000
          0000 1111   temp: 0000 1111
          0000 1111  P1: 0000 1111
          delay(	);
          

          在这里插入图片描述

          1.2有按键按下的

          xxxx 0000 -1111 中的可能

          1111 1111   P1: 1111 1111
          xxxx 0000 &1111 0000   temp:xxxx 0000
          0000 xxxx   temp: 0000 xxxx
          0000 xxxx  P1: 0000 xxxx
          delay(	);
          

          在这里插入图片描述

          二、改进

          改进的思路

          在这里插入图片描述

          1.改进

          代码如下(示例):

          P1= 0XF0|(P1>>4);				/* 临时变量值写入P1口输出*/
          
          在这里插入代码片
          

          三、独立键盘

          在这里插入图片描述

          有按键按下:读回来就是0

          反之: 读回来就是1

          3.1为什么要取反

          在这里插入图片描述

          #include
          void key_scan(void)
          {	
          		unsigned char keyval					
          		do
          		{
          			P1=0xff; 		// P1口为输入
          			keyval=P1; 		//从P1口读入键盘状态
          			keyval=~ keyval;	//键盘状态求反
          			switch(keyval)
          			{
          				case 1: ……;		//处理按下的k1键,“……”为处理程序     	break;			//跳出switch语句
          				case 2: ……; 		//处理按下的k2键
                      		break; 			//跳出switch语句
          				case 4: ……; 		//处理按下的k3键
                      		break;			//跳出switch语句
               			case 8: ……; 		//处理按下的k4键
                      		break;			//跳出switch语句
                      	case 16: ……; 		//处理按下的k5键
                      		break;			//跳出switch语句
               			case 32: ……; 		//处理按下的k6键
                      		break;			//跳出switch语句
               			case 64: ……; 		//处理按下的k7键
                      		break;			//跳出switch语句
               			case 128: ……; 	//处理按下的k8键
                      		break;			//跳出switch语句
          				default:
          				break; 			//无按下键处理 
                 	}
               }  
          	while(1);
          }
          

          3.2 实用的按键

             while (1)
              {
                  if(key0==0)
                  {
                      led0=0; 
                      num++;             
                  }
                  else{                
                      led0=1; 
                  }
                  if(num==0){  //灯1
                      P3=0X00;
                  }
                  else if(num==1){//灯2
                      P3=0X01;
                  }
                  else if(num==2){//灯3
                      P3=0X02;
                  }
             }
          

          问题1:num 没有清0 255 才自己变0很久,手动清0

             while (1)
              {
                  if(key0==0)
                  {
                      led0=0; 
                      num++;             
                  }
                  else{                
                      led0=1; 
                  }
                  if(num==0){  //灯1
                      P3=0X00;
                  }
                  else if(num==1){//灯2
                      P3=0X01;
                  }
                  else if(num==2){//灯3
                      P3=0X02;
                  }
                  else
                  {
                  	num=0;
          		}
             }
          

          问题2:按键还是不灵

          在这里插入图片描述

              while (1)
              {
                  if(key0==0) {                       
                      delay();//按键消抖
                      if(key0==0)
                      {
                          while(key0==0);
                          led0=0; 
                          num++;  
                          
                      }
                      else{
                              
                          led0=1; 
                      }
                  }
                  
                  
                  if(num==0){  //灯1
                      P3=0X00;
                  }
                  else if(num==1){//灯2
                      P3=0X01;
                  }
                  else if(num==2){//灯3
                      P3=0X02;
                  }
                  else{
                      num=0;
                  }
                 }
          

          问题3: 按键松开灯不灭

                     led0=0; //将灯一直到循环上面
                      while(key0==0);      
          
          #include 
          sbit led0 =P1^0;
          sbit key0 =P2^0;
          unsigned char num=0;
          #define uchar unsigned char
          void  delay(  )
          {	uchar i,j;
           	for(i=0; i4
          0000 1110 P1=temp
          1111 0000 
          1111 1110  P1=temp
          1111 1111 P1=0XFF
          */
          void  main(  )					/*主函数*/
          {
              while (1)
              {
                  
                
                  if(key0==0) {                       
                      delay();//按键消抖
                      if(key0==0)
                      {
                          led0=0; //将灯一直到循环上面
                          while(key0==0);               
                          num++;  
                          
                      }
                  }
                  else{
                          
                      led0=1; 
                   }
                  
                  
                  if(num==0){  //灯1
                      P3=0X00;
                  }
                  else if(num==1){//灯2
                      P3=0X01;
                  }
                  else if(num==2){//灯3
                      P3=0X02;
                  }
                  else{
                      num=0;
                  }
                     
              }
          }
          

          总结

          例5-3 程序优化过程,每一个程序没一步,如果你不清晰,就一步步带数字进去计算,看状态。一定要根据电路图来。

          增加了独立键盘,一个按键控制 3种灯的状态,自己可以用来测试一个按键控制多个流水灯的状态,需要注意,松手按键检测会导致程序阻塞,阻塞可能会引起一系列问题。具体问题要具体分析

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon