Papel de calculadora simple de 51 microcontroladores
Primera versión: MOV 78H, # 0; Inicialización: 78H contiene 0 código y el resto.
MOV 79H, #10
MOV 7AH, #10
MOV 7BH, #10
MOV 7CH, #10 p> p>
MOV 7DH, #10
MOV R5, # 0; R5 es el número de pulsaciones de teclas, inicialmente establecido en 0.
MOV 30H, # 0; 30H es la unidad de almacenamiento de la tecla de función, establecida en 0.
MOV 40H, #0; La unidad 40H está inicialmente configurada en 0.
MOV 41H, #0; la celda 41H está inicialmente configurada en 0.
Bucle: LCALL DIR
LCALL KEY
INC R5
Rutina de dispersión para determinar qué tecla se presionó.
S1: CJNE A, #10, S2; si no es la tecla "+", salta a S2.
LJMP es divertido; es el botón "+" para saltar a la diversión.
S2: CJNE A, #11, S3; si no es la tecla "-", salta a S3.
LJMP es divertido; es la tecla "-" para saltar a DIVERSIÓN.
S3: CJNE A, #12, S4; si no es la tecla "*", salta a S4.
LJMP es divertido; es la tecla "*" para saltar a DIVERSIÓN.
S4: CJNE A, #13, S5; si no es la tecla "/", salta a S5.
LJMP es divertido; es la tecla "/" para saltar a DIVERSIÓN.
S5: CJNE A, #14, S6; si no es la tecla "=", salta a S6.
LJMP es divertido; solo usa la tecla "=" para saltar y divertirte.
S6: CJNE A, #15, n 1; no la tecla "CL", salta a N1.
Se inicia LJMP; es la tecla "CL" y se inicia el salto.
N1: CJNE R5, #1, N2; determinar el número de veces que se presiona el botón
LJMP D11
N2: CJNE R5, #2, N3
p>
LJMP T2
N3:CJNE R5, #3, N4
LJMP T3
N4: CJNE R5, #4, N5
p>LJMP T4
N5:CJNE R5, #5, N6
LJMP T5
N6 : CJNE R5, #6, inicio
p>LJMP T6
MOV·R4
MOV 78H, A el valor de entrada se envía al bit de visualización; buffer.
MOV 79H, #10
MOV 7AH, #10
MOV 7BH, #10
MOV 7CH, #10 p> p>
MOV 7DH, #10
bucle LJMP
T2:MOV·R7
MOV B, #10
R4 MOV
MUL AB
Agregar A, R7
MOV·R4
MOV 7AH, #10
MOV 7BH, #10
MOV 7CH, #10
MOV 7DH, #10
MOV 79H, 78H uno a diez.
MOV 78H, R7; el nuevo número es de un dígito.
Bucle LJMP
T3:MOV R7, A
MOV B, #10
R4 MOV
MUL AB
Agregar A, R7
MOV·R4
MOV 7BH, #10
MOV 7CH, #10 p >
MOV 7DH, #10
MOV 7AH, 79H diez a cien
MOV 79H, 78H uno a diez.
MOV 78H, R7; el nuevo número es de un dígito.
Bucle LJMP
T4:MOV·R7
MOV B, #10
R4 MOV
MUL AB
Agregar A, R7
MOV·R4
MOV 7CH, #10
MOV 7DH, #10
MOV 7BH, 7AH
MOV 7AH, 79H
MOV 79H, 78H
MOV 78H, R7
Carretera de circunvalación LJMP
T5:MOV R7, A
MOV B, #10
R4 MOV
MUL AB
Añadir A, R7
MOV·R4
MOV 7DH, #10
MOV 7CH, 7BH
MOV 7BH, 7AH
MOV 7BH, 7AH< / p>
MOV 7AH, 79H
MOV 79H, 78H
MOV 78H, R7
bucle LJMP
T6 :MOV R7, A
MOV B, #10
R4 MOV
MUL AB
Agregar A, R7
MOV·R4
MOV 7DH, 7CH
MOV 7CH, 7BH
MOV 7BH, 7AH
MOV 7AH, 79H p>
MOV 79H, 78H
MOV 78H, R7
bucle LJMP
MOV 7CH, 7BH
MOV 7BH, 7AH
MOV 7AH, 79H
MOV 79H, 78H
MOV 78H, R7
Bucle LJMP
Diversión: MOV 78H, #10
MOV 79H, #10
MOV 7AH, #10
MOV R0, 30h con el último Intercambio de teclas de función;
MOV 30H, A
MOV A, R0
CJNE A, #10, diversión 1; tecla de función de juez
LJMP ADDY "+"
FUN1:CJNE A,#11,FUN2
LJMP SUBT;"-"
FUN2:CJNE A,#12, FUN3 p>
LJMP MULT;"*"
FUN3:CJNE A, #13, FUN4
LJMP DIVI"/"
FUN4 :CJNE A , #14, FUN5 Presione la tecla de función por primera vez, es decir, A=#0.
LJMP EQUA"="
FUN5:MOV 40H, R4; guardar el primer número
MOV R5, # 0; borrar el número de pulsaciones de teclas
p>
p>
LJMP BCD lo descompone en código bcd para su posterior visualización.
: LJMP inicia; procesamiento de desbordamiento
Eddie: MOV A, el primer número de 40H se envía al acumulador
Suma uno, R4; un segundo número
JB CY, OF; desbordamiento
MOV 40H, A; guardar este resultado
MOV R5, # 0; >
LJMP BCD
SUBT:MOV A, 40H
R4 SUBB
JB CY, OF
MOV 40H, A
MOV R5, #0
LJMP BCD
MULT:MOV A, 40H
Bahía MOV
R4 MOV
MUL AB
JB OV
MOV 40H, A
MOV R5, #0
LJMP BCD
DIVI:DIVI A·R4
Bahía MOV
MOV A, 40H
División AB
JB OV
MOV 40H, A
MOV R5, #0
LJMP BCD
Ecuación: MOV R5, #0
LJMP BCD
BCD: MOV B, #10
MOV A, 40H El resultado se envía al acumulador.
Divide el resultado de DIV AB por 10
MOV 41H, A; almacena temporalmente "negocios"
MOV A, B toma un dígito
MOV 78H, A; el número de unidad enviado al búfer de visualización.
MOV A, 41H
Regresión JZ; el resultado es de un solo dígito, devuelve LOOP.
MOV B, #10
MOV A, 41H
División AB
MOV 41H, A
MOV A, B
MOV 79H, A; búfer de visualización de diez dígitos
MOV A, 41H
Regresión JZ; , esto devolverá el bucle.
MOV 7AH, A; caché de visualización de transmisión de cientos de dígitos
Retorno: bucle LJMP
subrutina de visualización dinámica
Director: MOV·; DPTR, #TAB dirección de encabezado de decodificación de tubo digital
MOV R0, #78H dirección de bits del buffer a mostrar
MOV A, #0FEH señal de selección de bits unitarios
p >MOV R1, A
LD1:MOV A, @R0
MOVC A, @ A+DPTR; consultar tabla
MOV P2, r 1; * * *La selección de bits de palabra del tubo de ánodo se envía al puerto P2.
MOV P0,A; el código de campo se envía al puerto P0.
LCALL retardo 1 ms; ajuste de retardo subrutina 1 ms
INC R0R0 apunta al siguiente módulo.
MOV A, r 1;
JNB ACC.5, LD2 determina si se envían 6 dígitos.
RL A; apunta al siguiente bit
MOV R1, A; la señal de selección de bit se almacena nuevamente en R3.
SJMP LD 1; salta para mostrar el siguiente número.
LD2:RET; regresa después de enviar 6 números.
TAB:DB 0C0H, 0F9H, 0A4H, 0B0H, 099H, 092H, 082H, 0F8H, 80H, 90H, 0FFH* * *Tabla de decodificación de ánodos
Retraso 1 milisegundo: MOV R6 , 2do
LOOP1: MOV R7, #248
no se proporciona lo contrario a menos que se especifique lo contrario
Bucle 2: DJNZ R7, Loop 2
>DJNZ R6, LOOP1
Remojar en agua para suavizar
TECLA: LCALL KS; subrutina de tecla de detección de llamadas
JNZ k 1; para continuar.
LCALL DELAY2 rebote de retardo de llamada con tecla sin llave
Pantalla dinámica de llamada ACALL DIR
tecla AJMP para regresar al botón de detección continua
k 1; :LCALL retardo 2; hay una fluctuación de retardo del botón.
LCALL KS luego llama a la subrutina de detección perla-perla.
JNZ K2 confirma que hay un botón para pasar al siguiente paso.
Pantalla dinámica de llamada ACALL DIR
Tecla AJMP; presione la tecla No para regresar y continuar con la detección.
K2:MOV R2, # 0EFH envía el valor escaneado a R2 para su almacenamiento temporal.
MOV R3, #00H envía el valor de la primera columna a R3 para su almacenamiento temporal.
K3:MOV P1, R2; envía el valor de R2 al puerto P1.
L0:JB P1.0, l 1; P1.0 es igual a 1. Salta a L1.
MOV A,#00H envía la primera línea de valores a ACC.
AJMP LK salta al controlador de valores clave
L1:JB P1.1, L2; P1.1 es igual a 1 y salta a L2.
MOV A, #04H envía el valor de la segunda fila a ACC.
AJMP LK salta al controlador de valores clave
L2:JB P1.2, L3; P1.2 es igual a 1 y salta a L3.
MOV A, #08H envía el valor de la tercera línea a ACC.
AJMP LK salta al controlador de valores clave
L3:JB P1.3, siguiente; P1.3 es igual a 1 para saltar a la página siguiente.
MOV A, # 0CH envía el valor de la cuarta línea a ACC.
LK: agregue uno, R3; se envía el valor clave después de agregar el valor de la fila y el valor de la columna.
Envíe el valor en ACC a la pila para almacenamiento temporal.
K4:LCALL retardo 2; llama al programa antirrebote de retardo.
LCALL KS llama al programa de detección de claves
JNZ K4; la clave no se suelta y continúa volviendo al estado de detección.
POP ACC envía valor de pila a ACC
MOV·DPTR,#keyboard
MOVC A,@A+DPTR
Remojo en agua Hacer suave
Siguiente: se envía el valor de la columna INC R3 más 1
MOV A, R2;
JNB acelera 7, ajusta; después de escanear, ve a la tecla para el siguiente escaneo.
RL A; El escaneo aún no se ha completado. Mueva el valor una posición hacia la izquierda para escanear la siguiente columna.
MOV·R2; Envía el valor ACC a R2 para almacenamiento temporal.
AJMP K3 salta a K3 para continuar.
KS:MOV P1, # 0FH establece P1, los cuatro bits superiores son 0 y los cuatro bits inferiores son 1.
MOV A, p 1; leer el puerto P1.
XRL A,#0FH distingue el valor en del valor en o
La subrutina RET devuelve
KEYTAB: DB 1, 2, 3, 10, 4 , 5, 6, 11, 7, 8, 9, 12, 15, 0, 14, 13; tabla de valores clave
Retraso 2: MOV R6, # 2H Subprograma de antirrebote de retardo
LP1: MOV R7, #0FAH
LP2: DJNZ R7, LP2
DJNZ R6, LP1
Remojar en agua para suavizar
p>Fin