Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Форум Picbasic.ru » Программирование МК » PicBasicPro » Пример динамической индикации на микросхеме ТМ1636 (PIC16F84A + TM1636 + LED индикатор 4раз. х 8сег.)
Пример динамической индикации на микросхеме ТМ1636
Unicorn Дата: Вс, 15.01.2017, 21:24  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 6   ±
Замечания:   ±
На сайте с 27.10.2014

Статус: Offline

Приветствую всех.
В качестве альтернативной (программной или на регистрах) реализации динамической индикации семи-сегментных светодиодных индикаторов была опробована специализированная микросхема TM1636 китайского производителя. Все работает нормально.
Преимущества:
- реализация динамической индикации без участия микроконтроллера
- цена 15-20 руб./шт. с учетом доставки с Aliexpress
- одна микросхема на все разряды индикатора
- двухпроводная линия связи с микроконтроллером
- регулировка яркости (8 режимов)
- отсутствие необходимости в подключении внешних, дополнительных элементов
- управление любым разрядом и/или сегментом индикатора по отдельности

Небольшой пример работы с микросхемой.

'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'PIC16F84A + TM1636
'LED индикатор 4 разряда х 8 сегментов, общий анод
'Динамическая индикация.

@ device xt_osc, wdt_off, protect_off, pwrt_off
DEFINE OSC 4

din VAR PORTB.1 'шина SPI, данные
clk VAR PORTB.2 'шина SPI, такт

RG VAR BYTE 'регистр управления
DIG1 VAR BYTE 'переменная для 1-го разряда индикатора
DIG2 VAR BYTE 'переменная для 2-го разряда индикатора
DIG3 VAR BYTE 'переменная для 3-го разряда индикатора
DIG4 VAR BYTE 'переменная для 4-го разряда индикатора
F VAR BYTE 'признак передачи команды "1" или данных "0"

TRISB = 0 'порт В на вывод
PORTB = 0 'на всех выводах порта В установить логический сигнал "0"

F = 1 'передача команды
RG = %01000000 'КОМАНДА №1 (режим записи данных)
GOSUB serial 'подпрограмма последовательной передачи данных
RG = %10001111 'КОМАНДА №3 (вкл. индикатора, максимальная яркость)
GOSUB serial

'- - - отображение на индикаторе цифр 1 2 3 4 - - -

F = 0 'передача данных
RG = %11000000 'КОМАНДА №2 (адрес первого разряда индикатора)
DIG1 = $06 'код цифры "1" для 1-го разряда индикатора
DIG2 = $5B 'код цифры "2" для 2-го разряда индикатора
DIG3 = $4F 'код цифры "3" для 3-го разряда индикатора
DIG4 = $66 'код цифры "4" для 4-го разряда индикатора
GOSUB serial
PAUSE 2000

'- - - отображение на индикаторе цифр 5 6 7 8 - - -

DIG1 = $6D 'код цифры "5" для 1-го разряда индикатора
DIG2 = $7D 'код цифры "6" для 2-го разряда индикатора
DIG3 = $07 'код цифры "7" для 3-го разряда индикатора
DIG4 = $7F 'код цифры "8" для 4-го разряда индикатора
GOSUB serial
PAUSE 2000

'- - - выключение индикатора - - -

F = 1 'передача команды
RG = %10000000 'КОМАНДА №3 (вкл. индикатора)
GOSUB serial

END
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'подпрограмма последовательной передачи данных
serial:
din = 1 : clk = 1 'подготовка SPI к началу передачи данных
din = 0 : clk = 0 'старт передачи данных
IF F = 1 THEN
SHIFTOUT din,clk,0,[RG\9] 'передача команд
ELSE
SHIFTOUT din,clk,0,[RG\9,DIG1\9,DIG2\9,DIG3\9,DIG4\9] 'передача адреса и данных
ENDIF
clk = 0 : din = 0 'стоп передачи данных
clk = 1 : clk = 1 'стоп передачи данных
RETURN

Подробное описание принципов работы с микросхемой, различные тесты, картинки можно прочитать в статье: https://yadi.sk/d/BvV-EqUT39BJq4 или в прикрепленном архиве.
Прикрепления: TM1636.rar (933.4 Kb)
ЯНДЕКС Дата: 15.01.2017
anatol Дата: Пн, 16.01.2017, 16:25  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Спасибо за наводку! + в репутацию.
Сообщение отредактировал anatol - Пн, 16.01.2017, 16:27
Unicorn Дата: Пт, 20.01.2017, 18:40  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 6   ±
Замечания:   ±
На сайте с 27.10.2014

