Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2008-05-28 01:04:08 ЛС | профиль | цитата
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.
карма: 9

0