Программирование BASCOM
Меню сайта
Категории каталога
Мои статьи [113]
Наш опрос
Оцените мой сайт
Всего ответов: 1158
Главная » Статьи » Мои статьи

Цикл статей на тему "Исследование работы 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

'-------------------------------------------------------------------------------
'*******************************************************************************
'-------------------------------------------------------------------------------

Документация ATmega48PA/88PA/168PA/328P


Продолжение описания вариантов вывода, в процессе!


Категория: Мои статьи | Добавил: sasha_1973 (12.07.2013)
Просмотров: 4638
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 2
Гостей: 2
Пользователей: 0
Copyright Radan Studio © 2017