Solicitar un programa en lenguaje C que utilice un microcontrolador y un teclado matricial de 4*4 para ingresar números y mostrarlos en el LCD1602

¡Puedes echar un vistazo a esto como referencia!

#include

#include

#define uint unsigned int

#define uchar char unsigned

tabla de códigos uchar[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

//Estos tres pines material de referencia

sbit E=P2^7; //1602 pin de habilitación

sbit RW=P2^6; //1602 pin de lectura y escritura

sbit RS=P2^5; //1602 pin de selección de datos/comando

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

* Nombre: Delay_1ms()

* Función: Subrutina de retraso, el tiempo de retraso es 1 ms * x

* Entrada: x (número de retrasos por milisegundo)

* Salida: Ninguna

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

void Delay_1ms( uint i)//Retraso de 1 ms

{

uchar x,j;

for(j=0;j

for(x=0;x<=148;x++);

}

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

* Nombre: retraso()

* Función: Retraso, el tiempo de retraso es de aproximadamente 5US.

* Entrada: Ninguna

* Salida: Ninguna

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

retraso nulo()

{

_nop_();

_nop_();

_nop_ ();

_nop_();

_nop_();

}

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

* Nombre: bit Ocupado(void)

* Función: Esta es una función de lectura de estado, que lee si la función está en un estado ocupado

* Entrada: valor de comando ingresado

* Salida: Ninguna

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

bit Ocupado(vacío)

{

bit ocupado_flag = 0;

RS = 0;

RW = 1;

E = 1;

retardo();

bandera_ocupada = (bit)(P0 & 0x80);

E = 0;

devuelve bandera_ocupada;

}

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

* Nombre: wcmd(uchar del)

* Función: función de comando 1602

* Entrada: comando de entrada valor

* Salida: Ninguno

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

void wcmd(uchar del)

{

while(Ocupado());

RS = 0;

RW = 0;

E = 0;

retraso();

P0 = del;

retraso();

E = 1;

retraso();

E = 0;

}

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

* Nombre: wdata(uchar del)

* Función: 1602 función de escritura de datos

* Entrada: Necesita escribir datos 1602

* Salida: Ninguna

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

void wdata(uchar del)

{

while(Busy());

RS = 1 ;

RW = 0;

E = 0;

retraso();

P0

= del;

retraso();

E = 1;

retraso();

E = 0;

}

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

* Nombre: L1602_init()

* Función: inicialización 1602, consulte la información 1602

* Entrada: Ninguna

* Salida: Ninguna

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

void L1602_init(void)

{

wcmd (0x38);

wcmd(0x0c);

wcmd(0x06);

wcmd(0x01);

}

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

* Nombre: L1602_char(uchar colgar,uchar mentir,char firmar)

* Función: cambia un valor determinado en el valor de bits de la pantalla LCD, si desea que la primera línea y el quinto carácter muestren "b", llame a la función de la siguiente manera

L1602_char(1,5, 'b')

* Entrada: Fila, columna, es necesario ingresar 1602 datos

* Salida: Ninguna

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

void L1602_char(uchar colgar,uchar mentir,char firmar)

{

uchar a;

if(hang == 1 ) a = 0x80;

if(hang == 2) a = 0xc0;

a = a + mentira - 1 ;

wcmd(a);

wdata(signo);

}

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

* Nombre: L1602_string(uchar hang,uchar lie,uchar *p)

* Función: cambiar el valor de un determinado bit en el cristal líquido si desea que la primera línea y el quinto carácter comiencen a mostrar" ab cd ef", llame a esta función de la siguiente manera

L1602_string(1,5,"ab cd ef;")<. /p>

* Entrada: fila, columna, se deben ingresar 1602 datos

p>

* Salida: Ninguna

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

void L1602_string(uchar colgar,uchar mentir,uchar *p)

{

uchar a,b=0;

if(hang == 1) a = 0x80;

if(hang == 2) a = 0xc0;

a = un +

mentira - 1;

while(1)

{

wcmd(a++);

b++;

if((*p == '\0')||(b==16)) descanso;

wdata(*p);

p++;

}

}

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

* Nombre: Keyscan( )

* Función: Implementar lectura de claves. La siguiente subrutina se procesa de acuerdo con el método básico de procesamiento del teclado matricial.

* Entrada: Ninguna

* Salida: Valor clave

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

uchar Keyscan(void)

{

uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7 } ;

for(j=0; j<4; j++)

{

P1 = Búfer[j];

temp = 0x10;

for(i=0; i<4; i++)

{

if(!(P1 & temp))

{

retorno (i+j*4);

}

temp <<= 1;

}

}

}

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

* Nombre: Principal()

* Función: Función principal

* Entrada: Ninguna

* Salida: Ninguna

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

void Main(void)

{

uchar Key_Value; //Lee el valor de la clave

L1602_init();

L1602_string(1,1," 4*4 KeyBoard ");

L1602_string(2 ,1," Presionas El ");

while(1)

{

P1 = 0xf0;

if(P1 != 0xf0)

{

Delay_1ms(20); //Botón antirrebote

if(P1 != 0xf0)

{

Delay_1ms(20); //Rebote de clave

if(P1 != 0xf0)

{

Key_Value = Keyscan()

}

}

}

L1602_char(2,15,Key_Value / 10 + 48);

L1602_char(2,16,Key_Value % 10 + 48

}

}

);