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

Цикл статей на тему "Исследование работы 7-Seg Led индикации в Bascom". Статическая индикация на основе сдвиговых регистров 74HC595.
Статическая индикация на 74HC595 и 7-seg Led индикаторах.

Плюсы:
Яркость
Практически не потребляет ресурсов МК
Отсутствуют всевозможные засветки индикаторов
Большое число разрядов, ограничено только частотой МК

Минус - 1 разряд = 1 регистр 74HC595
Огромный минус - большое потребление







       Исходник
Написан "МАСТЕРок"

'* Filename : SPI индикатор *
'* Revision : 1.0 *
'* Controller : ATMEGA8 *
'* Compiler : BASCOM-AVR 2.0.7.1 *
'* Author : MACTEPOK *
'*******************************************************************************

$regfile = "m8def.dat" 'определяем контроллер
$crystal = 1000000 'внутренний генератор
'$sim
'$lib "mcsbyte.lbx" 'подключаем библиотеку функций
$hwstack = 40
$swstack = 16
$framesize = 32

Config Portb = Output

Ds Alias Portb.2
' шина данных
St_cp Alias Portb.1 ' защелка регистров
Sh_cp Alias Portb.0 ' сдвиг

'-------------------------------------------------------------------------------
Declare Sub Zapis ' процедура записи даных в регистр
Declare Sub Destroy ' процедура разделения переменных на разряды
'-------------------------------------------------------------------------------
'*******************************************************************************

Dim Out_word(4) As Word ' массив выводимых на индикаторы переменных
Dim N As Byte
Dim Chislo(16) As Byte
' массив с разрядами выводимых чисел
Dim Text_message(16) As Byte ' массив с разрядами выводимого текста
Dim Blink_count As Byte ' период морганий значний на индикаторах
Dim Blinkcount_flag As Bit ' флаг морганий значний на индикаторах---------------------------------числа: 1 2 3 4
Dim Point_flag As Word 'массив битов, хранения флагов точек. Для всех разрядов выводимых чисел: &B 0000 0000 0000 0000 '
Dim Blink_flag As Word 'массив битов, хранения флагов моргания. Для всех разрядов выводимых чисел: &B 0000 0000 0000 0000
Dim Text_flag As Word 'массив битов, хранения флагов вывода текста на индикаторы
Dim Invblink_flag As Bit ' промежуточная переменная типа Bit
Dim Indicator_type As Byte ' тип индикатора (ОА = 0; ОК <> 0)

Const Blinker = 3 ' ~ 1 сек период моргания значний на индикаторах
'DEMO
Dim Blinker_count As Byte ' счетчики
Dim Point_count As Byte
Const Shifter1 = 50
' период смены мигания в разрядах
Const Shifter2 = 10 ' период смены точки в разрядах
'
Out_word(1) = 111
Out_word(2) = 2222
Out_word(3) = 3333
Out_word(4) = 4444


Point_flag = &B0000000000000001 ' точка в краейне правом разряде
Blink_flag = &B1000000000000000 ' мигает крайний левый разряд
Text_flag = &B1000010000100001 ' выводим текст в указанных разрядах индикаторов
For N = 1 To 16
Text_message(n) = 11
' тут записываем в массив необходимую текстовую инфу
Next

Config Timer0 = Timer , Prescale = 256 : On Timer0 Timers ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0 : Start Timer0 ' разрешаем прерывания
Do
For N = 1 To 4
' здесь происходит изменение переменных
Incr Out_word(n)
If Out_word(n) > 9999 Then Out_word(n) = 0
Next
Call Destroy
Call Zapis
' за раз отправляем в регистр все 16 разрядов
Waitms 50
Loop


