¡Programa de teclado determinante MCU 4*4! Pantalla dinámica, al principio, se muestra "——" y después de presionar la tecla, se muestra el valor de la tecla correspondiente (00-15).
/*Las líneas de las filas están conectadas a P1.0-P1.3 y las líneas de las columnas están conectadas a P1.4-P1.7.
Verifique la tabla de codificación de valores clave de acuerdo con el código de valores clave devuelto al escanear el teclado, obteniendo así el valor clave y enviándolo al tubo digital para su visualización.
Al encender el ordenador, el tubo digital muestra "-".
Cuando se presiona la tecla, el tubo digital muestra el valor de la tecla presionada y suena el timbre.
*/
#include lt;reg52.hgt;
#include lt;intrins.hgt;
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P3^6; //Línea de accionamiento del zumbador
tecla uchar;
código de carácter sin firmar disp_code[] ={
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xbf} ;
código de carácter sin firmar key_code[]={
0xee, 0xde, 0xbe, 0x7e, 0xed, 0xdd, 0xbd, 0x7d,
0xeb, 0xdb, 0xbb, 0x7b, 0xe7, 0xd7, 0xb7, 0x77};
/********************************* *** *******************************
Subfunción de retardo
*** ************************************************* **** *****/
void delayms(uint ms)
{
uchar t;
while( ms--)
{
for(t = 0; t lt; 120; t ); /p>
/********************************************* **** *************
x*Subfunción de retardo de 0,14 MS
********** ************* ************************************* ******/
void delay0(uchar x)
{
uchar i
while(x-- )
{
para (i = 0; ilt; 13; i) {;}
}
}
/************ ********************************** *************** p>
Subfunción del controlador de zumbador
**************** ********************** ******************************* /
void beep()
{
uchar i;
for (i=0;ilt;180;i)
{
demora0(5);
BEEP=!BEEP;
//Invertir BEEP
}
BEEP=1; //Apagar el timbre
delayms(250); //Retraso
}
/****************************************** ** **********************
Subfunción de escaneo de teclado
******* ***** ********************************************** ***/
uchar keycan()
{
uchar scan1, scan2, código clave, j
P1=0xf0;
scan1=P1;
if((scan1amp;0xf0)!=0xf0) //Determina si la tecla está presionada
{
delayms(30); / /Retraso 30ms
scan1=P1;
if((scan1amp;0xf0)!=0xf0) //Segundo juicio si la tecla está presionada
{
P1=0x0f;
scan2=P1;
keycode=scan1|scan2 //Combinado en código clave p>
for( j=0;jlt;=15;j)
{
if(keycode== key_code[j]) //Busca la tabla para obtener el valor clave
{
key=j
return(key)
}
; }
} p>
}
más P1=0xff
retorno (16); /p>
/**** **************************************** ************ ****
Subfunción para determinar si la tecla está presionada
********** ********************** ******************************* ****/
void keydown()
{
P1=0xf0
if((P1amp;0xf0)! =0xf0)
{
teclascan();
P0=disp_code[clave]
pitido(); >
}
}
/* **************************** *********************** *******
Función principal
**** **********************
************************************/
principal()
{
P0 = 0xbf;
P2 = 0x7f; //El tubo digital muestra "-"
P1 = 0xff; >
mientras(1)
{
keydown()
}
}
/** ************************************************* **** *****/