Enseñarle paso a paso cómo aprender a utilizar la calculadora sencilla del profesor Song Xuesong. ¿Cómo utilizar el microcontrolador de tecnología Puzhong para implementarlo?
/*? S16 S12 S8 S4 son 123 respectivamente
S15 S11 S7 S3 son 456-
S14 S10 S6 S2 son 789*
S13 S9 S5 S1 son 0 respectivamente /
*/
/* Para implementar la operación de dos números, ¿cada número puede tener al menos ocho dígitos?
#includelt; reg52.hgt;
typedef unsigned char uint8
typedef unsigned int uint16
sbit rw= P2^ 5;
sbit rs=P2^6;
sbit e=P2^7;
sbit led=P3^7;
sbit beep=P2^0;
uint8 key, num;
uint8 fuhao; //Define el símbolo específico, ya sea suma, resta, multiplicación o división.
uint8 flag; //Definir si se presiona la tecla de símbolo, este es un término general
long a, b, c, d //Definir el primero y el tercero; datos de operación Dos variables numéricas iguales
uint8 k; //Define el número de dígitos que se muestran después del punto decimal
uint8 biao;
uint8 dat1[] ={1, 2, 3, 0x2b-0x30, 4, 5, 6, 0x2d-0x30, 7, 8, 9, 0x2a-0x30, 0, 0x01-0x30, 0x3d-0x30, 0x2b-0x30 }; los datos mostrados
void delay(uint16 i)
{
while(i--);
}
void lcdwrc(uint8 c)
{
retraso(1000);
rs=0;
rw=0 ;
rw=0; p>
e=0;
P0=c;
e=1;
retraso(1000);
e=0;
}
void lcdwrd(uint8 dat)
{
retraso(1000);
rs=1;
rw=0;
e=0;
e=1;
retraso(1000);
e=0;
}
void lcdinit()
{
retraso(1500);
lcdwrc(0x38);
retraso(500);
lcdwrc(0x38);
retraso(500);
lcdwrc(0x38);
retraso(500);
lcdwrc(0x38);
lcdwrc(0x08);
lcdwrc(0x01);
lcdwrc(0x06);
lcdwrc(0x0c);
clave=0;
num=0;
fuhao=0;
a=0;
b=0; >d=0;
biao=0;
led=0;
}
anulación de teclas nulas()
{
P1 =0xfe; //Deje que la primera línea sea 0 y luego determine qué columna está presionada
if(P1!=0xfe)
{
retraso(1000);
if(P1!=0xfe)
{
key=P1amp;0xf0;
interruptor(tecla) p>
{
caso 0xe0: num=0; //1
caso 0xd0: num; =1; romper; //2
caso 0xb0: num=2; //3
caso 0x70: num=3; /p>
}
}
mientras(P1!=0xfe);
si(num=
=0||num==1||num==2) //Confirma los números 1, 2, 3 en la primera línea
{
if(flag==0 ) //La tecla de símbolo no está presionada
{
//led=1;
a=a*10 dat1[num]; >
}
else
{
//led=1;
b=b*10 dat1[núm] ;
}
}
si(num==3)
{
//led= 0;
flag=1;
fuhao=1; //signo más
}
lcdwrd(0x30 dat1[núm]
}
P1=0xfd; //Deje que la segunda fila sea 0 y determine qué columna se presiona
if(P1!=0xfd)
{
retraso(1000);
if(P1!=0xfd)
{
clave= P1amp; 0xf0;
interruptor(clave)
{
caso 0xe0: num=4; caso 0xd0: num=5; romper; //5
caso 0xb0: num=6; //6
caso 0x70; // Restar—
}
}
while(P1!=0xfd);
if(num==4|| num= =5||num==6)
{
if(flag==0) //La tecla de símbolo no está presionada
{
//led=1;
a=a*10 dat1[num]
}
else
<; p>{//led=1;
b=b*10 dat1[núm]; /p>
else
{
flag=1;
fuhao=2; //Con signo menos de tabla
} p>
lcdwrd(0x30 dat1[num]);
}
P1=0xfb; //Deje que la tercera fila sea 0 y determine qué columna se presiona
si(P1!=0xfb)
{
retraso(1000);
si(P1!=0xfb) p>
{
tecla=P1amp 0xf0;
interruptor(tecla)
{
caso 0xe0: num= 8; romper; //7
caso 0xd0: num=9; //8
caso 0xb0; p>
case 0x70: num=11; break;? //Multiplicar *
}
}
mientras(P1!=0xfb);
if(num==8||num==9||num==10)
{
if(bandera==0) // Tecla sin símbolo pulsada
{
//led=
1;
a=a*10 dat1[núm];
}
otro
{
//led=1;
b=b*10 dat1[num];
}
}
else
{
flag=1;
fuhao=3; //Con signo de multiplicación de tabla*
}
lcdwrd (0x30 dat1[num]);
}
P1=0xf7; //Deje que la cuarta fila sea 0 y determine qué columna se presiona
if( P1 !=0xf7)
{
retraso(1000);
if(P1!=0xf7)
{
clave=P1amp;0xf0;
interruptor(clave)
{
caso 0xe0: num=12;romper; //0< / p>
case 0xd0: num=13; break;? //Borrar primero
case 0xb0: num=14; //Signo igual=
case 0x70 : num=15; romper;? //excepto/
}
}
mientras(P1!=0xf7);
switch(num)
{
caso 12:?
if(flag==0) //La tecla de símbolo no está presionada
{
//led=1;
a=a*10 dat1[núm];
lcdwrd(0x30);
}
else
{
//led=1;
b=b*10 dat1[num];
p>lcdwrd(0x30);
}
romper;
caso 13:?
lcdwrc (0x01); //Comando borrar pantalla
a=0;
b=0
flag=0; =0;
romper;
caso 15:
bandera=1;
fuhao=4; >lcdwrd(0x2f );//signo de división/
romper;
caso 14:?
if(fuhao==1)//agregar p>
{
lcdwrc(0x4f 0x80);
lcdwrc(0x04); //Configura el cursor para moverse hacia la izquierda sin mover la pantalla
c=a b;
p>while(c!=0) //Mostrar un dígito uno por uno
{
lcdwrd(0x30 c10) ; //El último dígito del resultado mostrado está en la posición 0x4f
c=c/10 //Obtiene los datos del resultado anterior
}
lcdwrd; (0x3d); //Mostrar el signo igual= p>
a=0;
b=0
flag=0; >fuhao=0; //Borrar todo a 0 p>
}
if(fuhao==2) //menos
{
lcdwrc(0x4f 0x80);
lcdwrc(0x04);
//Configura el cursor para que se mueva hacia la izquierda y la pantalla para que no se mueva
if(agt; b)
c=a-b;
else
c =b-a;
while(c!=0) //Mostrar uno por uno
{
lcdwrd(0x30 c10); Mostrar el resultado El último bit está en la posición de 0x4f
c=c/10; //Obtener los datos del resultado anterior
}
if(alt ;b) lcdwrd( 0x2d); //Mostrar - signo
lcdwrd(0x3d); //Mostrar signo igual=
a=0;
b =0;
b=0;
p>flag=0;
fuhao=0; //Borrar todo a 0
}
if(fuhao==3)// Multiplicación
{
lcdwrc(0x4f 0x80);
lcdwrc(0x04); ); //Configura el cursor para que se mueva hacia la izquierda y la pantalla no se mueve
c=a*b;
while(c!=0) //Mostrar uno por uno
{
lcdwrd(0x30 c10);/ /Muestra el último dígito del resultado en la posición de 0x4f
c=c/10; los datos del resultado anterior
}
lcdwrd(0x3d) ; //Mostrar signo igual=
a=0; 0;
flag=0;
fuhao=0 ;//Borrar todo a 0
}
if(fuhao== 3)//Multiplicación
{
lcdwrc(0x4f 0x80);
lcdwrc(0x04); //Configura el cursor para moverse hacia la izquierda y la pantalla lo hace. no moverse
c=a*b;
while(c!= 0) //Mostrar uno por uno
{
lcdwrd(0x30 c10); //El último dígito del resultado mostrado está en la posición 0x4f
c =c/10; //Obtener los datos del resultado anterior
}
lcdwrd(0x3d); //Mostrar el signo igual=
a=0;
b=0;
fuhao=0; //Borrar todo a 0
}
if(fuhao==4)
{ p>
k=0;
lcdwrc(0x4f 0x80);
lcdwrc (0x04); //Configura el cursor para moverse hacia la izquierda sin mover la pantalla
c=(long)(((float)a/b)*1000); //Conversión forzada a long.
while(c!=0) //Mostrar uno por uno
{
k;
lcdwrd(0x30 c10); //Muestra el último dígito del resultado en la posición de 0x4f
c=c/10; //Obtiene los datos del resultado anterior
if(k==3) p >
{
lcdwrd(0x2e);
k=0;
}
}
if(a/blt; 0) ? //Si a es menor que b, el bit más alto del resultado de la división es 0
{
lcdwrd(0x30); /p>
}
lcdwrd(0x3d); //Mostrar signo igual
a=0
b=0;
flag=0;
fuhao=0; //Borrar todo a 0
}
romper;
}
}
}
void main()
{
lcdinit();
mientras (1)
{
keyscan();
}
}