Red de conocimientos turísticos - Estrategias turísticas - ¿Cuál es la razón por la cual el microcontrolador LCD1602 del calendario perpetuo 51 no se muestra?

¿Cuál es la razón por la cual el microcontrolador LCD1602 del calendario perpetuo 51 no se muestra?

Le brinda una rutina de visualización y podrá ver dónde está mal su propio programa o hardware.

¿#Definición? LCD1602_FLAG

#¿Definición? LCD 1602_Puerto? proteína p0

# include ltreg 51. h gt;

# include ltstddef.h gt

#¿Definición? ¿Uchar? ¿No firmado? ¿Té

un poco? lcd1602_rs=p2^0;

sbit? lcd1602_e=p2^2;

sbit? lcd1602_rw=p2^1;

bit? lcd1602_busy=p0^7;

¿Uchar? str[]= "¿Esto? ¿Es? ¿Clave? Prueba";

Uchar? keyval,keystr[16];

¿No es válido? retraso (uchar? respuesta

{

uchar? i;

mientras (a-)for(I = 0; i lt120; i);

}

/*

****************************** ** **********

*?Nombre de la función: lcd1602_CheckBusy()

*?Función: consulta de estado

*** * ********************************

*/

¿Anulado? lcd1602_CheckBusy()

{

Hacer

{

LCD 1602 _ ocupado = 1;

LCD 1602 _ RS = 0;

LCD 1602 _ rw = 1;

LCD 1602 _ e = 0

LCD 1602 _ e = 1; /p >

}

mientras(LCD 1602 _ ocupado);

}

/*

**** ** *********************************

*?Nombre de la función:? lcd1602_WriteCmd( )

*?Función: escribir comando

*?Parámetro de entrada: palabra de comando

*?Parámetro de exportación: ninguno

* ** *************************************

*/

¿No es válido? lcd1602_WriteCmd(const? Uchar? cmd)

{

LCD 1602 _ comprobar ocupado();

LCD 1602 _ RS = 0 ;

LCD 1602_rw = 0;

LCD 1602_e = 1;

LCD 1602_PORT = cmd;

LCD 1602 _ e = 0

}

/*

************************ * ***********************

*?Nombre de función: lcd1602_WriteData()

*?Función de función: Escribir datos

*? Parámetro de entrada: c-los datos a escribir.

*?Parámetros de exportación: Ninguno

****************************** ***************

*/

¿Anulado? lcd1602_WriteData(const? Uchar?c)

{

LCD 1602 _ comprobar ocupado();

LCD 1602 _ RS = 1;

LCD 1602_rw = 0;

LCD 1602_e = 1;

LCD 1602_PORT = c;

LCD 1602_e = 0;

}

/*

****************************** *** *********************

*?Nombre de la función: lcd1602_Init()

*?Función: Inicializar LCD

*?Parámetros de entrada: Ninguno

*?Parámetros de exportación: Ninguno

************** **** *****************************

*/

¿Anulado? lcd1602_Init()

{

LCD 1602 _ write cmd(0x 38); //El modo de visualización es de matriz de puntos de 8 bits, 2 líneas y 5*7.

LCD 1602 _ escribir cmd(0x0c);? //¿espectáculo? ¿Habilitar, marcar? ¿Habilitar, flashear? Habilitar,

LCD 1602_write cmd(0x 06);? //¿bandera? mudarse de lugar? ¿A dónde ir? ¿Verdad, pantalla? no quieres? Mover

LCD 1602_write cmd(0x 01);? //¿Claro? Pantalla

}

/*

*************************** ***** *************************

*?Nombre de función: lcd1602_Display()

*?Función: ? Visualización de información

*?Parámetro de entrada: ptr - carácter o puntero de cadena

*?Parámetro de exportación: Ninguno

*?Descripción: Los usuarios pueden utilizar los siguientes métodos Llámalo:

*?1)lcd1602_Display("¡Hola, mundo!");

*?2)?INT8U? ¿Tipo de almacenamiento? Txt[]= "Cadena a mostrar";

*¿O? ¿INT8U? ¿Tipo de almacenamiento? txt[]={'t', 'x', 't', .., '\0'};

*INT8U? * ptr

* ptr = amptxt

* LCD 1602 _display(ptr);

* ¿O? LCD 1602 _ Pantalla(txt);

*¿O? LCD 1602_Display(amp;txt);

*********************************** * ***************

*/

¿Anulado? lcd1602_Display(const? Uchar? *ptr, uchar? línea)

{

Uchar? ¿datos? I = 0;

Uchar? *¿datos? q;

q = ptr

Interruptor (línea)

{

¿Caso? 0:

LCD 1602 _ escribir cmd(0x 80);

Y (q!=NULL? amp amp? (*q!='\0')? amp amp? I lt16)

{

LCD 1602 _ WriteData(* q

q

i; p>}

Rotura;

¿Caso? 1:

LCD 1602 _ escribe cmd(0xc 0);

Y (q!=NULL? amp amp? (*q!='\0')? amp amp? I lt16)

{

LCD 1602 _ WriteData(* q

q

i; p>}

Romper;

}

}

Uchar? kbscan(inválido)

{

¿No está firmado? ¿Ciel? sccode, recode

P3 = 0x0f; //Enviar 0 escaneo, entrada de línea de columna

Si? ((P3? amp?0x0f)?!=?0x0f)//Se presiona una tecla.

{

Retraso(20);? //Retraso en el rebote

¿Y si? ((P3 amp;0x0f)!=?0x0f)

{

código sc? =?0xef//Valor inicial del escaneo progresivo

while((sc code amp; 0x01)!=0)

{

P3 = sc code <; /p>

if ((P3 amp; 0x0f)!=0x0f)

{

recodificar = (P3 amp; 0x0f)| p> while ((P3 & 0x0f) != 0x0f); // Espere a que se presente la clave.

return((~ código sc) (~ recodificar));

? }

Otro

código sc =(código sc lt; lt1)| 0x 01;

}

}

}

¿Volver? 0; //Sin botón, devuelve 0.

}

¿Uchar? getkey(void)

{

Uchar? clave;

clave = kbs can();

if(clave == 0){ clave val = 0x ff; retorno(0);}

Cambiar (tecla)

{

¿Caso? 0x 11: keyval = 7;

¿Caso? 0x 12: keyval = 4;

¿Caso? 0x 14: keyval = 1; romper;

¿Caso? 0x 18: keyval = 10; romper;

¿Caso? 0x 21: keyval = 8;

¿Caso? 0x 22: keyval = 5; romper;

¿Caso? 0x 24: keyval = 2; romper;

¿Caso? 0x 28: keyval = 0;

¿Caso? 0x 41: keyval = 9;

¿Caso? 0x 42: keyval = 6;

¿Caso? 0x 44: keyval = 3;

¿Caso? 0x 48: clave val = 11;

¿Caso? 0x 81: keyval = 12; romper;

¿Caso? 0x 82: clave val = 13;

¿Caso? 0x 84: clave val = 14;

¿Caso? 0x 88: key val = 15; break;

Valor predeterminado: keyval = 0xff break

}

Si (keyval!=0xff) devuelve (1 );

¿Y si? return(0);

}

main()

{

Uchar? número

LCD 1602 _ Init();

lcd1602_Display(str, 0);

mientras(1)

{

p>

if(getkey())

{

if(keyval lt; 10)keystr[num]= keyval 0x 30;

¿De lo contrario, tela de lana? clavestr[num]= keyval-10 'A';

lcd1602_Display(keystr, 1);

num;

num = 16;

}

}

}