andrestudio писал(а):
пробовал таким образом процедуры объявить но компилятор ругаетсяВидел, что пробовал...
Ну значит получается, что этот компилятор не знает, что такое рекурсивные задачи (это всегда вызов того, кто уже тебя вызвал, и всегда, во всех языках, для этого делается ПРЕДОПИСАНИЕ), т.е. - это вообще НЕ компилятор
Не считая конечно, что в нем закопаны все-таки (хотя сомнительно) супер-хитрые особенности синтаксиса...
Вот это все, кстати, и называется - борьба с чужим интеллектом (вместо обещаний очень большого облегчения работы разработчика при использовании ЯВУ)
Может он хочет, чтобы там где-нибудь "шляпов" понаставили...
Мне, в свое время - надоело бороться
BTW: по теории, самый надежный способ довести препода до белого каления - это сделать отступление от принципов структурного программирования путем jmp-а в asm-вставке.
------------ Дoбавленo:
Может совсем тупой вариант сработает
#pas
// Программа управления световыми эффектами
// Контроллер Atmega-161 Clock-4MHz
// 16 светодиодов установлены на порты А и В << через резисторы, и общий в 0 ??? >>
// Порт A младшая 8-ка
// Порт B старшая 8-ка
// Общий у кнопок: +5v << а кто тянет в 0 ??? >>
// Кнопка KН-1 PINC.0 - Убавить скорость переключений
// Кнопка KН-2 PINC.1 - Прибавить скорость переключения
// Кнопка KН-3 PINC.2 - Смена эффекта
// Эффект №1 - Бегущий огонь вправо
// Эффект №2 - Бегущий огонь влево
// Эффект №3 - Бегущие огни из центра
// Эффект №4 - Бегущие огни в центр
program Scroll_Led;
// массив констант для эффекта точек из центра и в центр
const led_centre: array[8] of word = (0x8001, 0x4002, 0x2004, 0x1008, 0x0810, 0x0420, 0x0240, 0x0180);
var t, time: word; // скорость переключения светодиодов
procedure Timer_Interrupt0; org OVF0addr;// процедура прерывания от таймера T0
begin
if (PINC.0 = 1) and (time < 1000) then time := (time + 5);
if (PINC.1 = 1) and (time > 50) then time := (time - 5);
if t > time then t := time;
TCNT0 := 0xB2;
end;
procedure Led_Out_Cent; // движение точек из центра
var i:byte;
begin
while TRUE do begin
for i:=7 downto 0 do begin
PORTA := Lo (led_centre[i]);
PORTB := Hi (led_centre[i]);
for t:=0 to time do Delay_ms(1); // задержка между переключением
if PINC.2 = 1 then exit;
end;
end;
end;
procedure Led_In_Cent; // движение точек в центр
var i:byte;
begin
while TRUE do begin
for i:=0 to 7 do begin
PORTA := Lo (led_centre[i]);
PORTB := Hi (led_centre[i]);
for t:=0 to time do Delay_ms(1); // задержка между переключением
if PINC.2 = 1 then exit;
end;
end;
end;
procedure Left_Led; // движение светодиода влево
var i:word;
begin
while TRUE do begin
i := 0x8000;
while i<>0 do begin
PORTA := Lo (i);
PORTB := Hi (i);
for t:=0 to time do Delay_ms(1); // задержка между переключением
i := i/2; // сдвигаем бит через деление
if PINC.2 = 1 then exit;
end;
end;
end;
procedure Right_Led; // движение светодиода вправо
var i:word;
begin
while TRUE do begin
i := 1;
while i<>0 do begin
PORTA := Lo (i);
PORTB := Hi (i);
for t:=0 to time do Delay_ms(1); // задержка между переключением
i := i*2; // сдвигаем бит через умножение
if PINC.2 = 1 then exit;
end;
end;
end;
// Вход в программу
begin
DDRA := 0xFF; // настраиваем порт A и B
DDRB := 0xFF; // на выход
time := 500; // начальная скорость переключения
TCCR0 := 0x05; // пуск Т0 с коэффициентом деления 1024
TIMSK := 1; // включаем прерывание на переполнение Т0
SREG.7:= 1; // разрешить глобальные прерывания
while TRUE do begin
PORTA :=0; // гашение светодиодов
PORTB :=0; // в портах А и В
Delay_ms(500); // задержка 0,5 сек
Right_Led; // Запускаем первый эффект
PORTA :=0; // гашение светодиодов
PORTB :=0; // в портах А и В
Delay_ms(500); // задержка 0,5 сек
Left_Led; ` // Запускаем второй эффект
PORTA :=0; // гашение светодиодов
PORTB :=0; // в портах А и В
Delay_ms(500); // задержка 0,5 сек
Led_In_Cent; // Запускаем третий эффект
PORTA :=0; // гашение светодиодов
PORTB :=0; // в портах А и В
Delay_ms(500); // задержка 0,5 сек
Led_Out_Cent; // Запускаем четвертый эффект
end;
end.