Статус: Offline

Кроме динамический индикации, микросхема TM1636 поддерживает работу с клавиатурой из 16 кнопок (2-е линии сканирования по 8 кнопок). Коды кнопок: №1=F7h, №2=EFh, №3=F6h, №4=EEh, №5=F5h, №6=EDh, №7=F4h, №8=ECh, №9=F3h, №10=EBh, №11=F2h, №12=EAh, №13=$F1h, №14=E9h, №15=F0h, №16=E8h и FFh если ни одна из кнопок не нажата. Микросхема не поддерживает определение кода двух и более одновременно нажатых кнопок.

'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'PIC16F84A + TM1636
'Работа с клавиатурой.

@ device xt_osc, wdt_off, protect_off, pwrt_off
DEFINE OSC 4

din VAR PORTB.1 'шина SPI, данные
clk VAR PORTB.2 'шина SPI, такт

RG VAR BYTE 'регистр управления
F VAR BYTE 'признак передачи команды "1" или данных "0"

TRISB = 0 'порт В на вывод
PORTB = 0 'на всех выводах порта В установить логический сигнал "0"

F = 1 'передача команды
RG = %01000000 'КОМАНДА №1 (режим записи данных)
GOSUB serial 'подпрограмма последовательной передачи данных
RG = %10001111 'КОМАНДА №3 (вкл. индикатора, максимальная яркость)
GOSUB serial
RG = %01000010 'КОМАНДА №1(режим чтения данных)
din = 1 : clk = 1 'подготовка SPI к началу передачи данных
din = 0 : clk = 0 'старт передачи данных
SHIFTOUT din,clk,0,[RG\9] 'передача команды на чтение
TRISB = %11111111 'все выводы порта В на ввод
SHIFTIN din,clk,5,[RG\9] 'чтение данных (код кнопки)
TRISB = %00000000 'все выводы порта В на вывод
clk = 0 : din = 0 'стоп передачи данных
clk = 1 : din = 1 'стоп передачи данных
'переменная RG будет хранить код нажатой кнопки

END
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'подпрограмма последовательной передачи данных
serial:
din = 1 : clk = 1 'подготовка SPI к началу передачи данных
din = 0 : clk = 0 'старт передачи данных
IF F = 1 THEN
SHIFTOUT din,clk,0,[RG\9] 'передача команд
ELSE
SHIFTOUT din,clk,0,[RG\9,DIG1\9,DIG2\9,DIG3\9,DIG4\9] 'передача адреса и данных
ENDIF
clk = 0 : din = 0 'стоп передачи данных
clk = 1 : clk = 1 'стоп передачи данных
RETURN

Более детальное описание работы с клавиатурой, схема подключения, программа тестирования и некоторые выводы изложены во второй части статьи.
Прикрепления: TM1636_2.pdf (183.8 Kb)
PINCOD Дата: Сб, 21.01.2017, 16:46  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 31
Репутация: 1   ±
Замечания:   ±
На сайте с 05.10.2011

Статус: Offline

Очень к стати статья,тоже заказал на Aliexpress такую штуковину на разборку с кодом и даташитом,а оказывается уже все расжеванно.Спасибо Алексей за заметку.
Unicorn Дата: Сб, 21.01.2017, 23:21  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 25
Репутация: 6   ±
Замечания:   ±
На сайте с 27.10.2014

Статус: Offline

На бэйсик подобных языках очень мало примеров работы с этой серии микросхем, решил немного восполнить пробел. Надеюсь, статья будет полезной и поможет в освоении микросхем.
PINCOD Дата: Вт, 14.02.2017, 19:07  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 31
Репутация: 1   ±
Замечания:   ±
На сайте с 05.10.2011

Статус: Offline

