249 código fuente
Si no puedes ver mi blog claramente:/blog/static/1738 554182010103094346593/
El siguiente es el código fuente:
/*** ******************************************* ******** ******
*Nombre de archivo: main.c*
*Función de archivo: realizar escaneo de teclado matricial, pantalla LED y comunicación entre dos microcontroladores.
? *
*Proyecto:? Ninguno*
*Observaciones:? *
* - *
*Número de versión: ¿v0.1T? *
*Fundador: Wan Xun*
*Fecha de creación: 2010-11-30?21:33:42?*
*Fecha de modificación: 2010 -11-30?21:33:44?*
* - *
*Tipo de chip:? ¿Se pueden utilizar las series AT89C51, STC89C54, 51? *
*Usar oscilador de cristal:? 11.0592 MHz*
*Entorno de compilación:? ¿KEILC3.51? *
* - *
*Composición del módulo:? No hay *
* modificador de compilación:? Ninguno*
****************************************** ** *******************
*Nota:
*
**** ** ************************************************* *** ***/
/************************************ ******* **********************
Descripción de la actualización:
***** ******* ******************************************* ******/
/************************************ ************ ***************
* * * * * * * * * * * * * * * * * * * * ¿Debería serlo? ¿usar? ¿capital? ¿Material? ****************************
****************** ******** ****************************************/ p>
/** ******************************************* ********* *******
************************?Referencia del archivo ¿parte? ****************************
****************** ******** ****************************************/ p>
#¿Incluir? ltreg 51.h gt;
/************************************ ****************************
****************** ******** ****?Configuración de parámetros? ****************************
****************** ****** ****************************************/
/* - *
*X-? ¿Parámetros de configuración del sistema? *
* - */
//Definir el reloj del sistema
#Definición? ¿FOSC? 11059200?/*?Definición de oscilador de cristal microcontrolador*/
#Definición? FDIV? 12?/*?Frecuencia MCU*/
//Definir la velocidad en baudios del puerto serie
#Definición? ¿Alfarero? 9600?/*?baudios del puerto serie
Velocidad, el modo predeterminado es 1 bit de datos, un bit de parada, sin verificación*/
//Defina los parámetros relevantes del tubo digital LED.
¿#Definición? ¿LEDDLY? 10/*?Intervalo de tiempo de escaneo dinámico del LED, la unidad es ms? */
#¿Definición? ¿LEDCPOL1? /*?Tipo de LED, (afecta la polaridad del variador), 0*** tubo digital hembra, 1*** tubo digital macho*/
/*?0: * *Yin (CC)? Cátodo, 1: * *Ánodo (calcio) ánodo*/
/****************************** ***** *******************************
******* ********** *************?¿Conexión de hardware? ****************************
****************** ****** ****************************************/
/* - *
*Conexión X-Hardware*
* - */
//Diodo emisor de luz
//Segmento LED ¿El código está conectado al puerto P0 y a~g están conectados respectivamente? P0.0~P0.6, dp está conectado a P0.7.
//El código LED está conectado al puerto P1 y S1~S6 están conectados a P1.0~P1.5 respectivamente.
//Teclado matricial
//H [4...1] corresponde a P2 [7...4]
//V[4 ..1] corresponde a P2[3..0]
//La conexión cruzada del puerto serie de dos microcontroladores.
/****************************************** *******************
************************ ?Definición de cantidad global? *************************
****************** *******************************************/
/ * - *
*?Constante global? *
* - */
constante? ¿No firmado? ¿Ciel? ¿LedTab_CA[11]? =/*?* * *Tabla de códigos del segmento Yang*/
{?0xC0, /*0*/
0xF9, /*1*/
0xA4, /*2*/
0xB0, /*3*/
0x99, /*4*/
0x92, /*5*/
0x82, /*6*/
0xF8, /*7*/
0x80, /*8*/
0x90, /*9*/?
0xFF, /*? */
};
const? ¿No firmado? ¿Ciel? ¿LedTab_CC[11]? =/*?* * *Tabla de códigos del segmento Yin*/
{?0x3F, /*0*/
0x06, /*1*/
0x5B, /*2*/
0x4F, /*3*/
0x66, /*4*/
0x6D, /*5*/
0x7D, /*6*/
0x07, /*7*/
0x7F, /*8*/
0x6F, /*9*/
0x00, /*? */
};
const? ¿No firmado? ¿Ciel? ¿LedCs_CA[6]? =
{0x01, 0x02, 0x04, 0x08, 0x10, 0x20}.
¿constante? ¿No firmado? ¿Ciel? LedCs_CC[6]? =
{0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0x df};
#Si? LEDCPOL
¿#Definición? ¿LedTab? LedTab_CA
¿#Definición? LedCsLedCs_CA
#De lo contrario
#¿Definición? ¿LedTab? LedTab_CC
¿#Definición? LedCsLedCs_CC
#endif
/* - *
*?¿Declaración de variable global? *
* - */
¿Variables? ¿No firmado? ¿Ciel? LED_Buff[6]={5, 10, 10, 10, 10, 5}; /*? ¿La matriz 0~5 corresponde al tubo Xie Ni S1~S6? */
/****************************************** *******************
************************ ?Área de declaración de funciones? *************************
********************* ***** *******************************************/ p>
¿Anulado? retraso _ 10 ms (nulo);
¿Sin firmar? ¿Ciel? escaneo de clave (void);
¿No válido? UART_Tran(unsigned?char?dat);
¿Sin firmar? ¿Ciel? UART _ Rec(void);
¿Nulo? SysInit(void);
/*************************************** ***** *************************
/?Función: función de retardo de 10 ms
/?Fecha de modificación: 2010 -11-30?21:34:02
/?Parámetros de entrada: Ninguno
/?Parámetros de salida: Ninguno
/ ?Instrucciones de uso: Ninguna
*************************************** *********** ****************/
¿Anulado? retraso _ 10 milisegundos (no válido)
{
¿Sin firmar? ¿Ciel? A, B;
for(b = 249; b gt0; b -)
for(a = 17; a gt0; a-);
}
/****************************************** * *******************
/?Función: Se utiliza para visualización dinámica LED.
/?Fecha de modificación: 2010-11-30?21:34:04
/?Parámetros de entrada: Ninguno
/?Parámetros de salida: Ninguno
/?Instrucciones de uso: Ninguna
****************************** ****** ****************************/
¿Anulado? Timer0_IRQ_Handler (nulo)? ¿interrumpir? 1?Uso? 2
{
¿Electricidad estática? ¿No firmado? ¿Ciel? ¿LedCsCnt? =?0;
TL0? =?(unsigned?char)((65536?-(FOSC/FDIV/1000 * led ly)) 256);
TH0? =?(unsigned?char)((65536?-(FOSC/FDIV/1000 * led ly))/256);
P1? = *(led cs led cscnt);
P0? = *(pestaña LED LED _ Buff[LED cscnt]);?
¿LedCsCnt? =?(LedCsCnt 1) 6;?
}
//********************************* *** *************************
//Nombre de función: teclascan(void)
// Función: El programa de escaneo de claves, que utiliza el método de escaneo de inversión de filas y columnas, no admite combinaciones de teclas.
//Parámetro formal: ¿sin firmar? Devuelve el código ASCII de la clave.
//Parámetros de retorno: Ninguno
//Instrucciones de uso: utilice el método de escaneo de inversión de filas y columnas, ¿no admite combinaciones de teclas?
//Tabla de códigos de teclado: KeyPort de la interfaz del teclado, ¿donde las filas corresponden a bits altos y las columnas corresponden a bits bajos? Los valores clave están en el archivo de encabezado.
//Se ha completado la definición de la macro.
//EDB7? Bajo:?
//E'1''2''3 'Confirmar
//D'4''5''6 'Enviar
//B '7''8''9'NC
//7NC? 0'NCNC
//Bit alto
//*************************** * ****************************
¿No está firmado? ¿Ciel? Escaneo de claves (no válido)
{
¿Sin firmar? ¿Ciel? cord_h, cord_l, cord_key//Valores de filas y columnas
P2 = 0x0f; //Las salidas de filas y líneas son todas 0.
cordón_h? =?P2? ¿amperio? 0x0f? //Leer los valores de columna y fila
if (cord_h!=0x0f)? //Primero verifica si el botón está presionado.
{
delay _ 10ms(); //Retraso en el rebote
if(cord_h!=0x0f)
{ p >
¿P2 y 0x0f? //Leer los valores de columna y fila
P2 = cord _ h | 0xf 0;? // Muestra el valor de la columna actual.
P2&0xf0? //Lee el valor de la fila
cord _ key = cord _ h cord _ l //El último valor del código de combinación del teclado
}
De lo contrario, ¿paño de lana? ¿cordón_llave? =?0xFF? //No se presionó ninguna tecla
}
¿Qué más? ¿cordón_llave? =?0xFF? //No se presionó ninguna tecla
Interruptor (tecla de cuerda)
{
¿Caso? 0xee: cord_key = 1; roto;? //'1'
¿Caso? 0x ed: cord_key = 2; roto;? //'2'
¿Caso? 0xeb: cord_key = 3; roto;? //'3'
¿Caso? 0xe 7: cord_key = 11; roto;? //¿Confirmar
caso? 0x de: cord_key = 4; romper;? //'4'
¿Caso? 0x DD: cord_key = 5; roto;? //'5'
¿Caso? 0x db: cord_key = 6; roto;? //'6'
¿Caso? 0xd 7: cord_key = 12; romper; // enviar
caso? 0x ser: cord_key = 7; romper;? //'7'
¿Caso? 0x BD: cord_key = 8; roto;? //'8'
¿Caso? 0x bb: cord_key = 9; roto;? //'9'
¿Caso? 0x7d: cord_key = 0; roto;? //'0'
Predeterminado: cord_key = 255? //Sin botón.
}
¿Volver? cable _ llave
}
/********************************* *** ****************************
/?Función: Transmisión de datos por comunicación serie
/?Fecha de modificación: 2010-11-30?21:34:17
/?Parámetros de entrada: dat? : Datos que deben enviarse a través del puerto serie.
/?Parámetros de salida: Ninguno
/?Instrucciones de uso: Ninguna
****************** ******** ****************************************/
¿Nulo? UART_Tran(unsigned?char?dat)
{
Y (TI?==?0);
TI? =?0;
SBUF? =?dat
}
/********************************* ***** ****************************
/?Función: Interrumpir la recepción de la comunicación serie datos.
/?Fecha de modificación: 2010-11-30?21:34:52
/?Parámetros de entrada: Ninguno
/?Parámetros de salida: del El puerto serie recibió datos.
/?Instrucciones de uso: esta función de recepción necesita utilizar el método de consulta del puerto serie, es decir, juzgar que RI es 1 significa que se han recibido nuevos datos.
********************************************* *** ****************/
¿No está firmado? ¿Ciel? UART_Rec(no válido)
{
RI? =?0;
¿Volver? ((SBUF) 10);? //Evita que los datos recibidos excedan el límite.
}
/************************************ ***********************
/?Función función: función de inicialización
/?Fecha de modificación :2010-11-30?21:36:20
/?Parámetros de entrada: Ninguno
/?Parámetros de salida: Ninguno
/?Instrucciones de uso : Este programa realiza principalmente la inicialización del puerto serie.
********************************************* *** ****************/
¿Anulado? SysInit(empty)
{
//Inicializa los valores TH y TL del temporizador T0 para el escaneo dinámico de LED.
TL0? =?(unsigned?char)((65536?-(FOSC/FDIV/1000 * led ly)) 256);
TH0? =?(unsigned?char)((65536?-(FOSC/FDIV/1000 * led ly))/256);
//Inicializa los valores TH y TL del generador de velocidad en baudios.
¿TH1? =?(unsigned?char)((256?-(FOSC/FDIV/32/BAUD));
SCON?=?0x52
TMOD?=?0x 21;
ET0=?1;
EA?=?1;? //Permitir interrupción completa
TR1=? p>}
/****************************** ********* *********************
/?Función función: función principal
/?Fecha de modificación: 2010-11 -30?21:36:24
/?Parámetros de entrada: Ninguno
/?Parámetros de salida: Ninguno
/?Instrucciones de uso: Ninguna p>
****************************************** *** *********************/
¿Nulo? Principal (no válido)
{
SysInit();
mientras(1)
{
¿Sin firmar? =?0xFF
¿Sin firmar? /p>
keyval.
if(0xFF?!=?keyval)
{
Si (12?==?keyval) p>
{
UART _ Tran(LED _ Buff[0]);
}
¿Qué pasa si (11?==?keyval)? Pulse confirmación.
{
}
Otro
{
*¿LED_Buff? =?keyval 10;
//UART_Tran(LED_Buff[0]);
//UART_Tran(LED_Buff[5]);?
}
}
Si (0?!=?RI)
{
¿Sin firmar? ¿Ciel? datrec
¿Datrec? = UART_Rec();
if(datrec lt; 10)*(LED_Buff 5)? =?datrec
¿Y si? *(LED_Buff 5)? =?10;
}
}
}