Re: Счетчик нажатий на кнопку
Добавлено: Сб май 11, 2013 15:19:08
.. уж лучше опрос по таймеру - жать сюда...Antifritz писал(а):Использовать внешние прерывания
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
.. уж лучше опрос по таймеру - жать сюда...Antifritz писал(а):Использовать внешние прерывания
Код: Выделить всё
void main( void )
{
int i=0;
DDRB=0xFF;
PORTB=0x00;
DDRD = 0x00;
PORTD = 0xFF;
MCUCR |= (0<<ISC01)|(1<<ISC00);
GICR |= (1<<INT0);
#asm("sei")
while(1){
if (PIND.2==0){
i=i+1;
delay_ms(50);
}
switch(i){
case 1:
{
break;
}
case 2:
{
break;
}
case 3:
{
break;
}
default:
i=1;
}
}
}
где Ваш обработчик прерывания?MAndrey90 писал(а):Вот настроил порт инт0, только сейчас у меня не выполняются условия.Код: Выделить всё
MCUCR |= (0<<ISC01)|(1<<ISC00); GICR |= (1<<INT0); #asm("sei")
Код: Выделить всё
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
}Код: Выделить всё
volatile char i=0;
void main( void )
{
DDRB = 0xFF;
PORTB = 0x00;
DDRD = 0x00;
PORTD = 0xFF;
MCUCR |= (1<<ISC01)|(0<<ISC00);// по спаду
GICR |= (1<<INT0);
#asm("sei")
while(1){
switch(i){
case 1: break;
case 2: break;
case 3: break;
default: i=0;
};
}
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
i++;
} Код: Выделить всё
#define MAX_DIGIT 8
unsigned char LED_RAM[MAX_DIGIT];
unsigned char LED_BUFF[MAX_DIGIT];
#define seg_A PORTB_Bit3
#define seg_B PORTB_Bit6
#define seg_C PORTC_Bit1
#define seg_D PORTD_Bit7
#define seg_E PORTB_Bit1
#define seg_F PORTD_Bit1
#define seg_G PORTD_Bit5
#define seg_DP PORTB_Bit5
#define seg_1 PORTC_Bit0
#define seg_2 PORTB_Bit4
#define seg_3 PORTB_Bit2
#define seg_4 PORTB_Bit0
#define seg_5 PORTD_Bit6
#define seg_6 PORTB_Bit7
#define seg_7 PORTD_Bit2
#define seg_8 PORTD_Bit0
#define seg_out_A DDRB_Bit3
#define seg_out_B DDRB_Bit6
#define seg_out_C DDRC_Bit1
#define seg_out_D DDRD_Bit7
#define seg_out_E DDRB_Bit1
#define seg_out_F DDRD_Bit1
#define seg_out_G DDRD_Bit5
#define seg_out_DP DDRB_Bit5
#define seg_out_1 DDRC_Bit0
#define seg_out_2 DDRB_Bit4
#define seg_out_3 DDRB_Bit2
#define seg_out_4 DDRB_Bit0
#define seg_out_5 DDRD_Bit6
#define seg_out_6 DDRB_Bit7
#define seg_out_7 DDRD_Bit2
#define seg_out_8 DDRD_Bit0
#define segpins(a,b,c,d,e,f,g) ((a<<0)|(b<<1)|(c<<2)|(d<<3)|(e<<4)|(f<<5)|(g<<6))
const unsigned char __flash SEG_CODE [20] =
{
segpins(1,1,1,1,1,1,0),//0
segpins(0,1,1,0,0,0,0),//1
segpins(1,1,0,1,1,0,1),//2
segpins(1,1,1,1,0,0,1),//3
segpins(0,1,1,0,0,1,1),//4
segpins(1,0,1,1,0,1,1),//5
segpins(1,0,1,1,1,1,1),//6
segpins(1,1,1,0,0,0,0),//7
segpins(1,1,1,1,1,1,1),//8
segpins(1,1,1,1,0,1,1),//9
segpins(1,1,1,0,1,1,1),//A
segpins(0,0,1,1,1,1,0),//b
segpins(1,0,0,1,1,1,0),//C
segpins(0,1,1,1,0,1,1),//d
segpins(1,0,0,1,1,1,1),//E
segpins(1,0,0,0,1,1,1),//F
segpins(0,0,0,0,0,0,1), //- 16
segpins(0,0,1,0,1,0,1), //- n 17
segpins(0,0,0,0,0,0,0), //- 18
};
void LED_DRIVER(unsigned char num,unsigned char data);
void INIT_LED_PORT(unsigned char num,unsigned char data);
void LED_UPDATE(void);
void main(void)
{ unsigned char key;
INIT_LED_PORT(0xFF,0xFF);
TCCR2 = (0<< FOC2)|(1<< WGM20)|(0<< COM21)|(0<< COM20)|(0<< WGM21)|(0<< CS22)|(1<< CS21)|(0<< CS20);
TIMSK = (1<<OCIE2)|(0<< TOIE2)|(0<< TICIE1)|(0<< OCIE1A)|(0<< OCIE1B)|(0<< TOIE1)|(0<< TOIE0);
asm("sei");
while(1)
{
LED_BUFF[0] = 0;
LED_BUFF[1] = 1;
LED_BUFF[2] = 2;
LED_BUFF[3] = 3;
LED_BUFF[4] = 4;
LED_BUFF[5] = 5;
LED_BUFF[6] = 6;
LED_BUFF[7] = 7;
LED_UPDATE();
};
}
void LED_UPDATE()
{
unsigned char i = MAX_DIGIT;
while(i--) LED_RAM[i] = SEG_CODE [LED_BUFF[i]];
}
#pragma vector = TIMER2_COMP_vect
__interrupt void TIMER2_COMP (void)
{unsigned char temp_numseg,tempseg;
temp_numseg = numseg;
tempseg = LED_RAM[temp_numseg];
LED_DRIVER((1<<temp_numseg),tempseg);
if (temp_numseg++ >= MAX_DIGIT) temp_numseg=0;
numseg = temp_numseg;
}
void LED_DRIVER(unsigned char num,unsigned char data)
{
seg_A = 0;
seg_B = 0;
seg_C = 0;
seg_D = 0;
seg_E = 0;
seg_F = 0;
seg_G = 0;
seg_DP = 0;
num ^= 0xFF;
seg_1 = num;
num>>=1;
seg_2 = num;
num>>=1;
seg_3 = num;
num>>=1;
seg_4 = num;
num>>=1;
seg_5 = num;
num>>=1;
seg_6 = num;
num>>=1;
seg_7 = num;
num>>=1;
seg_8 = num;
seg_A = data;
data>>=1;
seg_B = data;
data>>=1;
seg_C = data;
data>>=1;
seg_D = data;
data>>=1;
seg_E = data;
data>>=1;
seg_F= data;
data>>=1;
seg_G = data;
data>>=1;
seg_DP = data;
}
void INIT_LED_PORT(unsigned char num,unsigned char data)
{
seg_out_1 = num ;
num>>=1;
seg_out_2 = num ;
num>>=1;
seg_out_3 = num ;
num>>=1;
seg_out_4 = num ;
num>>=1;
seg_out_5 = num ;
num>>=1;
seg_out_6 = num ;
num>>=1;
seg_out_7 = num ;
num>>=1;
seg_out_8 = num ;
seg_out_A = data;
data>>=1;
seg_out_B = data;
data>>=1;
seg_out_C = data;
data>>=1;
seg_out_D = data;
data>>=1;
seg_out_E = data;
data>>=1;
seg_out_F= data;
data>>=1;
seg_out_G = data;
data>>=1;
seg_out_DP = data;
}