'
'-------------------------------------------------------------------------------
Sub Destroy ' содержание функции разделения переменных на разряды
Local I As Byte
Local M As Byte
Local K As Byte
' счетчик элементов массива
Local L As Byte ' счетчик цикла (считаем число переменных для вывода на индикаторы)
Local Cod_var As Byte ' промежуточная переменная типа Byte
Local Copy_print As Integer ' промежуточная переменная типа Integer
K = 0 ' обнуляем
M = 0
For L = 4 To 1 Step -1
' для каждой переменной
Copy_print = Out_word(l) ' копируем в промежуточную переменную
For I = 4 To 1 Step -1 ' в регистры будем записывать всего 4х4 = 16 чисел (разрядов)
Incr K
Cod_var = Copy_print Mod 10
' отделяем от переменных крайний правый разряд (остаток от деления на 10)
If Text_flag.m = 1 Then ' если в данном разряде текст, то записываем номер символа
Chislo(k) = Text_message(k) ' записываем в массив для дальнейшей передачи в сдвиговые регистры
Else ' иначе
Chislo(k) = Cod_var ' записываем в массив номер числа
End If
Incr M
Copy_print = Copy_print / 10
Next
Next
End Sub

'
'-------------------------------------------------------------------------------
Sub Zapis ' содержание функции записи в регистр
Local I As Byte
Local K As Byte
' счетчик элементов массива
Local L As Byte ' счетчик цикла (считаем число переменных для вывода на индикаторы)
Local Cod_var As Byte ' промежуточная переменная типа Byte

For L = 16 To 1 Step -1
K = L
' переменная для определения индекса битов в переменной Point_flag
Decr K
Cod_var = Lookup(chislo(l) , Cody)
' извлекаем код числа для индикации
If Indicator_type = 0 Then ' если индикаторы с ОА
Invblink_flag = Point_flag.k ' компируем текущий бит в промежуточную переменную
Toggle Invblink_flag ' инвертируем
If Text_flag.k = 0 Then Cod_var.5 = Invblink_flag ' записываем этот бит на знакоместо сегмента h
If Blink_flag.k = 1 And Blinkcount_flag = 1 Then Cod_var = &B11111111 ' здесь очищаем разряд, если мигаем
Else
If Blink_flag.k = 1 And Blinkcount_flag = 1 Then Cod_var = &B00000000 ' здесь очищаем разряд, если мигаем
If Text_flag.k = 0 Then Cod_var.5 = Point_flag.k ' записываем этот бит на знакоместо сегмента h
End If
For I = 0 To 7
' цикл для записи байта данных в регистр
If Cod_var.7 = 0 Then Ds = 0 Else Ds = 1 ' если седьмой (последний) бит переменной равен 0, то отправляем 0 на ввод данных. (для индикатора с ОА. Для индикатора с ОК изменить условие не противоположное, таблицу данных не трогать!)
Sh_cp = 1 ' подаем импульс на вход тактовых импульсов для сдвига регистра (запись в регистр)
Sh_cp = 0
Shift Cod_var , Left , 1
' сдвигаем все биты переменной влево на один бит
Next
Ds = 0
Next
St_cp = 1
' защелкиваем регистры
St_cp = 0
End Sub

'
' прерывание от Timer0
'-------------------------------------------------------------------------------
Timers:
Incr Blink_count ' увеличиваем счетчик
If Blink_count = Blinker Then ' когда равен периоду
Toggle Blinkcount_flag ' меняем состояние флага моргания
Blink_count = 0 ' обнуляем
End If
'DEMO
Incr Blinker_count : Incr Point_count
If Blinker_count = Shifter1 Then
' тут отсчитываем период смены индикатора с морганием
Shift Blink_flag , Right , 1
Blinker_count = 0
End If
If Point_count = Shifter2 Then
' тут отсчитываем период смены индикатора с точкой
Shift Point_flag , Left , 1
Point_count = 0
End If
Return

'-------------------------------------------------------------------------------
' Таблица данных
'-------------------------------------------------------------------------------
Cody: ' ОA &B dehc abfg
Data &B00100001 '0 - "0" a
Data &B11101011 '1 - "1" --
Data &B00110010 '2 - "2" f| |b
Data &B01100010 '3 - "3" | g|
Data &B11101000 '4 - "4" --
Data &B01100100 '5 - "5" e| |c
Data &B00100100 '6 - "6" | |
Data &B11100011 '7 - "7" -- h
Data &B00100000 '8 - "8" d
Data &B01100000 '9 - "9"
Data &B11111111 '10 - "пусто"
' текст:
Data &B10110100 '11 - "F"

'и т.д.




Видео работы в железе

Исходник + готовая прошивка + эмуляция в "Протеус", Atmega8A

Платки под индикаторы приобретались здесь

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



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

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