Witam, napisałem program, który pozwala na wyświetlenie 16 znaków z tablicy na 16 7-segmentowych wyświetlaczach. Następnie program przesuwa znaki w tablicy o 1 wyświetla kolejny znak, tak że całość przesuwa się na wyświetlaczach. Problem w tym że dzieję się to za szybko i znaki biegną tak, że prawie nie można nic przeczytać na wyświetlaczu. Jeśli ktoś może, proszę o rady, w jaki sposób np. dopisać podprogram który by nam przesuwał z określoną prędkością znaki w tablicy po wyświetleniu 16 znaków jednorazowo bądź też jak opóźnić przejście gdy wykona się pętla wyświetlająca 16 znaków. Dzięki za wszelkie rady, poniżej wstawiam listing programu:
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/pgmspace.h>
#include "font.h"
#include <avr/delay.h>
static char dd,d,j,jj;
unsigned char PROGMEM Fnt[]= Font;
int k,l;
char Buffer[128][8];
ISR (TIMER0_OVF_vect)
{
do {
for (jj=1;jj<8;jj++)
{
Buffer[k][l] =(pgm_read_byte(&Fnt[(jj*d)]));
l++;
}
d++;
k++;
l=0;
}
while(k<128);
if (k==128){
k=0;
l=0;
d=0;}
do{
PORTB = 0;
for (j=1;j<17;j++)
{
PORTD =(Buffer[j+k-1][l]);
PORTB =j;
}
PORTB=(dd<<4);
l++;
dd++;
if (dd==7)
{
dd=0;
k++;
l=0;
czekaj();
}
if (k==111)
k=0;
PORTB |= 0x80;} while(1);
}
//ISR (TIMER2_OVF_vect)
//void buffer (void)
void czekaj (void) //to chyba zly pomysl na zwiekszenie przerwy???
{
ISR (TIMER2_OVF_vect)
{
PORTB |= 0x80;
PORTB = 0;
}
}
void ioinit (void)
{
DDRB = 255;
DDRD = 255;
dd =0;
k=0;
l=0;
TIMSK = _BV (TOIE2);
TCCR2=1; //TIMER1_PWM_INITmax5-ak bude treba zmen rychlost
//Load the timer counter with 0 to begin with.
TCCR0 =3; //TIMER1_PWM_INIT;max5
// Enable timer 1 overflow interrupt.
TIMSK = _BV (TOIE0);
sei ();
}
int main (void)
{
ioinit ();
while(1)
{
// lcd_goto(4);
//lcd_writebyte(dd);
}
return 0;
}