|
| | |
|
Цикл статей на тему "Исследование работы 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)
|
Просмотров: 7030
|
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
| |
| | |
|
Статистика |
|
Онлайн всего: 1 Гостей: 1 Пользователей: 0 | |
|
|