세 줄 코드로 독립 버튼 맞추기
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();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
세 줄 코드로 독립 버튼 맞추기즉, Trg = 0x01 & (0x01^0x00) = 0x01 Cont = ReadData = 0x01;결과: ReadData = 0x01;Trg = 0x01;Trg은 이때 대응하는 위치의 값이 1이고 다른 때는 0...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.