세 줄 코드로 독립 버튼 맞추기

2479 단어 51

세 줄 코드

uchar cont,trg;    //triger   continue  
void KeyScan()
{
	    uchar ReadData =  PINB^0xff;
		trg = ReadData&(ReadData^cont);
		cont = ReadData;
}

의 원리


(1) 버튼이 없을 때 포트가 0xff이고 ReadData 읽기 포트가 다르거나 0x00인 것이 분명하다.Trg = ReadData & (ReadData ^ Cont); (초기 상태에서Cont도 0이다) 간단한 수학 계산이다. ReadData가 0이면 그 어떠한 수와'상조'하고 결과도 0이다.Cont = ReadData; Cont를 저장하는 것은 사실 ReadData와 같고 0이다.결과: ReadData = 0;Trg = 0; Cont = 0; (2) 첫 번째 PB0이 눌린 경우 포트 데이터는 0xfe이고 ReadData 읽기 포트가 다르거나 0x01이다.Trg = ReadData & (ReadData ^ Cont); 처음 누르는 것이므로 Cont는 마지막 값이며 0이어야 합니다.그러면 이 식의 값도 계산하기 어렵지 않다. 즉, Trg = 0x01 & (0x01^0x00) = 0x01 Cont = ReadData = 0x01;결과: ReadData = 0x01;Trg = 0x01;Trg은 이때 대응하는 위치의 값이 1이고 다른 때는 0 Cont = 0x01이다.(3) PB0이 느슨하지 않은 경우 포트 데이터는 0xfe, ReadData 읽기 포트 또는 0x01입니다.Trg = ReadData & (ReadData ^ Cont); 이것은 연속으로 눌렀기 때문에 Cont는 마지막 값이며 0x01이어야 합니다.그러면 이 식은 Trg = 0x01 & (0x01^0x01) = 0x00 Cont = ReadData = 0x01;결과: ReadData = 0x01;Trg = 0x00; Cont = 0x01; 현재 버튼이 길게 눌려 있기 때문에 MCU는 일정 시간(20ms 정도)마다 이 함수를 끊임없이 집행한다. 그러면 다음에 집행할 때 상황은 어떨까?ReadData = 0x01;버튼이 안 풀려서 Trg = ReadData & (ReadData ^ Cont) = 0x01 & (0x01 ^ 0x01) = 0 버튼이 안 풀리면 이 Trg 값은 영원히 0!!!Cont = 0x01;버튼이 풀리지 않으면 이 값은 영원히 0x01입니다!!(4) 버튼이 풀린 경우 포트 데이터는 0xff이고 ReadData 읽기 포트이며 0x00입니다.Trg = ReadData & (ReadData ^ Cont) = 0x00 & (0x00^0x01) = 0x00 Cont = ReadData = 0x00; 결과: ReadData = 0x00;Trg = 0x00; Cont = 0x00; 이것은 버튼이 눌리지 않은 상태로 돌아간 것이 분명하다.이 코드는 시간 지연 떨림 문제를 완벽하게 해결했고 코드가 간결하고 편리하며 실용성이 높다. 세 줄 코드는 버튼의 상태를 검사하여 버튼이 눌렸는지 판단하는 것과 같기 때문에 우리는 버튼을 끊지 않고 쓸 수 있다. 다음은 내가 51로 쓴 끊지 않는 버튼 스캐닝 실험을 놓을 것이다.긴 버튼과 짧은 버튼이 있는 스캔.인터넷상에서 삼행 코드에 관한 자료가 매우 많은데, 나는 이곳에서 단지 짐꾼이 될 뿐, 몇몇 견해는 꽤 편파적이니, 여러분의 지적을 환영합니다.

독립 키 실험 코드

#include

#define uchar unsigned char
#define uint unsigned int

uchar cont,trg; 
static uchar k;

//          

void keyscan()
{
	uchar ReadData = P3^0xff;
	trg = ReadData&(ReadData^cont);
	cont = ReadData;
}

void Delay100ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 180;
	j = 73;
	do
	{
		while (--j);
	} while (--i);
	k++;
}


//    

void keyfun()
{
	if(trg & 0x01)
	{
		P1=~0x01;
	}
	else if(trg & 0x02)
	{
		P1=~0x02;
	}
	else if(trg & 0x04)
	{
		P1=~0x04;
	}
	else if(cont & 0x01)
	{ 
		Delay100ms();
	 if(k == 20)//   
		{
			P1=0xff;
			k=0;
		}
	}
}

void main()
{
	while(1)
	{
		keyscan();
		keyfun();
	}
}

좋은 웹페이지 즐겨찾기