Доброго времени суток.Ну вот дождался девайс ТМ1637 с Китая, для изучения сего.И решил продолжить тему по этому поводу.Собрал Шим регулятор для коллекторного двигателя,на Pic12f675.Проекта в протеусе нет,так как не нагуглил модель для ТМ1637.Поэтому воплотил задуманное сразу в железе.Ну и не много пояснения к данной проге.Имеем 4разр индикатор на базе ТМ1637 + камень 12F675 и силовая цепь это мосфет IRF530.При первом влючении индикатор отображает значение шим на 2,3,4,разряде с минимальной яркостью.А 1й разряд за не надобностью пока потушен,Но как только нажмем кнопку "+" или "-" индикатор тут же зажигается на максимальную яркость все разряды, на 1разряде идёт подсчет секунд от нуля до 8,на 2,3,4,разряде значение оператора PWM ,с каждой последующей секундой яркость индикатора снижается до минимальной до следующей регулировки,после отчета 8 секунд идет запись значения ШИМ в EEPROM.Да и ШИМ регулирование в данной проге не самое главное,был вопрос по ТМ1637.Жаль что нет в Pic12f675 аппаратного ШИМ,но для коллекторного 12V вентилятора радиатора авто,программный ШИМ нормально справляется.Ну вот вроде бы и все,замечания приветствуются.Всем всего хорошего

Device 12F675
Declare Xtal = 4
Declare Reminders NO
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_OFF, BODEN_ON, MCLRE_OFF',CP_ON
Declare Create_Coff = 1
Set_OSCCAL OSCCAL
TRISIO = %000110
ANSEL = 0'0-назначим порты цифровыми,7-аналоговыми)
CMCON = 7
'--------------------------------------------------------------------------
Symbol T0IF = INTCON.2 ; Флаг переполнения TMR0
Symbol T0IE = INTCON.5 ; Разрешить прерыв. по переполнен. TMR0
Symbol GIE = INTCON.7 ; Разрешить глобальные прерывания
OPTION_REG = %00000111
T0IE = 1
GIE = 0
'--------------------------------------------------------------------------

Symbol clk = GPIO.0 'шина SPI, данные
Symbol din = GPIO.5 'шина SPI, такт
Symbol MINUS = GPIO.1
Symbol PLUS = GPIO.2
Dim SetMIN As Byte ;Для работы с кнопками
Dim SetPlus As Byte ;Для работы с кнопками
Dim BIG As Dword ;для счета секунд в прерывании
Dim BIG1 As BIG.HighWord ;для счета секунд в прерывании
Dim RG As Byte 'регистр управления
Dim DIG1 As Byte 'переменная для 1-го разряда индикатора
Dim DIG2 As Byte 'переменная для 2-го разряда индикатора
Dim DIG3 As Byte 'переменная для 3-го разряда индикатора
Dim DIG4 As Byte 'переменная для 4-го разряда индикатора
Dim F As Byte 'признак передачи команды "1" или данных "0"
Dim PlagPWM As Byte
Dim OutPWM As Byte
Dim N As Byte
Dim FlagZap As Byte
Dim SEC As Byte
Dim SEC1 As Byte
Dim C As Byte ;автоповтор кнопоки через С циклов
Dim Value As Byte
FlagZap = 0
SEC = 7
SEC1 = 0
C = 20 ;автоповтор кнопоки через С = 20 циклов
'-----------------------------------------------------------------------------

PlagPWM = ERead 0 ;Считаем статус флага по адрсу -0-
If PlagPWM = 1 Then ;Если флаг равен 1,значит был факт записи значения ШИМ
OutPWM = ERead 1 ;по адресу -1-, с считаем его и присвоим значение OutPWM
Else ;иначе присвоим ШИМ = 50% заполнения OutPWM = 127
OutPWM = 127
EWrite 1, [OutPWM];сохраняем значение PWM по адресу -1-
EWrite 0, [1] ;сохраняем 1 флаг по адрсу -0-
EndIf

GoSub Bright

On_Interrupt GoTo MYINT
GoTo main ; Переход на начало программы

MYINT: '--------------------- Обработчик прерывания ---------------------------------------

Context Save
big1 = big1 - 1 ' отнимаем единицу из старшего байта переменной BIG1
If BIG < 0 Then
BIG = BIG + 1000000
If FlagZap = 1 Then Inc SEC
EndIf
T0IF = 0 ' сбросить флаг прерываний TOIF регистра TMRO
Context Restore

'-------------------------------------------------------------------------------------------

main:

;-----------------------Подпрограмма работы с кнопками---------------------------------------

If FlagZap = 0 And MINUS = 1 Or PLUS = 1 Then
FlagZap = 1 ;Флаг нужен для работы с EEPROM
GIE = 1;Включим прерывания
EndIf

