Witam !
Otóż dopadł mnie problem mały a może i dość spory ;)
Do rzeczy jest na sali osoba która może mi pomóc stworzyć oraz wyjaśnić kawałek kodu zobrazowany na poniższym algorytmie blokowym(załącznik na dole).
Mam za zadanie wbudować w program eliminację styków w przyciskach, mam 3 przyciski na P3_0 (dodawanie) P3_1 (odejmowanie) P3_7 (zerowanie).
Program zrealizowany z obsługa przycisków wklejam ponieżej, lecz wlaśnie jeszcze te nieszczęsne drgania eh :D
#include "8051.h"
//deklaracja zmiennych odpowiedzialnych za częstotliwość odświerzania
#define TH0_RELOAD 0xFF
#define TL0_RELOAD 0x00
#define TIK 5
// deklaracja tablicy ASCII zawierającej odpowiednie wartości na wyświetlaczu 0 - F
char display[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
// deklaracja liczników
char i=0;
char j=0;
// zmienne przechowujące wartość wyświetląną na wyświetlaczu
char war_wyś_x=2,war_wyś_y=0,war_wyś_z=1,war_wyś_w=7;
//stan przycisku eliminacja drgań
// funkcja obsługująca zegar
void timer0_init(void)
{
TH0 = TH0_RELOAD;
TL0 = TL0_RELOAD;
TMOD = TMOD | 0x01;
TR0 = 1;
ET0 = 1;
}
void timer_isr (void) __interrupt (1) __using (0)
{
static int count=0;
TH0 = TH0_RELOAD;
TL0 = TL0_RELOAD;
count++;
j++;
j=j%4;
if(count==TIK)
{
count=0;
i++;
i=i%16;
}
}
}
void main(void)
{
//obsługa przerwań oraz wywołanie funkcji zegara
EA = 0;
timer0_init();
EA=1;
P2=0xFF;
while(1)
{
// obsługa przycisku dodawania
if (P3_0 == 0)
{
if (war_wyś_w >= 9) {
war_wyś_w = 0;
if (war_wyś_z>= 9) {
war_wyś_z= 0;
war_wyś_y++;
if(war_wyś_y >=9) {
war_wyś_y = 0;
war_wyś_x++;
}
}
else {
war_wyś_z++;
}
}
else {
war_wyś_w++;
}
if (war_wyś_w == 9 && war_wyś_x == 9 && war_wyś_y == 9 && war_wyś_z == 9) {
break;
}
}
// obsługa przycisku odejmowania
if (P3_0 == 0)
{
if (war_wyś_w != 0) {
war_wyś_w--;
}
else {
war_wyś_w = 0;
if (war_wyś_z != 0) {
war_wyś_z--;
}
else {
war_wyś_z = 0;
if (war_wyś_y != 0) {
war_wyś_y--;
} else {
war_wyś_y= 0;
if (war_wyś_x != 0) {
war_wyś_x--;
} else {
war_wyś_x = 0;
}
}
}
}
}
// obsługa przycisku zerowania
if(P3_7==0) {
war_wyś_x =0;
war_wyś_y =0;
war_wyś_z =0;
war_wyś_w =0;
}
war_wyś_w;
war_wyś_x;
war_wyś_y;
war_wyś_z;
// wybór wyświetlacza
switch(j)
{
case 0:
P1 = 0x01;
P0 = display[war_wyś_x];
break;
case 1:
P1 = 0x02;
P0 = display[war_wyś_y];
break;
case 2:
P1 = 0x04;
P0 = display[war_wyś_z];
break;
case 3:
P1 = 0x08;
P0 = display[war_wyś_w];
break;
}
}
}
Jeśli nie wytłumaczyłem wyczerpująco to jeszcze podaję dokładne polecenie:
- Zmodyfikuj kod programu będącego treścią zadania drugiego z ćwiczenia nr 2 (program obsługi
wyświetlacza siedmiosegmentowego oraz klawiszy) dodając do niego programową eliminację drgań
zestyków wg wytycznych przedstawionych w rozdziale 1 niniejszej instrukcji opierając się zwłaszcza
na rys. nr 5. - Dobierz eksperymentalnie wartość stałej LIMIT w sposób zapewniający poprawną pracę przycisków.
- Na podstawie analizy gotowego kodu źródłowego oszacuj czas wystarczający do eliminacji drgań
zestyków w konkretnym zestawie uruchomieniowym.
Niestety jest ten problem że nie mam jak przetestować za bardzo i ciężko mi się tak programuje dlatego kieruje prośbę do was :)