Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 6 99

Andy: читать из него без особой надобности не следует
Я не то имел ввиду
Читать из порта можно и нужно, нежелательно устанавливать/сбрасывать биты командами bsf/bcf

Splav56, да, пропустил я одну ветвь - из 0 в 0, если нажато более 1 кнопки

semm, по такому принципу можно будет сделать на втором этапе, с таблицей для различных положений кнопок.

 

Andy: В начале обнуляем весь байт, а потом

Andy, если посмотреть на схему, то мы увидим, что на вывод работает только младший полубайт (ниббл) порта В (RB0:RB3), а старший полубайт порта В (RB4:RB7) работает на ввод, поэтому если оперировать байтом, то люди точно запутаются. И второе: я не нашел в алгоритме проверки на замыкание одновременно двух кнопок, например №1 и №2. Конечно написать "portB!=0" в условии ветвления конечно красиво , но далеко не все помнят что такое факториал и как он вычисляется, а тем более как будет работать это место в алгоритме.

 

Splav56: И второе: я не нашел в алгоритме проверки на замыкание одновременно двух кнопок, например №1 и №2.

Ура! Дошло! Цитата из поста Andy:Если нажата вторая кнопка, смотрим, есть ли в порте В какое-то отличное от нуля значение. Если есть (а это значит, что какой-то светодиод уже включен), обнуляем порт и заканчиваем цикл. Если нет (т. е. port B == 0), записываем туда двоичное 00000011 (зажгли два светодиода) и переходим к третьей кнопке.
Прочтите этот абзац внимательно.
Единственное, хотелось бы получить описание условия ветвления: "portB!=0"
Напомню из математики: m! (эм факториал) - это общее число перестановок из m элементов и равно произведению всех целых чисел от 1 (или, что то же, от 2) до m включительно:

m! = 1*2*3...*(m-1)*m

В нашем случае m=3 (кнопки №2,№3,№4, кнопка №1 не проверяется), следовательно комбинаций будет m!(B!)=1*2*3=6.
Это можно подсчитать и проверить "на пальцах": №1+№2, №1+№3, №1+№4, №2+№3, №2+№4, №3+№4, итого 6 шт.

 

Да не факториал ето! "!=" означает "не равно"!

 

Неожиданные выводы с факториалом

port B != 0 это проверка на неравенство значения нулю.

Да, другую половину порта я не доглядел. Но что мешает взять другой порт?

 

Splav56: я не нашел в алгоритме проверки на замыкание одновременно двух кнопок, например №1 и №2.

Сравнение с нулем значения, уже содержащегося в половинке порта B, и есть проверка на замыкание двух кнопок. Если на предыдущем шаге установлен хотя бы один бит, то нуля уже не будет, значит, где-то раньше (не важно, где) было установлено, что нажата кнопка (любая).

 

Andy: Неожиданные выводы с факториалом

А все соответствует. Возможно такое написание и пошло от факториала?

 

Пора тогда нарисовать алгоритм целиком.

Граф, предлагаемый к обсуждению и утверждению прилагаю.

35103.xls

 

А это его описание. На полную точность не претендует. Если есть замечания и вопросы, то будем обсуждать дальше. Может кто-нибудь оформит покрасивее?

 

Странно, файл не прилепился, попробую еще.

35105.txt