¿Cuál es la razón por la cual el microcontrolador LCD1602 del calendario perpetuo 51 no se muestra?
¿#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); p>
}
/*
****************************** ** **********
*?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>
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;
}
}
}