Hola, veo que una vez preguntaste sobre un programa en lenguaje C para controlar una lavadora usando un microcontrolador. Me pregunto si puedo echarle un vistazo a tu programa.
Se han ajustado los siguientes programas y el circuito de visualización del botón es visible:
//MCU: utilice los compatibles con la serie 51;
//4× Teclado de 4 matrices: conecte al puerto P1;
//Pantalla digital de dos dígitos: el puerto P0 genera un código de siete segmentos y el puerto P2 genera un código de selección de bits.
/========================================= p>
//El programa en lenguaje C es el siguiente.
/****************************************** *******************
* Nombre de archivo: KEY_LED.c
* Función: Realizar salida de teclado matricial 4×4 , los dos últimos dígitos del tubo digital muestran el valor clave.
********************************************* *** *******************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
tabla de códigos uchar[10] =
uchar seg, t_50ms;
/*************************************** ***** *******************
* Nombre: Delay_1ms()
* Función: Retrasar subrutina, el tiempo de retardo es 1 ms * x
* Entrada: x (número de retrasos por milisegundo)
* Salida: Ninguna
******* ************************************************** * *****/
void Delay_1ms(uint x)
{
uint i
uchar j
p >for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);
}
/***); * ************************************************* ** ********
* Nombre: Display(uchar k)
* Función: Dividir los parámetros en decenas y unidades y mostrarlos respectivamente
* Entrada: k (valor del teclado)
* Salida: el puerto P0 genera un código de siete segmentos, el puerto P2 genera un código de selección de bits
******* ** ************************************************* *** */
void Display(uchar k)
{
P2 = 0 //Blanqueamiento
P0 = tabla; [k / 10];
P2 = 0x02; Delay_1ms(5); //Mostrar dígitos de decenas 5ms
P2 = 0 //Blanqueo
P0; = table[k % 10];
P2 = 0x01; Delay_1ms(5); //Mostrar dígitos de unidades de 5 ms
}
/**** * ************************************************* ** *******
* Nombre: Keyscan()
* Función: P1 está conectado a un botón externo 4×4 y se lee el valor de la clave según el método de escaneo
* Salida: Valor clave 0~15/Si no se presiona ninguna tecla, devuelve 16
************** ************** ************************************* ******/
uchar Keyscan(void )
{
uchar i, j, temp,
Buffer[4] = ;
for(j = 0; j < 4; j++) { //Recorrido cuatro veces
P1 = Buffer[j]; Cada uno de los cuatro bits genera un nivel bajo
temp = 0x01; //Planifica juzgar el bit P1.0 primero
for(i = 0; i < 4; i++) { // Realizar un bucle cuatro veces
if(!(P1 & temp)) //Truncar 1 bit de los cuatro bits inferiores de P1
return (i + j * 4); // Regresar para obtener El valor clave de Si no se presiona ninguna tecla, regresar a 16
} // Jaja, la declaración sustantiva tiene solo 8 líneas, ¡es muy concisa!
/****************************************** ************************
* Nombre: GetKey()
* Función: Leer claves , elimina la inquietud, esperando la liberación de la tecla
* Salida: valor de la clave 0~15/Si no se presiona ninguna tecla, devuelve 16
********** ******* ******************************************* ****/ p>
uchar GetKey(void)
{
uchar Key_Temp1, Key_Temp2 //Valores clave leídos dos veces
<; p> P1 = 0xff;Key_Temp1 = Keyscan(); //Lee las claves primero
if(Key_Temp1 == 16) return 16; return 16
Display(sec); //Usar visualización en lugar de retraso
Key_Temp2 = Keyscan() //Leer la clave nuevamente
if(Key_Temp1 != Key_Temp2) return 16; //Diferente, devuelve 16
while(Keyscan() < 16) //Espera a que se suelte la tecla
Display(sec); esperando
return Key_Temp1;
}
/************************ ************ *******************************
* Nombre: Main()
* Función: Función principal
*************************** **************** *******************************/
void Main(void)
{
uchar Key_Value; //Leer valor clave
sec = 0;
TMOD = 0x01;
TH1
= (65536-50000)/256;
TL1 = (65536-50000)%256;
TR0 = 1;
ET0 = 1; p> p>
EA = 1;
while(1) {
Mostrar(sec); //Mostrar
if (GetKey()); == 10) {
TR0 = 0;
while (TR0 == 0) {
Display(sec); //Display
Key_Value = GetKey();
if (Key_Value < 10) {
seg %= 10;
seg = seg * 10 + Key_Value; p>
}
si (Key_Value == 10) TR0 = 1;
} } }
}
/ ************************************************ *** ************
* Nombre: T0_INT()
* Función: Función de interrupción T0
** *** ************************************************* **** ********/
void T0_INT() interrupción 1
{
TH1 = (65536-50000)/256 ;
TL1 = (65536-50000)%256;
t_50ms++;
if(t_50ms >= 20) {
t_50ms = 0;
seg++;
seg %= 60;
}
}
/** ************************************************* ***** *****/