Что-то не получается особо, если ставить счетчик в while(1), тогда он меняется только когда закончится цикл бег.строки....если его ставвить в цикл бегущей строки, тогда значение меняется внутри цикла, но цикл опять же нельзя остановить
Спойлер
Код: Выделить всё
/*************************************/
#include <mega8.h>
#include <lcd.h>
#include <delay.h>
#asm
.equ __lcd_port=0x12; PORTD /* ЖКИ дисплей подключили к порту I/O D */
#endasm
#define CLK 4000000 // Clock
#define Time_dev (unsigned char)((CLK*0.01)/256)
void put_scrolltext (flash unsigned char *intext);
void scrolltext (void);
static unsigned char scroll_time,scroll,inter,len,del_time,time_10ms;
flash unsigned char *text;
void main(void) /* Основная функция "main", с которой начинается выполнение всей программой процедуры */
{
lcd_init(16);
lcd_clear();
//=== Timer T2 ===// Таймер реального времени.
OCR2 = Time_dev; // записать в регистр заранее подготовленоого значения 10msec
TCCR2 = (0<< FOC2)|(0<<WGM20)| // разрешить работу и прерывание таймер2
(0<<COM21)|(0<<COM20)|
(1<<WGM21)|(1<< CS22)|
(1<< CS21)|(0<< CS20);
TIMSK = (1<< OCIE2)|(0<< TOIE2)| // маска разрешения прерываний по таймерам
(0<<TICIE1)|(0<<OCIE1A)|
(0<<OCIE1B)|(0<< TOIE1)|
(0<< 0) |(0<< TOIE0);
#asm("sei");
put_scrolltext("Bort voltage value = 25 V");
while(1)
{
//-----------------//
if (time_10ms)
{
time_10ms = 0;
if (len)
{
scrolltext ();
}
}
}
//****************//
}
void put_scrolltext (flash unsigned char *intext)
{
len=inter=scroll_time=scroll=0;;
while (*(intext+len)) len++;
if (len > 8)text = intext;
else len= 0;
}
void scrolltext (void)
{
unsigned char i;
if (del_time++>=100)
{del_time= 0;
if (((inter++)+16)<=(len*2))
{
lcd_gotoxy(0,0);
for(i=0; i<8; i++) lcd_putchar(*(text+i+ scroll_time));
if(scroll)scroll_time--; //движение в обратную сторону
else scroll_time++; //движение справа-налево
if ((scroll_time==0)||(scroll_time+8>= len) ) scroll^=1;
}else len =0;
}
}
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
time_10ms=1;
// Place your code here
}
