Я делал так: запускаю таймер. Настраиваю порт на вывод, конденсаторы разряжаются. Затем перевожу порт на ввод, запоминаю значение таймера. Потом в цикле проверяю биты порта. Если прошло определённое время, в течение которого конденсатор должен зарядиться, если датчик над светлой поверхностью (проверяю по таймеру) - выход из цикла. Если внутри цикла бит порта изменился на 0 (или на 1 - смотря как фототранзисторы включены - "снизу" или "сверху"), значит соответствующий датчик над светлой поверхностью. Здесь главное - экспериментальным путём найти то самое "определённое время" - а оно зависит от датчиков, расстояния до поверхности и от самой поверхности, да и у разных битов одного и того же порта напряжение, которое воспринимается как 0 или 1 вполне может немного отличаться.
Чтобы можно было работать с различными поверхностями, надо ввести автоматическую калибровку датчиков. Выглядит это так: робот устанавливается на линию. Включаются двигатели, чтобы он поворачивался на месте, все датчики при этом должны по очереди пересекать линию. Пока идёт поворот, непрерывно запускается процедура, описанная выше, причём время цикла выбирается достаточно большим, чтобы конденсатор успел зарядиться даже когда датчик над тёмной поверхностью, и для каждого датчика запоминаются максимальное и минимальное время срабатывания.
В приложении заготовка кода для калибровки датчиков, и чтения с учётом калибровки. Предполагается, что подключено до 8 датчиков к выводам порта А.