Ayuda: El reinicio del botón Mega16 no es muy bueno, no se reinicia después del encendido, ¿por qué?
//////////////////////////////////////////// // ///////////////////
// Archivo: KEY_Interrupt.C //
// Entorno: compilado en ICC AVR6 31A, emulado como AVR Studio4.12sp4 //
// Hardware: chip ATMEGA16 //
// Fecha: 28 de mayo de 2007 //
<. p >// Función: Escanee el tubo digital regularmente, presione las teclas INT0 e INT1 e interrumpa en el flanco descendente para hacer //// que el valor de la tecla aumente o disminuya en 1 respectivamente.
//
// Observaciones: //
//////////////////////////// / ///////////////////////////////////
#include lt;iom16v.hgt ; // Contiene el archivo de encabezado del modelo del microcontrolador
#include lt; macros.hgt; //Contiene el archivo de encabezado de operación "bit"
#include lt;delay.hgt; /Contiene el archivo de encabezado de retraso
#include lt;AVR_XQV12.hgt; //Contiene archivos de encabezado de definición de macros y funciones comunes
/********** ******* ****************************************/
/** **** Nombre de la función: Int0_isr() ******/
/****** Función: la función de interrupción INT0 aumenta el valor de la clave en 1 * *****/
/****** Parámetros: Ninguno ******/
/****** Valor de retorno: Ninguno ** ****/
/****** p>
/*************************** *********************** *************/
#pragma interrupt_handler Int0_isr: 2
void Int0_isr(void)
{
delay_nms(20); //Retraso de unos 20 milisegundos, rebote
if(KEY0) ==0) //Determinar nuevamente si la tecla está presionada
{
while(KEY0==0); //Esperar a que se suelte la tecla
Key_Number; //Aumentar el valor de la clave en 1
}
} p>
/************** ******************************** ***********/
/****** Nombre de la función: Int1_isr() ******/
/*** *** Función: función de interrupción INT1, disminuye el valor de la clave en 1 * *****/
/****** Parámetros: Ninguno ******/
/****** Valor de retorno: Ninguno** ****/
/************************************** ******************/
#pragma interrupt_handler Int1_isr: 3
void Int1_isr(void)
p>
{
delay_nms(20); //Retraso de unos 20 milisegundos, rebote
if(KEY1==0) //Verifique nuevamente si la tecla está presionada
{
while(KEY1==0); //Espera a que se libere la clave
Key_Number-- //Disminuye el valor de la clave en 1.
}
}
/*************************** ********** **********************/
/****** Nombre de la función: Timer0_ovf_isr() ***** */
/****** Función: interrupción de desbordamiento del Timer0, escaneo de tubo digital******/
/** **** Parámetro: Ninguno* *****/
/****** Valor de retorno: Ninguno******/
/*** ********* ******************************************* *******/
#pragma interrupt_handler Timer0_ovf_isr: 10
void Timer0_ovf_isr(void)
{
Display_One_SMG( 1,Key_Number/10); //En la segunda posición el tubo digital muestra el dígito de las decenas
Display_One_SMG(0, Key_Number10); //El primer tubo digital muestra el dígito de las unidades
}
/**** ************************************* *************** */
/****** Nombre de la función: Timer0_Init() ******/
/****** Función: Programa de inicialización Timer0** ****/
/****** Parámetros: Ninguno ******/
/****** Valor de retorno: Ninguno*** ***/
/************************ ******************* *******************/
void Timer0_Init(void)
{
TCCR0 = 0x00; / /Detener el funcionamiento del temporizador0
TCNT0 = 0x00; //Borrar TCNT0
TCCR0|=(1lt ;lt;CS02); //Inicia Timer0, el reloj del sistema se divide por 256
}
/****************** ********************** *******************/
/** **** Nombre de la función: principal()
******/
/****** Función: escanea periódicamente el tubo digital, botones INT0, INT1 ******/
/** * *** El flanco descendente desencadena una interrupción, lo que hace que los valores clave se incrementen y ******/
/****** disminuyan en 1 respectivamente. ******/
/****** Parámetros: Ninguno ******/
/****** Valor de retorno: Ninguno* *****/
/************************************ *******************/
void main(void)
{
CLI() ; //Desactivar interrupciones
CPU_Init(); //Inicializar CPU
Timer0_Init(); //Inicializar temporizador 0
MCUCR|=(1lt; lt;ISC11)|(1lt;lt;ISC01); //Establece la interrupción del disparador de flanco descendente de INT0 e INT1
GICR|=(1lt;lt;INT1)|(1lt;lt;INT0) ; //Habilitar interrupciones INT0, INT1
TIMSK|=(1lt;lt;TOIE0); //Habilitar interrupción de desbordamiento del Timer0
SEI(); //Activar interrupción
SEI(); p >
while(1); //Pausa dinámica
}
2009-07-17, 11:49:04 Datos Correo electrónico Responder Cita Responder Editar Eliminar
1F TAIYUAN
Puntos: 9
Facción:
Nivel: ------
De:
#pragma interrupt_handler Timer0_ovf_isr: 10
void Timer0_ovf_isr(void)
{
Display_One_SMG(1,Key_Number/10); Muestra el dígito de las decenas en el segundo tubo digital
Display_One_SMG(0, Key_Number10); //Muestra el dígito de las unidades en el primer tubo digital
}
Sí No es que TCNT0 no se reinicialice en esta función Intente cambiarlo a lo siguiente:
#pragma interrupt_handler Timer0_ovf_isr: 10
void Timer0_ovf_isr(void)
{ p>
TCNT0=0X00;
Display_One_SMG(1, Key_Number/10); //Muestra el dígito de las decenas en el segundo tubo digital
Display_One_SMG( 0, Key_Number10); //Muestra el dígito de las unidades en el primer tubo digital
}