¡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);
} p>
/*** ******************************************* ********** ****************
* 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; p>
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
}
}
);