Witam.
Podłączyłem klawiaturę do uc, naciśniecie przycisku powoduje zmianę stanu wejścia PD2 przez co uc wskakuje w przerwanie. W nim sprawdza po kolei który dokładnie przycisk jest wciśnięty poprzez podłączenie wyjść switchy do GND co ma spowodować spadek napięcia na PD2 czyli logiczne 0. W przerwanie dobrze wykrywa który przycisk jest wciśnięty, sygnalizuje to ilość zapalonych diod podłączonych pod PA. Następnie czeka na puszczenie przycisku i 10ms aby wyeliminować drganie styków i ponowne wejście w przerwanie. Po odczekaniu 10ms nie wiem czemu ale na porcie A ustawiana jest jakaś dziwna wartość tj. 0b11111110 nie mam pojęcia czemu się tak dzieje.
Schemat wygląda mniej więcej tak z tym, że klawiatura podłączona jest pod inne WE/WY.

Podłączyłem klawiaturę do uc, naciśniecie przycisku powoduje zmianę stanu wejścia PD2 przez co uc wskakuje w przerwanie. W nim sprawdza po kolei który dokładnie przycisk jest wciśnięty poprzez podłączenie wyjść switchy do GND co ma spowodować spadek napięcia na PD2 czyli logiczne 0. W przerwanie dobrze wykrywa który przycisk jest wciśnięty, sygnalizuje to ilość zapalonych diod podłączonych pod PA. Następnie czeka na puszczenie przycisku i 10ms aby wyeliminować drganie styków i ponowne wejście w przerwanie. Po odczekaniu 10ms nie wiem czemu ale na porcie A ustawiana jest jakaś dziwna wartość tj. 0b11111110 nie mam pojęcia czemu się tak dzieje.
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define SetBit(x,y) x |= (1<<y)
#define ClrBit(x,y) x &= ~(1<<y)
#define NegBit(x,y) x ^= (1<<y)
volatile int p=0;
ISR (INT0_vect)
{
_delay_ms(5);
p=0;
NegBit(PORTA, 4);
ClrBit(DDRD, 7);
_delay_ms(5);
if(bit_is_set(PIND, 2)) p=4;
SetBit(DDRD, 7);
_delay_ms(5);
ClrBit(DDRD, 6);
_delay_ms(5);
if(bit_is_set(PIND, 2)) p=3;
SetBit(DDRD, 6);
_delay_ms(5);
ClrBit(DDRD, 5);
_delay_ms(5);
if(bit_is_set(PIND, 2)) p=2;
SetBit(DDRD, 5);
_delay_ms(5);
ClrBit(DDRD, 4);
_delay_ms(5);
if(bit_is_set(PIND, 2)) p=1;
SetBit(DDRD, 4);
_delay_ms(5);
DDRD=0b11110000;
if(p==1)
{
PORTA=0b01111111;
p=0;
}
if(p==2)
{
PORTA=0b00111111;
p=0;
}
if(p==3)
{
PORTA=0b00011111;
p=0;
}
if(p==4)
{
PORTA=0b00001111;
p=0;
}
while(bit_is_clear(PIND, 2))
{
NegBit(PORTA, 3);
_delay_ms(100);
}
_delay_ms(20);
}
int main(void)
{
DDRD=0xf0;
PORTD=0b00001100;
DDRA=0xff;
PORTA=0b01010101;
// Przyciski//
MCUCR = (1<<ISC01);
GIMSK |= (1<<INT0);
sei();
while(1)
{
}
}
Schemat wygląda mniej więcej tak z tym, że klawiatura podłączona jest pod inne WE/WY.