

Koda: Izberi vse
#include "main.h"
volatile char STATUS;
volatile long mstick;
char PRITISKI_TIPK; //0-tipka1, 1-tipka2,
char SPUSTI_TIPK; //2-tipka3, 3-tipka4
int main()
{
int res=0;
char cnt100ms=0;
char znak;
int zakasnitev=0;
int zakasnitev_stevec=0;
char LEDprikaz=0; //0-zgornjih 8-bitov AD-pretvornika
//1-grafični prikaz AD 0-8 diod
//2-grafični prikaz AD 8-0 diod
//3-utripanje diod 1
//4-utripanje diod 2
//5-utripanje diod 3
//6-utripanje diod 4
//7-utripanje diod 5
//8-utripanje diod 6
Init();
sei();
PORTD |= 0x80; //Vključi LCD osvetlitev
LCDInit();
stdout = &LCDstream;
//stdout = &RS232stream;
while (1)
{
//--------- izvajaj pogosto ---------------
if (UCSR0A & (1<<RXC0))
{
znak=UDR0;
printf("%c",znak);
}
//-----------------------------------------
if (STATUS & Flag10ms)
{
STATUS &=~ Flag10ms;
//--------- izvajaj na 10ms ---------------
BeriTipke();
if (PRITISKI_TIPK) //če je bila katera od tipk pritisnjena, ukrepaj
{
if (PRITISKI_TIPK & 0x01) //Če je bila pritisnjena T1
{
PRITISKI_TIPK &=~0x01; //zbriši sporočilno zastavico
zakasnitev--; //zmanjšaj trajanje zakasnitve
if (zakasnitev < 0) zakasnitev=0; //popravi če smo jo zmanjšali pod nič (0 = 0.1s)
fprintf(&RS232stream,"\r\nČasovni razmak: %d desetink sekunde\r\n", zakasnitev+1);
}
if (PRITISKI_TIPK & 0x02) //Če je bila pritisnjena T2
{
PRITISKI_TIPK &=~0x02; //zbriši sporočilno zastavico
zakasnitev++; //povečaj trajanje zakasnitve
if (zakasnitev>19) zakasnitev=19; //popravi če smo jo povečali čez maksimum (19 = 2s)
fprintf(&RS232stream,"\r\nČasovni razmak: %d desetink sekunde\r\n", zakasnitev+1);
}
if (PRITISKI_TIPK & 0x04) //Če je bila pritisnjena T3
{
PRITISKI_TIPK &=~0x04; //zbriši sporočilno zastavico
LEDprikaz++; //Spremeni prikaz na LED diodah
if (LEDprikaz > 8) LEDprikaz=0;
OsveziLED(LEDprikaz,res);
fprintf(&RS232stream,"\r\nTip prikaza na LED diodah: %d\r\n",LEDprikaz);
}
if (PRITISKI_TIPK & 0x08) //Če je bila pritisnjena T4
{
PRITISKI_TIPK &=~0x08; //zbriši sporočilno zastavico
LCD_ClrScr(); //Zbriši LCD
fprintf(&RS232stream,"\r\nLCD zbrisan.\r\n");
}
}
//-----------------------------------------
cnt100ms++;
if (cnt100ms == 10)
{
cnt100ms=0;
//--------- izvajaj na 100ms --------------
//Trenutno se nič ne izvaja na 100ms
//-----------------------------------------
zakasnitev_stevec++;
if (zakasnitev_stevec > zakasnitev)
{
zakasnitev_stevec=0;
//--------- izvajaj na zakasnitev * 0.1s --------------
res=ADpretvorba();
fprintf(&RS232stream, "Vrednost AD pretvornika: %04d\r",res);
OsveziLED(LEDprikaz,res);
//-----------------------------------------------------
}
}
}
}
return 0;
}
//Tabela kombinacij za zadnji način utripanja
#define LED_SEKV_DOLZINA 14
const char LEDsekvenca[LED_SEKV_DOLZINA]={ 0x00,
0x81,
0x42,
0x24,
0x18,
0x3c,
0x7e,
0xff,
0x7e,
0x3c,
0x18,
0x24,
0x42,
0x81};
void OsveziLED(char tip, int vrednostAD)
{
static char korak=0;
static char stari_tip=0;
int tmp,i;
char PORTBtmp; //začasna vrednost, da se prikaže na LEDicah samo končno stanje, ne pa tudi vsa vmesna
if (stari_tip != tip) korak=0; //če se je tip utripanja spremenil, resetiraj na začetek sekvence
stari_tip=tip;
switch (tip)
{
case 0: //0-zgornjih 8-bitov AD-pretvornika
PORTB=vrednostAD>>2;
break;
case 1: //1-grafični prikaz AD 0-8 diod
tmp=vrednostAD/1023.0*8;
PORTBtmp=0;
for (i=0;i<tmp; i++)
{
PORTBtmp|=1<<i;
}
PORTB=PORTBtmp;
break;
case 2: //2-grafični prikaz AD 8-0 diod
tmp=vrednostAD/1023.0*8;
PORTBtmp=0;
for (i=0;i<tmp; i++)
{
PORTBtmp|=0x80>>i;
}
PORTB=PORTBtmp;
break;
case 3: //3-utripanje diod 1
if (korak==0) PORTB=0;
else PORTB=(1<<korak)-1;
korak++;
if (korak > 8) korak=0;
break;
case 4: //4-utripanje diod 2
if (korak==0) PORTB=255;
else PORTB=255-((1<<korak)-1);
korak++;
if (korak > 8) korak=0;
break;
case 5: //5-utripanje diod 3
if (korak==0) PORTB=0;
else PORTB=255-((1<<(8-korak))-1);
korak++;
if (korak > 8) korak=0;
break;
case 6: //6-utripanje diod 4
if (korak==0) PORTB=255;
else PORTB=(1<<(8-korak))-1;
korak++;
if (korak > 8) korak=0;
break;
case 7: //7-utripanje diod 5
PORTB=(1<<korak) | (0x80>>korak);
korak++;
if (korak > 7) korak=0;
break;
default: //8-utripanje diod 6
PORTB=LEDsekvenca[(int)korak];
korak++;
if (korak >= LED_SEKV_DOLZINA) korak=0;
break;
}
}
ISR(TIMER0_COMPA_vect)
{
static char cnt10ms=10;
mstick++;
cnt10ms--;
if (cnt10ms == 0)
{
cnt10ms=10;
STATUS |= Flag10ms;
}
}