Cómo hacer una calculadora LCD usando un microcontrolador 51 para realizar dos cálculos simples
#define?LCD1602_PORT?P0
#includelt;reg51.hgt;
#includelt;stddef.hgt;
#define?uchar?unsigned?char
sbit?lcd1602_rs=P2^0;
sbit?lcd1602_e=P2^2;
sbit?lcd1602_rw =P2^1;
sbit?lcd1602_busy=P0^ 7;
uchar?str[]="Calculadora Simple";
uchar?keyval,keystr[ 16];
void?delay(uchar?a)
{
uchar?i;
while(a--) for(i=0;ilt;120;i);
}
/*
*************** *** ************************* *?Nombre de la función: lcd1602_CheckBusy() *?Función de la función: consulta de estado
***** *******************************
*/
void?lcd1602_CheckBusy ()
{
hacer
{
lcd1602_busy=1
lcd1602_rs =0;
p>
lcd1602_rw=1
lcd1602_e=0
lcd1602_e=1; /p>
while(lcd1602_busy) ;
}
/*
*************** *************** ****************** *?Nombre de función: ?lcd1602_WriteCmd() *?Función de función: comando de escritura* ?Parámetro de entrada: palabra de comando*?Parámetro de salida: ninguno
********************************* ***********
*/
void?lcd1602_WriteCmd(const?uchar?cmd)
{
lcd1602_ CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1
LCD1602_PORT=cmd;
lcd1602_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ámetro de salida: ninguno
* ************************* *******************
*
*/
void?lcd1602_WriteData(const?uchar?c)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0
lcd1602_e=1; ;
}
/*
*************************** ***** ************************* *?Nombre de la función: lcd1602_Init() *?Función de la función: Inicializar LCD *?Parámetros de entrada: Ninguno *?Parámetros de salida: Ninguno
*************************************** *********** ***
*/
void?lcd1602_Init()
{
lcd1602_WriteCmd(0x38); //el modo de visualización es matriz de puntos de 8 bits, 2 filas, 5*7
lcd1602_WriteCmd(0x0c);//display, flag, flash, enable,
lcd1602_WriteCmd (0x06); ?//bandera se mueve hacia la derecha, la pantalla no se mueve
lcd1602_WriteCmd(0x01);?//clear?screen
}
/*
* **************************************** ******** *?Nombre de la función: lcd1602_Display() *?Función de la función: ?Visualización de caracteres*?Parámetros de entrada: ptr - carácter o puntero de cadena*?Parámetros de salida: Ninguno*?Descripción: Los usuarios pueden llamar al siguientes formas: *1) lcd1602_Display("¡Hola, mundo!"); *2)?INT8U?storage type?txt[]="Cadena a mostrar" o ?INT8U?storage type?txt[]={' t', 'x', 't', ...,'\0'}; *?INT8U?*ptr; *?ptr=amp;txt; *?lcd1602_Display(ptr); ); *? o?lcd1602_Display(amp;txt);
****************************** *********** *******
*/
void?lcd1602_Display(const?uchar?*ptr, uchar?line)
{
uchar?data?i=0;
uchar?*data?q;
q=ptr; p>
switch(line)
{
case?:
lcd1602_WriteCmd(0x80);
while(q! =NULL?amp;amp;?(*q! ='\0')?amp;amp;?ilt;16)
{
<p> lcd1602_WriteData(*q);
q
i
}
romper; case?1:
lcd1602_WriteCmd(0xc0);
while(q!=NULL?amp;amp;?(*q!='\0')?amp;amp; ?ilt; 16)
{
lcd1602_WriteData(*q); > }
descanso;
}
}
uchar?kbscan(void)
{ p>
unsigned?//Enviar 0 escaneo, entrada de fila de columna
if((P3?amp;?0x0f)?! =?0x0f)?//Botón presionado
{
delay(20); //retraso en la eliminación de fluctuaciones
if?((P3amp;0x0f)!=?0x0f)
{
sccode?=?0xef; //escaneo inicial línea por línea
while((sccodeamp;0x01)!=0)
{
p>
P3=sccode;
if((P3amp;0x0f)!=0x0f)
{
recode=(P3amp ;0x0f)| 0xf0;
while((P3amp;0x0f)!=0x0f); //espera a que se levante la tecla
return ((~sccode) (~recode)) ;
?}
else
sccode=(sccodelt;lt;1)|0x01;
}
}
}
}
return?0;?// Si no hay clave, devuelve 0
}
uchar ?getkey(void)
{
uchar?key;
key=kbscan();
if(clave==0 ){keyval=0xff; return(0);}<
cambiar(clave)
{
caso?x11: keyval=7; romper;
caso?0x12: keyval=4;
caso?0x14: keyval=1; : keyval=10;
caso?0x21: keyval=8;
caso?x22: keyval=5; 0x24: keyval=2; romper;
caso?0x28: keyval=0; romper;
caso?0x41: keyval=9;
caso ?0x42: keyval=6; romper;
caso?x44: keyval=3; romper;
caso?0x48
:keyval=11;
caso?0x81:keyval=12;
caso?0x82:keyval=13; x88: keyval=15; romper;
predeterminado: keyval=0xff;
}
if(keyval!=0xff)return(1);
else?cleardis(void)
{
uchar?i;
for(i=0;ilt;16;i )keystr[i]='?';
lcd1602_Display(keystr, 1);
}