Witam. Napisałem prosty program wyświetlający załączony bieg. Ale niestety jest jakiś problem wyświetlaniem luzu który powinien załączać się gdy nie jest wciśnięty żaden przycisk (załącza się nimi biegi). Jeżeli dodam b=0 gdy nie jest wciśnięty żaden klawisz można złączyć tylko wsteczny czyli działa tylko KEY6. Jeżeli skasuję b=0 działają wszystkie klawisze bardzo bardzo dziwne. Macie jakieś pomysły. W kodzie poniżej nieszczęsna linijka została zaznaczona.
#include <avr/io.h>
#include <util/delay.h>
#define SEG_A (1<<PB6)
#define SEG_B (1<<PB5)
#define SEG_C (1<<PB2)
#define SEG_D (1<<PB0)
#define SEG_E (1<<PB1)
#define SEG_F (1<<PB4)
#define SEG_G (1<<PB3)
#define KEY_1 (1<<PD6)
#define KEY_2 (1<<PD5)
#define KEY_3 (1<<PD4)
#define KEY_4 (1<<PD3)
#define KEY_5 (1<<PD2)
#define KEY_6 (1<<PD1)
#define ZEROWANIE PORTB&=~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
uint8_t aktualny_bieg (uint8_t bieg);
volatile uint8_t b=0;
uint8_t old_b=0;
volatile uint8_t biegi[] = {
(SEG_E | SEG_G | SEG_C), //0-n
(SEG_B | SEG_C), //1
(SEG_A | SEG_B | SEG_D | SEG_E | SEG_G), //2
(SEG_A | SEG_B | SEG_C | SEG_D | SEG_G), //3
(SEG_B | SEG_C | SEG_F | SEG_G), //4
(SEG_A | SEG_C | SEG_D | SEG_F | SEG_G), //5
(SEG_E | SEG_G), //6-r
};
int main(void)
{
DDRB |= SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G ; // KIERUNEK SEGMENTÓW WYJSCIOWY
PORTB |= ~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G) ; // WYGASZENIE SEGMENTÓW PODCIAGNIECIE SEGMENTOW POD REZYSTOR
DDRD &= ~( KEY_1 | KEY_2 | KEY_3 | KEY_4 | KEY_5 | KEY_6 ); // KIERUNEK KLAWISZY WEJSCIOWY
PORTD |= KEY_1 | KEY_2 | KEY_3 | KEY_4 | KEY_5 | KEY_6 ; // PODCIAGNIECIE KALWISZY POD REZYSTOR
ZEROWANIE; //test wyswietlacza
b=1;
PORTB |= biegi[b];
_delay_ms(50);
ZEROWANIE;
b=2;
PORTB |= biegi[b];
_delay_ms(50);
ZEROWANIE;
b=3;
PORTB |= biegi[b];
_delay_ms(50);
ZEROWANIE;
b=4;
PORTB |= biegi[b];
_delay_ms(50);
ZEROWANIE;
b=5;
PORTB |= biegi[b];
_delay_ms(50);
ZEROWANIE;
b=6;
PORTB |= biegi[b];
_delay_ms(50);
ZEROWANIE;
b=0;
PORTB |= biegi[b];
_delay_ms(50);
ZEROWANIE;
_delay_ms(50);
while(1)
{
if (aktualny_bieg (KEY_1) ) b=1; //1
if (aktualny_bieg (KEY_2) ) b=2; //3
if (aktualny_bieg (KEY_3) ) b=3; //5
if (aktualny_bieg (KEY_4) ) b=4; //2
if (aktualny_bieg (KEY_5) ) b=5; //4
if (aktualny_bieg (KEY_6) ) b=6; //r
if (old_b != b) //SPRAWDZENIE WARUNKU ZEBY NIE MRUGAL EKRAN JAK JEST TEN SAM BIEG
{
ZEROWANIE; //ZEROWANIE WYSWIETLACZA ZEBY NIE BYLO POZOSTALOSCI
PORTB |= biegi[b]; //WYSWIETLANIE NOWEGO BIEGU
old_b = b;
}
}
}
uint8_t aktualny_bieg(uint8_t bieg)
{
if ( ! (PIND & bieg))
{
_delay_ms(10); //niwelacja szumu klawisza
if ( ! (PIND & bieg)) return 1;
}
b=0; // ***************************** bez b=0 wszystko działa ale nie zeruje a z b=0 da się włączyć tylko wsteczny bardzo dziwne.
return 0;
}