If MINUS = 1 Then Inc SetMIN 'кнопка минус
If SetMIN > C Then SetMIN = 0 : Dec OutPWM : SEC = 0 : GoSub Disp

If PLUS = 1 Then Inc SetPlus 'кнопка плюс
If SetPlus > C Then SetPlus = 0 : Inc OutPWM : SEC = 0 : GoSub Disp
;Если флаг равен 1,значит была регулировка скорости и по истечении 8 сек запишем
; в EEPROM новое значение скорости вращения
If FlagZap = 1 And SEC > 7 Then
GIE = 0;Выключим прерывания
FlagZap = 0 ;сбросим флаг
'SEC = 0 ;сбросим секунды
EWrite 1,[OutPWM];сохраним новое значение ШИМ в EEPROM поадресу -1-
EndIf
If SEC <> SEC1 Then SEC1 = SEC : GoSub Bright ;Управляем яркостью

PWM GPIO.4, OutPWM,1;Формируем шим сигнал на ноге №3 мк.

GoTo main

Disp:

If OutPWM < 80 Then OutPWM = 80 ;Установим нижний предел ШИМ
If OutPWM > 254 Then OutPWM = 254;Установим верхний предел ШИМ
If FlagZap = 1 Then
N = SEC : GoSub Convert
DIG1 = Value
Else
DIG1 = $00'Погасим 1 разряд индикатора тысяч,у нас всего предел макс. 254
EndIf
N = Dig OutPWM ,2 : GoSub Convert ;Выделим соответст цифру из перем OutPWM и сконвертируем её для ССИ
DIG2 = Value
N = Dig OutPWM ,1 : GoSub Convert
DIG3 = Value
N = Dig OutPWM ,0 : GoSub Convert
DIG4 = Value
'F = 0
GoSub serial
Return

Convert:
Value = LookUp N, [63,6,91,79,102,109,124,7,127,103]'маска общий катод
Return
'подпрограмма последовательной передачи данных на ТМ1637
serial:

din = 1 'подготовка SPI к началу передачи данных
clk = 1 'подготовка SPI к началу передачи данных
din = 0 'старт передачи данных
clk = 0 'старт передачи данных
If F = 1 Then
SHOut din,clk,0,[RG\9] 'передача команд
Else
SHOut din,clk,0,[RG\9,DIG1\9,DIG2\9,DIG3\9,DIG4\9] 'передача адреса и данных
EndIf
clk = 0 'стоп передачи данных
din = 0 'стоп передачи данных
clk = 1 'стоп передачи данных
din = 1 'стоп передачи данных
Return

Bright:
'-----------------------------------------------------------------------------
F = 1 'передача команды на ТМ1637
RG = %01000000 'КОМАНДА №1(режим записи данных) $40
GoSub serial 'подпрограмма последовательной передачи данных
' YAR 0 1 2 3 4 5 6 7 выбор яркости
RG = LookUp SEC, [143,142,141,140,139,138,137,136]'[136,137,138,139,140,141,142,143]
GoSub serial
'-------------------------------------------------------------------------------
F = 0 'передача данных на ТМ1637
RG = %11000000 'КОМАНДА №2(адрес первого разряда индикатора) $C0
GoSub Disp
Return
Прикрепления: 6680418.jpg (17.1 Kb)

Сообщение отредактировал PINCOD - Вт, 14.02.2017, 21:09
ADMIN Дата: Ср, 15.02.2017, 03:01  |                                                                                                                Сообщение # 7
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Есть одно замечание - а почему не в каталог статей?
В форуме затеряется проект, а в каталоге найти проще. Особенно красиво, когда с фотографиями готового устройства.
PINCOD Дата: Ср, 15.02.2017, 07:37  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 31
Репутация: 1   ±
Замечания:   ±
На сайте с 05.10.2011

Статус: Offline

Я не считаю,это проектом,а просто эксперимент на беспаечной макетной плате.Думаю,кто ищет тот найдёт.Если найду ему применение,то выложу законченный девайс,в соответствующей ветке
Форум Picbasic.ru » Программирование МК » PicBasicPro » Пример динамической индикации на микросхеме ТМ1636 (PIC16F84A + TM1636 + LED индикатор 4раз. х 8сег.)
  • Страница 1 из 1
  • 1
Поиск: