В состоянии S1: таймер выключен. При сигнале от датчика А запускаем таймер, устанавливаем count=10, и переходим в состояние S2. Аналогично, при сигналe от датчика Б запускаем таймер, устанавливаем count=10, и переходим в состояние S3.
В состоянии S2: при переполнении таймера и count>0 поджигаем следующую лампу в направлении от А к Б, уменьшаем count на 1 и остаемся в состоянии S2. При переполнении таймера и count=0, выключаем таймер, лампы, и переходим в состояние S1. При сигнале от датчика А (на лестницу зашел человек вслед за первым) устанавливаем count=10, поджигаем первую лампу в направлении от А до Б и остаемся в этом состоянии. Наконец при сигнале от датчика Б (на лестницу зашел человек с другого конца и идет навстречу первому) устанавливаем count=10, поджигаем первую лампу в направлении от Б до А и переходим в состояние S3.
Аналогично в состоянии S3: при переполнении таймера и count>0 поджигаем следующую лампу в направлении от Б к A, уменьшаем count на 1 и остаемся в состоянии S3. При переполнении таймера и count=0, выключаем таймер, лампы, и переходим в состояние S1. При сигнале от датчика Б (на лестницу зашел человек вслед за первым) устанавливаем count=10, поджигаем первую лампу в направлении от Б до А и остаемся в этом состоянии. Наконец при сигнале от датчика А (на лестницу зашел человек с другого конца и идет навстречу первому) устанавливаем count=10, поджигаем первую лампу в направлении от А до Б и переходим в состояние S2.
Реализация: нужна будет переменная state хранящая номер текущего состояния. Она инициализируется в 1 до входа в основной цикл программы и переустанавливается каждый раз при переходе между состояниями. Основной цикл программы начинается с разрешения прерываний и помещения процессора в сон. Выход из сна производится по получению любого из сигналов после стабатывания обработчика его прерывания. Запрещаем прерывания глобально (запрет прерываний не мешает установке флагов прерываний, т.е. их аппаратному фиксированию), анализируем значение state и переходим в соответствующую ветку кода как указано выше. После отработки команд перехода из одного состояния в следующее переходим на начало цикла, и все повторяется. Таким образом, программа будет полностью "interrupt driven". В обработчике каждого прерывания сбрасываем флаг этого прерывания в регистре МК (если он не сбрасывается автоматом) и устанавливаем софтверный флаг события, который будет анализироваться для переходов между состояниями.
В случае двух лестниц для обработки событий от датчиков А2,Б2 второй лестницы проще всего добавить 3 состояния S4, S5, S6 - аналогов S1, S2 и S3 для первой лестницы - и задействовать еще один таймер МК для временных интервалов второй лестницы (путем некоторого усложнения программы можно обойтись и одним таймером). При независимой подсветки лестниц удобно для второй лестницы завести свою переменную state2 и инициализировать ее в 4. Таким образом, при получении события от датчиков первой лестницы и ее таймера переходы будут осуществляться между состояниями S1 - S3 в зависимости от значения state1. В случае получения события от датчиков второй лестницы и таймера_2 переходы будут осуществляться между состояниями S4 - S6 в зависимости от state2. Только я не понимаю зачем тянуть провода от датчиков и ламп обоих лестниц к централизованному контроллеру. Не проще-ли вблизи каждой лестницы поставить свое независимое устройство с копеечным МК. Если только лестницы не рядом находятся...
Насчет режимов сна МК: очень удобно задействовать таймер, тактируемый отдельным генератором отличным от генератора, тактирующего ЦПУ. В этом случае МК можно будет помешать в глубокий сон. Однако, в атмеловском х51 такого отдельного генератора нет. Поэтому при переходе в состояния S2/S3 придется помещать ЦПУ в режим неглубокого сна с работающим тактовым генератором. Вы писали, что токопотребление Вам неважно, но меня сильно нервирует если МК зря пожирает миллиамперы. В случае "нормального" МК все устройство контроля вообще можно от батареек запитать, которых хватит на несколько лет. Или от изредка подзаряжаемого аккума. Тогда можно будет подумать о коммутировании БП устройства, если он все-таки нужен для управления лампами, в моменты простоя (основное состояние). А то сетевой адаптер то там, то сям, еще один здесь - так и набегает.


