【单片机 5.3开关检测】

发布于:2024-04-05 ⋅ 阅读:(214) ⋅ 点赞:(0)


前言

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

课程需要:


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

一、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<reg51.h>
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 <reg51.h>


sbit led0 =P1^0;
sbit key0 =P2^0;

unsigned char num=0;
#define uchar unsigned char

void  delay(  )
{	uchar i,j;
 	for(i=0; i<255; i++)
 	for(j=0; j<255; j++);
}

/*

1111 1111
1111 0000

1111 0000  temp

1110 0000
1111 0000 
1110 0000   temp

0000 1110  temp>>4

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种灯的状态,自己可以用来测试一个按键控制多个流水灯的状态,需要注意,松手按键检测会导致程序阻塞,阻塞可能会引起一系列问题。具体问题要具体分析。


网站公告

今日签到

点亮在社区的每一天
去签到