Escaneo del teclado matricial C51. Explique el procedimiento, especialmente los pasos clave. ! !
Descripción del teclado 4X4 del puerto C51 P1
Este es un teclado 4X4 fabricado con el puerto P1 del microcontrolador C51. Los 4 bits inferiores del puerto p1 son las líneas de exploración de la columna del teclado y el. Los 4 bits superiores son las filas del teclado,
Las líneas de escaneo de las columnas se emiten y las líneas de escaneo de las filas se ingresan.
La siguiente es una explicación del programa
(***) indica puntos de atención
1 Primero determine si todo el teclado tiene una tecla presionada. , siempre que el escaneo de filas Si la entrada de línea no sea toda 1, (1111) significa que hay una tecla presionada
P1 = 0xf0 if ((P1amp; 0xf0)!=0xf0) If no; se presiona la tecla, todo 1, luego devuelve -1;
Si hay una tecla presionada, retrasa y luego juzga si hay una tecla presionada nuevamente, Delay() if ((P1amp; 0xf0) !=0xf0) Si no se presiona ninguna tecla, devuelve -1.
Continuar si se presiona una tecla. Este proceso es para determinar la tecla y eliminar la vibración para evitar leer el valor de la tecla varias veces *** O porque la tecla está vibrando hasta el punto en que no hay ninguna tecla. Si se presiona al leer el valor de la clave, se produce un error. La línea de exploración de la columna *** genera todos 0, P1 = 0xf0.
2. Ingresar para leer el valor clave. A diferencia de lo anterior, cada vez que se juzga, solo una línea de escaneo de la primera columna genera 0, es decir, P1 = 0xfe, 0xfd, 0xfb, 0xf7.
Primero, la línea de escaneo de la columna P1.0, sCode = 0xfe; si la línea de escaneo de la fila es 1, entonces no se presiona ninguna tecla en esta columna y se escanea la siguiente columna.
sCode = _crol_(sCode, 1); ***sCode se desplaza un bit hacia la izquierda, que es 0xfd. Después de escanear 4 veces, las líneas de escaneo de filas son todas 0, luego no se presiona ninguna tecla.
Return return -1;
Si la línea de escaneo de fila no es toda 0, es decir, se presiona una tecla y ahora se puede leer el valor de la clave
kCode = ~P1; //P1=EE, ED...
for(i =0; ilt; 16; i )
{
si( kCode == KeyCodeTable[i])
return i;
}
1. Primer kCode = ~P1 valor para escaneo de fila inversa; la línea puede ser 1, 2, 4, 8; para la misma línea de exploración de columna, los valores correspondientes son 1, 2, 4, 8
El total de p1 tiene 16 valores, que son x11, 0x12, 0x14, 0x18, 0x21, 0x22, 0x24, 0x28, 0x41, 0x42, 0x44, 0x48, 0x81, 0x82, 0x84, 0x88
Si (kCode == KeyCodeTable[i]) es verdadero, el El valor i correspondiente es el número clave.
2. El valor de i devuelto es el número de clave, devuelve i;.
uchar Keys_Scan()
{
uchar sCode, kCode, i, k
P1 = 0xf0;
if((P1amp;0xf0)!=0xf0) //Escanear columna
{
Retraso();
if((P1amp;0xf0) )!=0xf0)//Rebote
{
sCode = 0xfe
for(k=0;klt;4;k)
{
P1 = sCode; //Encuentra el bit bajo
if((P1amp; 0xf0)!=0xf0)//Solo si es igual, realiza otra cosa P1 y 0xf0 AND es 0xf0 y lo mismo que verdadero es verdadero, uno falso es falso
{
kCode = ~P1; //P1=EE, ED...
for (i=0; ilt; 16; i )
{
if(kCode == KeyCodeTable[i])
return i;
}
}
else
sCode = _crol_(sCode, 1
}
}
}
devuelve -1;
}