Red de conocimientos turísticos - Información de alquiler - ¡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).

¡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) {;}

}

}

/************ ********************************** ***************

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

for( j=0;jlt;=15;j)

{

if(keycode== key_code[j]) //Busca la tabla para obtener el valor clave

{

key=j

return(key)

}

; }

}

}

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()

}

}

/** ************************************************* **** *****/