C51 매트릭스 키보드 스캔 절차, 특히 주요 단계를 설명해주세요. ! !
C51 P1 포트 4X4 키보드 설명
C51 마이크로 컨트롤러 P1 포트로 만든 4X4 키보드입니다. p1 포트의 하위 4비트는 키보드 열 스캔 라인이며, 상위 4비트는 키보드 행,
열 스캔 라인이 출력되고 행 스캔 라인이 입력됩니다.
다음은 프로그램에 대한 설명입니다
(***)는 주의 사항을 나타냅니다
1. 먼저 키보드 전체가 눌려져 있는지 확인합니다. , 행 스캔인 경우 라인 입력이 모두 1이 아닌 경우 (1111)은 키가 눌려 있음을 의미합니다.
P1 = 0xf0;if((P1&0xf0)!=0xf0) 키가 없는 경우 pressed, all 1, then return -1 ;
눌린 키가 있으면 지연하고 키가 눌렸는지 다시 판단합니다. Delay();if((P1&0xf0)!=0xf0) If 아무 키도 누르지 않으면 -1을 반환합니다.
키를 눌렀을 때 계속 진행됩니다. *** 또는 키를 읽을 때 키가 눌리지 않을 정도로 진동하기 때문입니다. 키 값을 입력하면 *** 열 스캔 라인이 모두 0, P1 = 0xf0을 출력합니다.
2. 키 값을 읽기 위해 입력. 위와 다르게 판단할 때마다 *** 열의 한 스캔 라인만 0을 출력합니다. 즉, P1=0xfe, 0xfd, 0xfb , 0xf7;
첫 번째, 열 스캔 라인 P1.0, sCode = 0xfe; 행 스캔 라인이 모두 1이면 이 열에서 키가 눌러지지 않고 다음 열이 스캔됩니다.
sCode = _crol_(sCode,1); ***sCode는 한 비트 왼쪽으로 이동합니다. 즉, 4번 스캔되고 모든 행 스캔 라인이 모두 0이면 키가 눌러지지 않습니다.
Return return -1;
행 스캔 라인이 모두 0이 아닌 경우, 즉 키를 누르고 이제 키 값을 읽을 수 있는 경우
kCode = ~P1; //P1=EE,ED...
for(i =0;i<16;i++)
{
if( kCode == KeyCodeTable[i])
return i;
}
1. 첫 번째 kCode = ~P1; 역방향 행 스캔에 대한 p1 값 line은 1, 2, 4, 8일 수 있습니다. 동일한 열 스캔 라인에 대해 해당 값은 1, 2, 4, 8입니다.
총 p1에는 16개의 값이 있으며 이는 x11입니다. 0x12,0x14,0x18,0x21,0x22,0x24,0x28,
0x41,0x42, KeyCodeTable[i] 테이블 0x44,0x48,0x81,0x82,0x84,0x88
(kCode == KeyCodeTable[i])가 true이면 해당 i 값이 키 번호입니다.
2. 반환된 i 값은 키 번호, return i;입니다.
uchar Keys_Scan()
{
uchar sCode,kCode,i,k;
P1 = 0xf0;
if((P1&0xf0)!=0xf0) //열 스캔
{
Delay();
if((P1&0xf0)!=0xf0 )//디바운스
{
sCode = 0xfe
for(k=0;k<4;k++)
{
P1 = sCode;//낮은 비트 찾기
if((P1&0xf0)!=0xf0)//P1 및 0xf0과 같을 경우에만 else를 실행하고 AND는 0xf0이고 true는 True이고 하나의 false는 false입니다.
{
kCode = ~P1 //P1=EE,ED...
for( i=0;i <16;i++)
{
if(kCode == KeyCodeTable[i])
return i;
} p>
}
else
sCode = _crol_(sCode,1);
}
}
}
return -1;
}