Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo hacer una calculadora LCD usando un microcontrolador 51 para realizar dos cálculos simples

Cómo hacer una calculadora LCD usando un microcontrolador 51 para realizar dos cálculos simples

#define?LCD1602_FLAG

#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;

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)

{

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);

}