мм не совсем
в примере я хотел показать что можно использовать маску... Ведь не обязательно использовать управление отдельным выводом, как сейчас.
Допустим нам нужно включить светодиоды на первом, третьем и шестом выводах порта D, а остальные выключить. Это можно сделать написав такой код
- Код: Выделить всё • Развернуть
Portd.0 = 1
Portd.1 = 0
Portd.2 = 1
Portd.3 = 0
Portd.4 = 0
Portd.5 = 1
Portd.6 = 0
Portd.7 = 0
Но можно записывать значение сразу для всех выводов 01000101 = 25 = 37, записывая значение сразу всего порта
- Код: Выделить всё • Развернуть
portd = 37
Эти два фрагмента выполняют одну и ту же задачу!
Ближе к примеру,
круг 1 - включение светодиодов 1-8
- Код: Выделить всё • Развернуть
portd = 255 = 11111111
круг 2 - включение светодиодов 1-6
- Код: Выделить всё • Развернуть
portd = 63 = 00111111
круг 3 - включение светодиодов 1-4
- Код: Выделить всё • Развернуть
portd = 15 = 00001111
круг 4 - включение светодиодов 1-2
- Код: Выделить всё • Развернуть
portd = 3 = 00000011
Если посмотреть на пример, то можно заметить, что перед каждым кругом у нас смещаются единички вправо
- Код: Выделить всё • Развернуть
11111111
00111111
Воспользуемся справкой по Bascom, нет ли там какой-либо функции которая может осуществлять свдиг (shifting) битов. Оказывается есть:
- Код: Выделить всё • Развернуть
Shift
если ей воспользоваться можно получить, например, такой код
- Код: Выделить всё • Развернуть
$regfile = "m32def.dat"
$crystal = 16000000
Config Pind.0 = Output
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Dim Wtime As Byte
Dim Mymask As Byte
Cls
Wtime = 200
Mymask = 255
Do
Portd = Mymask
Waitms Wtime
Shift Mymask , Right , 2
Loop
End
Данный код сначала включает все светодиоды (111111111 = FF = 255), потом выключает по два начиная с тех, которые подключены к выводам 7 и 6 соответственно..
Теперь о том как заставить их мигать по очереди. 8 светодиодов - 8 выводов, если хочется чтобы они мигали по очереди, надо понять как это происходит. Пусть сначала будет включен самый "правый" светодиод, остальные выключены: 00000001 = 01 = 1
Теперь включаем второй светодиод, а первый выключаем: 00000010 = 02 = 2
Дальше третий - 00000100 = 04 = 4 и тд
Очевидно, что опять перемещается битик (только теперь вправо), а значит можно опять воспользоваться функцией SHIFT!
- Код: Выделить всё • Развернуть
$regfile = "m32def.dat"
$crystal = 16000000
Config Pind.0 = Output
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Dim Wtime As Byte
Dim Mymask As Byte
Cls
Wtime = 200
Mymask = 1
Do
Portd = Mymask
Waitms Wtime
Shift Mymask , left, 1
Loop
End
Данный код последовательно будет включать/выключать светодиоды, начиная с 1-го
Препоследний шаг.. есть такая вещь как
битовые операцииПочитайте обязательно, это азы и без них никуда
Пытаемся объеденить полученные знания.
Для удобства введем маску
- Код: Выделить всё • Развернуть
Dim Mymask As Byte
Mymask = 255
которая соответствует тому, какие светодиоды можно включать (начальное значение - это значение на первом круге: 255 = FF = 11111111 - те на первом круге можно включать все светодиоды).
Введем еще одну маску
- Код: Выделить всё • Развернуть
Dim Myleds As Byte
Myleds = 1
она будет соответствовать тому, какие светодиоды будут включены (начальное значение один светодиод справа - 1 = 01 = 00000001)
Перменная
- Код: Выделить всё • Развернуть
Dim Portstatus As Byte
будет хранить состояние порта
Воспользовавшись логической операцией AND получим то значение, которое необходимо записывать в порт
- Код: Выделить всё • Развернуть
Portstatus = Myleds And Mymask
Portd = Portstatus
предположим, у нас 2 круг, значит Mymask = 00111111
и нам нужно включить 3 светодиод, значит Myleds = 00000100
в результате операции AND в переменную Portstatus запишется значение 00000100
значения для других кругов и других светодиодов настойтельно рекомендую сверить самому!
В принципе программа почти готова, осталось добавить совсем чуть чуть автоматизации
- Код: Выделить всё • Развернуть
$regfile = "m32def.dat"
$crystal = 16000000
Config Pind.0 = Output
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Dim Wtime As Byte
Dim Mymask As Byte
Dim Myleds As Byte
Dim Portstatus As Byte
Cls
'начальные значения
Wtime = 200
Mymask = 255
Myleds = 1
' основной цикл программы
Do
Do ' цикл мигания свтодиодами
Portstatus = Myleds And Mymask ' рассчитываем состояние порта
Portd = Portstatus ' записывае полученное значение в порт
Waitms Wtime ' пауза
Shift Myleds , Left , 1 ' сдвигаем маску влево, в следущий раз зажгется другой светодиод
Loop Until Portstatus = 0 ' выполняем цикл до тех пор пока состояние порта не вернет 0, те все светодиоды выключены
Myleds = 1 ' сбарсываем позицию светодиода который нужно включить
Shift Mymask , Right , 2 ' круг прошел, сдвигаем маску, в следующий раз два светодиода включать будет уже нельзя
If Mymask = 0 Then Mymask = 255 ' если маска равна 0 значит пора опять разрешить включать все светодиоды
Loop
End