¿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***// p > {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 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
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;}
} p>
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; p>
caso 3: Primero=mul(Fin,Primero);romper;
caso 4: Primero=div(Fin,Primero);romper;
} p>
End=First; //Guardar el resultado final de la operación
f=0; //Borrar indicador de operación
}
} p>
display(); //Llamar al programa de visualización
}
}