|
| | |
|
Цикл статей на тему "Исследование работы 7-Seg Led индикации в Bascom". Динамическая ндикация на основе сдвиговых регистров 74HC595.
В данной статье будет рассмотрен вариант поразрядного вывода информации именно в среде компилятора "Bascom", а именно: динамическая индикация на 7-ми сегментных светодиодных индикаторах в 8-ми разрядах с помощью 2-х 74HC595 и 3-х ножек МК.
'******************************************************************************* '************* *********** '************* Динамическая индикация на основе сдвиговых *********** '************* регистров 74HC595 *********** '************* (задействовано всего 3 вывода микроконтроллера) *********** '************* *********** '*******************************************************************************
' Контроллер: ATMEGA8A или любой другой "AVR" с небольшими переделками исходника ' Версия компилятора: BASCOM-AVR 2.0.7.1 ' Автор: sasha_1973
'******************************************************************************* '------------------------------------------------------------------------------- '--------------- Конфигурация используемого контроллера ---------------- '------------------------------------------------------------------------------- $regfile = "m8def.dat" : $crystal = 8000000 : $hwstack = 40 : $swstack = 16 : $framesize = 32 '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '----------------- Определение переменных и констант ------------------- '------------------------------------------------------------------------------- Начальные_настройки: ' Просто метка, для удобства '-------------------------------------------------------------------------------
Dim Тип_индикатора As Byte ' Переменная, для хранения значения типа индикатора Тип_индикатора = 0 ' Если тип_индикатора = 1 , то ОК , если Тип_индикатора = 0 , То ОA
'---------------------------------------------
Const Делитель_timer2 = 64 Const Количество_разрядов = 8 ' Количество используемых разрядов
'---------------------------------------------
Const Частота_мигания = 200 ' Значение частоты мигания знакоместа на LED дисплее при Флаг_мигание(n) = 1 Const Длительность_горения_при_мигании = 100 ' Значение длительности свечения знакоместа на LED дисплее при Флаг_мигание(n) = 1
'---------------------------------------------
Const Минимальная_яркость_led = 1 ' Уровень минимального значения яркости (в регитре OCR2) Const Максимальная_яркость_led = 255 ' Уровень максимального значения яркости (в регитре OCR2) Const Скорость_изменения_яркости_led = 5 ' Значение скорости изменения яркости LED индикации
'---------------------------------------------
Const Значение_переменной = 50 Const Скорость_изменения_переменной = 100 ' Переменная, для хранения значения задержки "Waitms"
'-------------------------------------------------------------------------------
Dim Цикл_led As Byte ' переменная, для хранения количества выводимых разрядов (нужна для разбивки значения на разряды) Dim Код_цифры As Byte ' переменная для загрузки в регистры сдвига Dim Флаг_stop As Byte ' если Флаг_stop = 1, перезагружаем МК Dim Цикл_записи As Byte ' переменная, для записи в 74HC595 Dim Буфер_led_1 As Word ' переменная, для 1-го индикатора Dim Буфер_led_2 As Word ' переменная, для 2-го индикатора Dim Яркость_led As Byte ' переменная, для регулировки яркости LED дисплея Dim Флаг_яркость As Byte ' флаг для регулировки яркости LED дисплея Dim Счетчик_миганий As Word ' счетчик для обработки частоты и длительности мигания Dim Счетчик_мигания As Word ' счетчик времени мигания Dim Счетчик_разрядов As Byte ' переменная, для перебирания разрядов Dim Переменная_word_1 As Word ' переменная, которую будем выводить Dim Переменная_word_2 As Word ' переменная, которую будем выводить Dim Счетчик_яркость_led As Byte ' переменная, для изменения яркости Dim Выводимая_цифра_led As Byte ' переменная, для загрузки цифр в порт Dim Выводимые_данные_led As Word ' переменная, для хранения выводимых данных Dim Копия_выводимые_данные_led As Word ' переменная, для временного хранения выводимых данных (нужна для разбивки значения на разряды) Dim Цифра(количество_разрядов) As Byte ' значения 6-ти разрядов Dim Разряд(количество_разрядов) As Byte ' переменная для работы с индикацией Dim Флаг_точка(количество_разрядов) As Byte ' флаги точек 6-ти разрядов Dim Флаг_мигание(количество_разрядов) As Byte ' флаги мигания разрядов Dim Флаг_гашение(количество_разрядов) As Byte ' флаги гашения нужного разряда для 4-х разрядов Dim Дополнительный_символ(количество_разрядов) As Byte ' переменная, для хранения значения дополнительного символа при Флаг_дополнительный_символ(n) = 1 Dim Флаг_дополнительный_символ(количество_разрядов) As Byte ' флаг сигнализирующий о выводе дополнительных символов
'------------------------------------------------------------------------------- '--------------- Настройка портов МК для LED индикации ----------------- '-------------------------------------------------------------------------------
Config Portd.7 = Output ' вывод SH_CP регистра (тактовые импульсы) Синхроимпульсы Alias Portd.7
Config Portb.0 = Output ' вывод DS регистра (данные) Данные Alias Portb.0
Config Portd.6 = Output ' вывод ST_CP регистра(защелка) Защелка Alias Portd.6
'------------------------------------------------------------------------------- '----------- Подпрограмма выполняемая после прерывания TIMER2 ---------- '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '------------ Настройка таймера для обновления LED индикации ----------- '-------------------------------------------------------------------------------
Config Timer2 = Timer , Prescale = Делитель_timer2 ' конфигурируем таймер индикации
'------------------------------------------------------------------------------- '----------- Подпрограмма выполняемая после прерывания TIMER2 ---------- '-------------------------------------------------------------------------------
On Compare2 Регулировка_яркости_led ' Прерывание регулировки яркости индикатора On Timer2 Обработка_прерывания_timer2 ' метка на прерывание индикации
'-------------------------------------------------------------------------------
Declare Sub Запись_в_74hc595() Declare Sub Регулировка_яркости_led() Declare Sub Индикация_7seg_led() Declare Sub Обработка_прерывания_timer2()
'------------------------------------------------------------------------------- '------------------------ Работа с прерываниями ------------------------ '-------------------------------------------------------------------------------
Enable Timer2 ' разрешаем прерывание для индикации
Enable Compare2 ' разрешаем прерывание для регулировки яркости
Enable Interrupts ' разрешаем прерывания
'------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- Переменная_word_1 = Значение_переменной Wait 2 '------------------------------------------------------------------------------- Do : Nop '-------------------------------------------------------------------------------
If Флаг_stop = 0 Then
Decr Переменная_word_1
If Переменная_word_1 = 0 Then 'Переменная_word_1 = Значение_переменной
Флаг_stop = 1 Переменная_word_1 = Значение_переменной
Флаг_точка(1) = 1 ' Флаг_точка(2) = 1 Флаг_точка(3) = 1 ' Флаг_точка(4) = 1 Флаг_точка(5) = 1 ' Флаг_точка(6) = 1 Флаг_точка(7) = 1 ' Флаг_точка(8) = 1
Флаг_мигание(1) = 1 Флаг_мигание(2) = 1 Флаг_мигание(3) = 1 Флаг_мигание(4) = 1 Флаг_мигание(5) = 1 Флаг_мигание(6) = 1 Флаг_мигание(7) = 1 Флаг_мигание(8) = 1
' Флаг_гашение(1) = 1 ' Флаг_гашение(2) = 1 ' Флаг_гашение(3) = 1 ' Флаг_гашение(4) = 1 ' Флаг_гашение(5) = 1 ' Флаг_гашение(6) = 1 ' Флаг_гашение(5) = 1 ' Флаг_гашение(6) = 1
Флаг_дополнительный_символ(1) = 1 : Дополнительный_символ(1) = 10 Флаг_дополнительный_символ(2) = 1 : Дополнительный_символ(2) = 11 Флаг_дополнительный_символ(3) = 1 : Дополнительный_символ(3) = 12 Флаг_дополнительный_символ(4) = 1 : Дополнительный_символ(4) = 10
Флаг_дополнительный_символ(5) = 1 : Дополнительный_символ(5) = 12 Флаг_дополнительный_символ(6) = 1 : Дополнительный_символ(6) = 10 Флаг_дополнительный_символ(7) = 1 : Дополнительный_символ(7) = 15 Флаг_дополнительный_символ(8) = 1 : Дополнительный_символ(8) = 14
Wait 2 Config Watchdog = 2048 Start Watchdog Wait 2
End If
Буфер_led_1 = Переменная_word_1
Incr Переменная_word_2
If Переменная_word_2 > 9999 Then Переменная_word_2 = 0
Буфер_led_2 = Переменная_word_2
End If
'------------------------------------------------------------------------------- Waitms Скорость_изменения_переменной '------------------------------------------------------------------------------- Loop End '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '******************************************************************************* '***************** Подпрограмма обработки прерывания TIMER0 **************** '***************** происходит каждые 2,048 ms **************** '******************************************************************************* '------------------------------------------------------------------------------- Обработка_прерывания_timer2: '------------------------------------------------------------------------------- rCall Индикация_7seg_led '------------------------------------------------------------------------------- Return '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- Индикация_7seg_led: '------------------------------------------------------------------------------- '--- Занимаемся регулировкой яркости LED индикации (написано для примера, в железе, маловероятно, что будет использоваться именно этот вариант) --- '------------------------------------------------------------------------------- Incr Счетчик_яркость_led If Счетчик_яркость_led = Скорость_изменения_яркости_led Then Счетчик_яркость_led = 0 If Флаг_яркость = 0 Then Incr Яркость_led Else Decr Яркость_led If Яркость_led = Максимальная_яркость_led Then Флаг_яркость = 1 If Яркость_led = Минимальная_яркость_led Then Флаг_яркость = 0 End If '------------------------------------------------------------------------------- '-------------- Устанавливаем уровень яркости LED индикации --------------- '------------------------------------------------------------------------------- Ocr2 = Яркость_led '------------------------------------------------------------------------------- '------ В цикле разбиваем сформированый "Буфер_led" на разряды ------ '-------------------------------------------------------------------------------
Выводимые_данные_led = Буфер_led_1
Копия_выводимые_данные_led = Выводимые_данные_led
For Цикл_led = 4 To 1 Step -1 ' цикл в котором разбивается переменная на 4 числа Выводимые_данные_led = Копия_выводимые_данные_led Mod 10 Цифра(цикл_led) = Выводимые_данные_led ' Копия_выводимые_данные_led = Копия_выводимые_данные_led / 10 Next
Выводимые_данные_led = Буфер_led_2
Копия_выводимые_данные_led = Выводимые_данные_led
For Цикл_led = 8 To 5 Step -1 ' цикл в котором разбивается переменная на 4 числа Выводимые_данные_led = Копия_выводимые_данные_led Mod 10 Цифра(цикл_led) = Выводимые_данные_led ' Копия_выводимые_данные_led = Копия_выводимые_данные_led / 10 Next
'------------------------------------------------------------------------------- '---- Перебираем разряды, в каждом прерывании выводим следующий разряд ----- '------------------------------------------------------------------------------- '----- Выбираем разряд для загрузки в обработчик вывода на 7-seg LED ----- '------------------------------------------------------------------------------- Incr Счетчик_разрядов
If Счетчик_разрядов > Количество_разрядов Then Счетчик_разрядов = 0 ' выбираем разряд для загрузки '------------------------------------------------------------------------------- ' Участок кода отвечающий за мигание разрядов, вывод точки и дополнительных символов '------------------------------------------------------------------------------- '---------------------------- Подготовка к миганию -------------------------- '------------------------------------------------------------------------------- Incr Счетчик_мигания
If Счетчик_мигания > Частота_мигания Then Счетчик_мигания = 1 ' длительность мигания '------------------------------------------------------------------------------- '----------------------- Выводим дополнительные симвоы --------------------- '------------------------------------------------------------------------------- If Флаг_дополнительный_символ(счетчик_разрядов) = 1 Then
Select Case Счетчик_разрядов Case 1 To 4 If Тип_индикатора = 1 Then Выводимая_цифра_led = Lookup(дополнительный_символ(счетчик_разрядов) , Цифры_ok) ' Выводим дополнительный_символ в 1 - 4 разрядах Else Выводимая_цифра_led = Lookup(дополнительный_символ(счетчик_разрядов) , Цифры_oa) ' Выводим дополнительный_символ в 1 - 4 разрядах End If Case 5 To 8 If Тип_индикатора = 1 Then Выводимая_цифра_led = Lookup(дополнительный_символ(счетчик_разрядов) , Цифры_ok) ' Выводим дополнительный_символ в 5 - 8 разрядах Else Выводимая_цифра_led = Lookup(дополнительный_символ(счетчик_разрядов) , Цифры_oa) ' Выводим дополнительный_символ в 5 - 8 разрядах End If End Select '------------------------------------------------------------------------------- '---------------------- Иначе выводим основные данные ---------------------- '------------------------------------------------------------------------------- Else '------------------------------------------------------------------------------- '------- Если не мигаем и ничего другого не выводим, выводим основное ------ '------------------------------------------------------------------------------- Выводимая_цифра_led = Цифра(счетчик_разрядов)
Select Case Счетчик_разрядов Case 1 To 4 If Тип_индикатора = 1 Then Выводимая_цифра_led = Lookup(выводимая_цифра_led , Цифры_ok) ' Если не выводим дополнительную информацию, выводим основную в 1 - 4 разрядах Else Выводимая_цифра_led = Lookup(выводимая_цифра_led , Цифры_oa) ' Если не выводим дополнительную информацию, выводим основную в 1 - 4 разрядах End If Case 5 To 8 If Тип_индикатора = 1 Then Выводимая_цифра_led = Lookup(выводимая_цифра_led , Цифры_ok) ' Если не выводим дополнительную информацию, выводим основную в 1 - 4 разрядах Else Выводимая_цифра_led = Lookup(выводимая_цифра_led , Цифры_oa) ' Если не выводим дополнительную информацию, выводим основную в 1 - 4 разрядах End If End Select
End If '------------------------------------------------------------------------------- '------------- Если необходимо, выводим точку в нужном разряде ------------- '------------------------------------------------------------------------------- If Флаг_точка(счетчик_разрядов) = 1 Then Выводимая_цифра_led = Выводимая_цифра_led Xor &B00000001 End If '------------------------------------------------------------------------------- ' Выходим из "Участок кода отвечающий за мигание разрядов, вывод точки и дополнительных символов" '------------------------------------------------------------------------------- '--------------------- Загружаем в порт код цифры ------------------------ '------------------------------------------------------------------------------- rcall Запись_в_74hc595 '------------------------------------------------------------------------------- '---------------- Готовимся к загрузке в порт кода разряда ---------------- '------------------------------------------------------------------------------- If Флаг_мигание(счетчик_разрядов) = 1 And Счетчик_мигания > Длительность_горения_при_мигании Or Флаг_гашение(счетчик_разрядов) = 1 Then ' если флаг мигания выставлен и счетчик > 200 If Тип_индикатора = 1 Then Выводимая_цифра_led = Lookup(16 , Разряды_ok) ' забираем в переменную код цифры Else ' иначе (флаг не выставлен, либо счетчик < 200) If Тип_индикатора = 1 Then Выводимая_цифра_led = Lookup(счетчик_разрядов , Разряды_ok) ' забираем в переменную код цифры Else Выводимая_цифра_led = Lookup(счетчик_разрядов , Разряды_oa) ' забираем в переменную код цифры End If End If '------------------------------------------------------------------------------- '--------------------- Загружаем в порт код разряда ---------------------- '------------------------------------------------------------------------------- rcall Запись_в_74hc595 '------------------------------------------------------------------------------- '----------------- Непосредственный вывод на LED индикатор ----------------- '------------------------------------------------------------------------------- Защелка = 1 ' Waitus 5 Защелка = 0 '------------------------------------------------------------------------------- '--------------------- Возвращаемся туда, где прервались ------------------- '------------------------------------------------------------------------------- Return '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- Запись_в_74hc595: '------------------------------------------------------------------------------- For Цикл_записи = 0 To 7 ' цикл для записи байта данных в регистр If Выводимая_цифра_led.7 = 0 Then Данные = 0 Else Данные = 1 Синхроимпульсы = 1 ' подаем импульс на вход тактовых импульсов для сдвига регистра (запись в регистр) ' Waitus 5 Синхроимпульсы = 0 Shift Выводимая_цифра_led , Left , 1 ' сдвигаем все биты переменной влево на один бит Next Цикл_записи
Данные = 0 '------------------------------------------------------------------------------- Return '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- Регулировка_яркости_led: '------------------------------------------------------------------------------- If Тип_индикатора = 1 Then Выводимая_цифра_led = Lookup(0 , Разряды_ok) ' забираем в переменную код цифры Else Выводимая_цифра_led = Lookup(0 , Разряды_oa) ' забираем в переменную код цифры End If '------------------------------------------------------------------------------- '--------------------- Загружаем в порт код разряда ---------------------- '------------------------------------------------------------------------------- rcall Запись_в_74hc595 '------------------------------------------------------------------------------- '----------------- Непосредственный вывод на LED индикатор ----------------- '------------------------------------------------------------------------------- Непосредсвенный_вывод_на_led: '------------------------------------------------------------------------------- Защелка = 1 ' Waitus 5 Защелка = 0 '------------------------------------------------------------------------------- Return '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- '******************************************************************************* '------------------------------------------------------------------------------- Цифры_oa: '------------------------------------------------------------------------------- Data &H81 ' 0 Data &HF3 ' 1 Data &H49 ' 2 Data &H61 ' 3 Data &H33 ' 4 Data &H25 ' 5 Data &H05 ' 6 Data &HF1 ' 7 Data &H01 ' 8 Data &H21 ' 9 '------------------------------ Data &H0F ' t - 10 Data &H0D ' E - 11 Data &H25 ' S - 12 Data &H81 ' O - 13 Data &H19 ' P - 14 Data &H47 ' o - 15 Data &HFF ' Пусто - 16 '------------------------------------------------------------------------------- Цифры_ok: '------------------------------------------------------------------------------- Data &H7E ' 0 - 0 Data &H0C ' 1 - 1 Data &HB6 ' 2 - 2 Data &H9E ' 3 - 3 Data &HCC ' 4 - 4 Data &HDA ' 5 - 5 Data &HFA ' 6 - 6 Data &H0E ' 7 - 7 Data &HFE ' 8 - 8 Data &HDE ' 9 - 9 '------------------------------ Data &HF0 ' t - 10 Data &HF2 ' E - 11 Data &HDA ' S - 12 Data &H7E ' O - 13 Data &HE6 ' P - 14 Data &HB8 ' o - 15 Data &H00 ' Пусто - 16
'------------------------------------------------------------------------------- Разряды_oa: '------------------------------------------------------------------------------- Data &B00000000 ' Не светится Data &B00000001 ' 1 Data &B00000010 ' 2 Data &B00000100 ' 3 Data &B00001000 ' 4 Data &B00010000 ' 5 Data &B00100000 ' 6 Data &B01000000 ' 7 Data &B10000000 ' 8 '------------------------------------------------------------------------------- Разряды_ok: ' разряды '------------------------------------------------------------------------------- Data &B11111111 ' Не светится Data &B11111110 ' 1 Data &B11111101 ' 2 Data &B11111011 ' 3 Data &B11110111 ' 4 Data &B11101111 ' 5 Data &B11011111 ' 6 Data &B10111111 ' 7 Data &B01111111 ' 8 '------------------------------------------------------------------------------- '******************************************************************************* '-------------------------------------------------------------------------------
|
Категория: Мои статьи | Добавил: sasha_1973 (12.07.2013)
|
Просмотров: 8035
|
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
| |
| | |
|
Статистика |
|
Онлайн всего: 1 Гостей: 1 Пользователей: 0 | |
|
|