Red de conocimiento informático - Conocimiento del nombre de dominio - ¿Cómo escribir una calculadora sencilla utilizando el teclado matricial y la pantalla en el tablero experimental del microcontrolador, que requiere la capacidad de sumar, restar, multiplicar y dividir números de uno y dos dígitos?

¿Cómo escribir una calculadora sencilla utilizando el teclado matricial y la pantalla en el tablero experimental del microcontrolador, que requiere la capacidad de sumar, restar, multiplicar y dividir números de uno y dos dígitos?

#include

#define uchar unsigned char

long First,End //Definir variables globales

void delay(int n) //***Retraso del programa***//

{int i,j;

for(i=0;i

{for(j=0;j<50;j++)

;}

}

long add(long x , long y) //***Programa de suma***//

{long z;

z=x+y;

return(z ) ;

}

long sub(long x,long y) //***Programa de resta***//

{long z;< / p>

if(x>=y)

z=x-y;

else

{z=y-x;

z=z+10e6;} //***El bit más alto es 1 para representar un número negativo***//

return(z);

}

long mul(long x,long y) //***Programa de multiplicación***//

{long z;

z=x*y;

return(z);

}

long div(long x,long y) //***Programa de división***//

{z larga;

z=x/y;

return(z);

}

uchar kbscan (void) //***Escáner de teclado***//

{

uchar sccode;

P1=0xf0;

if ((P1&0xf0)!=0xf0) //Enviar las 0 filas del código de escaneo, entrada de columna

{ delay(222); //Retrasar el rebote

if((P1&0xf0) )!=0xf0)

{sccode=0xfe; //Valor inicial de escaneo progresivo

while((sccode&0x10)!=0)

{P1= sccode ; //Código de escaneo de línea de salida

if((P1&0xf0)!=0xf0)

{

return(P1);} //Si se detecta Si a se presiona la tecla, devuelve el valor de la clave

else

sccode=(sccode<<1)|0x01 //Desplaza el código de escaneo de fila una posición hacia la izquierda

}

}

}

volver

(0); //No se presiona ninguna tecla, el valor de retorno es 0

}

void display(void) //***Mostrar programa***//

{int i;

uchar code rel[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe} //Estroboscópico de tubo digital

uchar code led[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //definir 0-9

uchar data num[8];

num[0]=Primero/10000000; //Diez millones de dígitos

num[1]=Primero/1000000%10; //Millones de dígitos

num[2]=Primero/100000%10; //Cien mil dígitos

num[3]=Primero/10000%10; //Diez mil dígitos

num[ 4] =Primero/1000%10; //Dígito de miles

num[5]=Primero/100%10; //Dígito de centenas

num[6]=Primero/10; %10 ; //Dígito de las decenas

num[7]=Primer%10; //Dígito de las unidades

for(i=7;i>=0;i--)

{P3=rel[i]; //Salida de selección de bits

P2=led[num[i]] //Salida de datos

retraso(2) ); //¿Es esencial este retraso?

}

}

void main(void) //***programa principal***//

{ int k ,n;

uchar f,g,key,gn1;

n=0;

f=0;

P0= 0; //La luz indicadora está apagada inicialmente

while(1) //Consulta continuamente si hay una acción clave

{ key=kbscan() //Obtener la devolución valor clave

p>

if(key!=0)

{

switch(key) //Decodificación, convierte el valor de retorno de la clave correspondiente en el valor numérico correspondiente

{

case 0xee: k=0;break;//0

case 0xde: k=1;break;//1

c

ase 0xbe: k=2;break;//2

case 0x7e: k=3;break;//3

case 0xed: k=4;break;//4

caso 0xdd: k=5;break;//5

caso 0xbd: k=6;break;//6

caso 0x7d: k= 7;romper;//7

caso 0xeb: k=8;romper;//8

caso 0xdb: k=9;romper;//9

case 0xbb: k=10;First=0;End=0;f=0;break;//clear

case 0x7b: k=11;break;//equal

case 0xe7: k=12;f=1;break;//Agregar

case 0xd7: k=13;f=2;break;//Restar

case 0xb7 : k=14;f=3;break;//Multiplicación

caso 0x77: k=15;f=4;break;//División

}

P0=1;

delay(280); //El tiempo de visualización de la luz indicadora cuando hay un botón

P0=0 //El indicador del botón se apaga;

if(k<10) //Cuando es una tecla numérica (0-9)

{

if(f!=0) // Cuando es una tecla numérica, si tiene Hay una tecla de función presionada

{

n++ //Registra el número de veces que se presiona la tecla numérica

<; p> gn1=0; //Borra el indicador y úsalo como tecla de función nuevamente. Realiza los cálculos

g=f //Guarda el indicador de cálculo

if(n==; 1) //Cuando la entrada es de cada dígito, asigna el valor directamente

First=k

else if(n>1) //Cuando la entrada es de varios dígitos número, conviértalo en un número decimal de varios dígitos

First=First*10 +k

}

else //Si no se presiona ninguna tecla de función

{

n++

;

gn1=1; //Definir el indicador para detener la entrada de datos cuando se utiliza la siguiente tecla de función

if(n==1)

Primero = k;

else if(n>1)

Primero=Primero*1k;

Fin=Primero //Guarda el primer número

}

}

else if(k>11) //Cuando es una tecla de función (+-*/)

{

if(gn1==1) //Cuando la tecla numérica anterior va seguida de una tecla de función

{

n=0; la bandera de conteo

}

else //Si se ingresa nuevamente la tecla de función, se realizará la operación

{n=0; bandera de conteo

switch(g)

{caso 1: Primero=add(End,First);break;

caso 2: First=sub(Fin ,First);break;

caso 3: First=mul(End,First);break;

caso 4: First=div(End,First);break;}

}

End=First; //Guardar este resultado

}

else if(k==11) //Cuando es el signo igual (=)

{n=0;

gn1=1; //La operación puede continuar cuando la entrada es una tecla de función

cambiar(g)

{ caso 1: Primero=añadir(Fin,Primero);romper;

caso 2: Primero=sub(Fin,Primero);romper;

caso 3: Primero=mul(Fin,Primero);romper;

caso 4: Primero=div(Fin,Primero);romper;

}

End=First; //Guardar el resultado final de la operación

f=0; //Borrar indicador de operación

}

}

display(); //Llamar al programa de visualización

}

}