Светодиодный индикатор на базе ТМ1637
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Светодиодный индикатор на базе ТМ1637
Немного не в тему - TM1628 посмотрите, если хочется много выводить инфы. Во первых она до 8 разрядов умеет, во вторыху нее подключение на SPI чем то смахивает, только вместо CS у нее вывод STB есть - по сути тот же CS. Я с 1628, 1637, 1650 много работал - очень простые и удобные они. Если библиотеки не использовать, то без проблем с любым МК работают, даже с самыми чахлыми.
Не важно чем все начнется. Важно чем кончится!
Re: Светодиодный индикатор на базе ТМ1637
Viper_Snake, есть у вас для ТМ1637 программка для AVR контроллера и модель для Протеуса? Хочу в симуляторе опробовать этот индикатор, пока реальные из Китая жду.
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Светодиодный индикатор на базе ТМ1637
К сожалению сейчас ничего готового нет. Но вы и сами ее вполне можете написать - лично у меня это программный I2C и буфер для вывода на дисплей 4-х байтный в виде массива. Я использую фиксированную адресацию при работе с этими контроллерами, сначала собираю изображение в буфер, к потом скармливаю его контроллеру. По сути у меня эти дисплеи в графическом режиме работают.
Не важно чем все начнется. Важно чем кончится!
Re: Светодиодный индикатор на базе ТМ1637
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4485483#p4485483"]К сожалению сейчас ничего готового нет. Но вы и сами ее вполне можете написать[/uquote]
Посмотрите последнее сообщение на предыдущей странице.
Посмотрите последнее сообщение на предыдущей странице.
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Светодиодный индикатор на базе ТМ1637
Что то там каша... Смотрите, вкратце: в даташите подробно описан формат посылки для корректной работы контроллера: сначала мы сообщаем ему что хотим делать (писать в регистры чтобы выводить изображение или читать состояние кнопок), после этого сообщаем адрес регистра, куда будем писать данные(соответственно какой разряд будем показывать), затем пишем сами данные и в конце байт управления дисплеем(включен/выключен) какая яркость.
Добавлено after 16 minutes 46 seconds:
Грубо говоря, чтобы вывести символ единицы в старшем сегменте надо скормить контроллеру следующее: START->0x44->STOP->(ACK)->START->0xC0(ACK)->0x06(ACK)->STOP->START->0x8F(ACK)->STOP
Тут мы сообщаем, что будем писать в фиксированный адрес (0x44 - в даташите таблица 1 Data command setting), собственно говоря сообщаем адрес первого разряда (0xC0 - табл. 2 Adress command setting), пихаем то, что хотим записать (0x06 - по той же таблице 2) и в конце сообщаем, что дисплей включен на максимальной яркости (0x8F - табл 3 Display control). Вот и все, что надо.
Добавлено after 16 minutes 46 seconds:
Грубо говоря, чтобы вывести символ единицы в старшем сегменте надо скормить контроллеру следующее: START->0x44->STOP->(ACK)->START->0xC0(ACK)->0x06(ACK)->STOP->START->0x8F(ACK)->STOP
Тут мы сообщаем, что будем писать в фиксированный адрес (0x44 - в даташите таблица 1 Data command setting), собственно говоря сообщаем адрес первого разряда (0xC0 - табл. 2 Adress command setting), пихаем то, что хотим записать (0x06 - по той же таблице 2) и в конце сообщаем, что дисплей включен на максимальной яркости (0x8F - табл 3 Display control). Вот и все, что надо.
Не важно чем все начнется. Важно чем кончится!
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Светодиодный индикатор на базе ТМ1637
[uquote=">TEHb<",url="/forum/viewtopic.php?p=4485540#p4485540"]Там же ещё порядок бит обратный.[/uquote]
Кстати да, вы совершенно правы!
Добавлено after 7 minutes 6 seconds:
Я когда вынужденно с TM1650 переходил на ТМ1637 очень долго плевался, так как сразу этого нюанса не увидел. Надо было на плату с ОК индикатором впилить ОА индикатор - пригодился китайский шилд на 1637. Но грабли нападают изза угла неожиданно - не сразу сообразил, чего он у меня не кажет.
Добавлено after 7 minutes 55 seconds:
TM1650 кстати, на мой взгляд, наиболее удачная из всей серии, что мне попадались. И клавиатуру большую можно навесить на нее и дополнительные выводы для этого на ней не нужны в отличие от той же 1628
Кстати да, вы совершенно правы!
Добавлено after 7 minutes 6 seconds:
Я когда вынужденно с TM1650 переходил на ТМ1637 очень долго плевался, так как сразу этого нюанса не увидел. Надо было на плату с ОК индикатором впилить ОА индикатор - пригодился китайский шилд на 1637. Но грабли нападают изза угла неожиданно - не сразу сообразил, чего он у меня не кажет.
Добавлено after 7 minutes 55 seconds:
TM1650 кстати, на мой взгляд, наиболее удачная из всей серии, что мне попадались. И клавиатуру большую можно навесить на нее и дополнительные выводы для этого на ней не нужны в отличие от той же 1628
Не важно чем все начнется. Важно чем кончится!
Re: Светодиодный индикатор на базе ТМ1637
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4485483#p4485483"]Но вы и сами ее вполне можете написать...[/uquote]
Зачем, когда есть 1000 уже написанных? Одна из. https://github.com/DetSimen/TM1637.
Зачем, когда есть 1000 уже написанных? Одна из. https://github.com/DetSimen/TM1637.
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Светодиодный индикатор на базе ТМ1637
Библиотека... А вы попробуйте с этой библиотекой под ту же тини13 скомпилироваться - сильно расстроитесь...
Не важно чем все начнется. Важно чем кончится!
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Светодиодный индикатор на базе ТМ1637
Vlad_RK, посмотри мой код на ассемблере.
посмотри, может, поможет тебе.
Код: Выделить всё
.def count_bits = R24 ; счетчик битов
.equ pin_TM1637 = pinD
.equ ddr_TM1637 = ddrD
.equ port_TM1637 = portD
.equ pin_clk = 0
.equ pin_data = 1
;--- Порт D ---
; Порт D0 - clock
; Порт D1 - data
ldi R26, (1<<pin_clk)
out port_TM1637, R26
out ddr_TM1637, R26
;clock - выход, = 1, на время передачи битов - активный выход, исключающий работу подтяжки.
;data - вход без внутренней подтяжки, работает внешняя подтяжка.
; подпрограммы
;--- ---
start:
sbi ddr_TM1637, pin_data ; data = 0
nop
nop
cbi port_TM1637, pin_clk ; clock = 0
ret
;--- ---
stop:
sbi port_TM1637, pin_clk ; clock = 1
nop
nop
cbi ddr_TM1637, pin_data ; data = 1, за счет внешней подтяжки
ret
;--- ---
;R26 - передаваемый байт
write_byte:
ldi count_bits, 8 ; счетчик битов
cycle_write_byte:
cbi port_TM1637, pin_clk ; clock = 0
lsr R26 ; сдвиг байта вправо
brcc set_0 ; если бит = 0, переходим на метку set_0
cbi ddr_TM1637, pin_data ; если бит = 1, data = 1, за счет внешней подтяжки
rjmp yes_1 ; и переходим на метку set_1
set_0:
sbi ddr_TM1637, pin_data ; если бит = 0, data = 0, тут data - активный выход
nop
yes_1:
nop
nop
sbi port_TM1637, pin_clk ; clock = 1
dec count_bits
brne cycle_write_byte
; далее действия на время ответного нулевого импульса.
cbi port_TM1637, pin_clk ; clock = 0
cbi ddr_TM1637, pin_data ; data = 1 за счет внешней подтяжки
sbi port_TM1637, pin_clk ; clock = 1, data = 1 за счет ответного нулевого импульса
nop
nop
cbi port_TM1637, pin_clk ; clock = 0
sbi ddr_TM1637, pin_data ; data = 0, тут data - активный выход
ret
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Светодиодный индикатор на базе ТМ1637
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4485560#p4485560"]Библиотека... А вы попробуйте с этой библиотекой под ту же тини13 скомпилироваться - сильно расстроитесь...[/uquote]
Да. да. На С++ код больше чем на Си, а на Си больше чем на асм. Я по таймеру уже пример приводил, не дошло? А во вторых, у человека в Протеусе Мега32, ага?
Да. да. На С++ код больше чем на Си, а на Си больше чем на асм. Я по таймеру уже пример приводил, не дошло? А во вторых, у человека в Протеусе Мега32, ага?
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Светодиодный индикатор на базе ТМ1637
ATtiny13A + TM1637 + библ. DetSimen/TM1637. Даже с ArduinoIDE, MicroCore в Attiny13A остается место для других функций.
Proteus v8.13

Proteus v8.13
- Вложения
-
- attiny13a_tm1637_proteus.zip
- (27.83 КБ) 128 скачиваний
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Светодиодный индикатор на базе ТМ1637
Не, ну если так, к чему тогда вопросы: берите библиотеку и вперёд. Просто все эти библиотеки не дают понимания как работает железяка и в случае если надо сделать что-то нестандартное - начинается период глубокого непонимания и затяжного отупения. Вот, например, попробуйте с помощью вышеуказанной библиотеки кнопочки опросить, или энкодер, подключенные к этой микросхеме. Тут и начнутся главные вилы, ибо в библиотеку этот функционал автор по причине лени не завез. А перевести весь интерфейс управления на плечи ТМки и освободив несколько портов МК, иногда которых и так не всегда хватает, это вполне себе отличное решение.
Не важно чем все начнется. Важно чем кончится!
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Светодиодный индикатор на базе ТМ1637
Согласно поставленным целям:
- готовый код/библиотека: с идеями/ограничениями автора, но запускается быстро, самому ничего не придумываешь
- собственный код, скомпилированный из чужых программ: с необходимых функций, но все равно большим по объему, сборка кода требует времени
- собственный код, для конкретной задачи, используя pdf упр. устройтво: минимальный по объёму кода, учтенные функции и анализ алгоритмов, оптимизированные по времени, используется память, функции конкретного устройства и т.д., но это требует времени, испытаний и собственного мышления.
Особенно то, если код будет "универсальной", как все используемые или редко используемые функции должны быть добавлены, вкл с реальных тестов оптимальности. Больше всего нравится последний путь, но всегда нет времени ... А напр. мне потребовалось 10..12 минут, чтобы запустить готовый код, приведенный выше, от загрузки либа из и-нета до запуска в симуляторе (с заранее нарисованной схемой из других проектов).
- готовый код/библиотека: с идеями/ограничениями автора, но запускается быстро, самому ничего не придумываешь
- собственный код, скомпилированный из чужых программ: с необходимых функций, но все равно большим по объему, сборка кода требует времени
- собственный код, для конкретной задачи, используя pdf упр. устройтво: минимальный по объёму кода, учтенные функции и анализ алгоритмов, оптимизированные по времени, используется память, функции конкретного устройства и т.д., но это требует времени, испытаний и собственного мышления.
Особенно то, если код будет "универсальной", как все используемые или редко используемые функции должны быть добавлены, вкл с реальных тестов оптимальности. Больше всего нравится последний путь, но всегда нет времени ... А напр. мне потребовалось 10..12 минут, чтобы запустить готовый код, приведенный выше, от загрузки либа из и-нета до запуска в симуляторе (с заранее нарисованной схемой из других проектов).
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Светодиодный индикатор на базе ТМ1637
Да я и не спорю, просто найти качественную библиотеку, которая не перегружает процессор избыточными операциями и не жрет память как собака мясо сейчас гораздо труднее, чем увидеть как паровоз @бет козу. Например - прикупил по случаю два дисплейчика TFT 160x80 на ST7735. Ну, решил посмотреть, что к чему. Так как проще всего их пощупать с помощью ардуины - к ней же и подключил, а в качестве либы Адафрутовское поделие взял. И хоть я пытался по минимуму код написать - фиг вам получился. Подтянулась еще пачка либ, которые мне абсолютно не нужны и код распух до 12 Кб. Зачем оно так? 12 Кб, чтобы "Hello world" высрать на экран?
Не важно чем все начнется. Важно чем кончится!
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Светодиодный индикатор на базе ТМ1637
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4485637#p4485637"]... которые мне абсолютно не нужны и код распух до 12 Кб. Зачем оно так? 12 Кб, чтобы "Hello world"...[/uquote]
Прежде чем писать так, поставьте себя хотя бы раз на противоположную сторону: допишите/напишите "с нуля"/программный код для чего-то (напр. новое устройство, или набор функций), разработайте прогр. код, почистите ошибки, подробно опишите и опубликуйте код для бесплатного использования. Также можете оставить канал открытым для рекомендаций и дополнений. Напр. под лицензии GNU. Обнаружите, насколько это сложно, насколько трудоемко, отнимает много времени и т.д. и как невозможно удовлетворить все пожелания потребителей.
После того, как сделаете основной код/функции, напр. приду и спрошу: А где функция для ... ? - чего-то особенного или никогда не используемого
. Но это делает код неуниверсальным. И будет версия 1,2,3..100 ... написано годами. Дело не в том, что они не могли писать "простой код". Они ушли оттуда, чтобы код стал универсальным. И всегда найдется тот, кому что-то не-ОК по какой-то причине.
Т.е. вероятно, код Adafruit предназначен не только для Hello world. Постарайтесь посмотреть и понять, что уже сделали (функции напр. в .h файл), и использовать все это, когда нужно. Сэкономлены тысячи человеко-часов труда. И все ето бесплатно. (частично пользуюсь переводчиком бг->ру)
Прежде чем писать так, поставьте себя хотя бы раз на противоположную сторону: допишите/напишите "с нуля"/программный код для чего-то (напр. новое устройство, или набор функций), разработайте прогр. код, почистите ошибки, подробно опишите и опубликуйте код для бесплатного использования. Также можете оставить канал открытым для рекомендаций и дополнений. Напр. под лицензии GNU. Обнаружите, насколько это сложно, насколько трудоемко, отнимает много времени и т.д. и как невозможно удовлетворить все пожелания потребителей.
После того, как сделаете основной код/функции, напр. приду и спрошу: А где функция для ... ? - чего-то особенного или никогда не используемого
Т.е. вероятно, код Adafruit предназначен не только для Hello world. Постарайтесь посмотреть и понять, что уже сделали (функции напр. в .h файл), и использовать все это, когда нужно. Сэкономлены тысячи человеко-часов труда. И все ето бесплатно. (частично пользуюсь переводчиком бг->ру)
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Светодиодный индикатор на базе ТМ1637
veso74, я вас прекрасно понимаю и ваши доводы вполне весомы, но есть другая сторона этого библиотечного безумия: вы ни на шаг не можете отступить от рамок, в которые вас загоняет библиотека, так как вынуждены использовать только ее функции. Свои вы не можете добавить, так как не понимаете, как именно работает железо. Это тупиковая ветвь развития, свойственная всем любителям Arduino которые пользуются исключительно возможностями языка Wiring. Да и сами библиотеки для Arduino зачастую на этом языке и написаны, поэтому кроме базовых возможностей человек, пользующийся подобным, больше ничего не может. А пересилить себя и копнуть чуть глубже многим откровенно лень. Я тоже был таким, пока не нарвался на ситуацию, когда для интересующей меня железки библиотеки рабочей просто не нашлось и мне самому пришлось узнавать, насколько глубока кроличья нора. Теперь я стараюсь избегать любых библиотек - лучше написать свои функции в коде, но только те, которые нужны и самому понятны, чем пытаться вникнуть в логику автора. Было время, я на проклятом модуле с TM1637 точки не мог зажечь нормально - просто не понимал, что и куда писать надо, а сейчас, когда потроха данной микросхемы мне известны, я могу сделать из нее все что угодно в рамках ее функционала. А сделать можно очень много.
Не важно чем все начнется. Важно чем кончится!
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Светодиодный индикатор на базе ТМ1637
Открываете файл .C и берете то, что вам нужно. Есть одна проблема: надо думать головой автора: что он хотел написать и что он написал, чтобы решить вопрос. Поверьте, это тоже сложно.
Со временем становится легче - лучше понимаете авторов, и "не изобретаете велосипед" для уже проверенных методов и алгоритмов. Через несколько лет будет и следующий шаг: в вашем коде все написано вами. И будет все равно, алгоритм описан ли в основном коде или в библиотеке. В качестве рекомендации: при наличии большого количества упр. устройств проще иметь внешнюю библиотеку для каждого устройства: напр. дисплей, енкодер, вн. EEPROM, DDS, PLL, expander и т.д. Таким образом, в случае возникновения ошибок и неточностей /без них невозможно писать
/ отправляетесь в соответствующее место для исправления. В противном случае, напр. с пр. кодом из 1 000..10 000 строк, происходит большая "прокрутка" от одного конца программы к другому изменить напр. один бит.
Со временем становится легче - лучше понимаете авторов, и "не изобретаете велосипед" для уже проверенных методов и алгоритмов. Через несколько лет будет и следующий шаг: в вашем коде все написано вами. И будет все равно, алгоритм описан ли в основном коде или в библиотеке. В качестве рекомендации: при наличии большого количества упр. устройств проще иметь внешнюю библиотеку для каждого устройства: напр. дисплей, енкодер, вн. EEPROM, DDS, PLL, expander и т.д. Таким образом, в случае возникновения ошибок и неточностей /без них невозможно писать
- Viper_Snake
- Электрический кот
- Сообщения: 1046
- Зарегистрирован: Вс мар 01, 2009 19:47:16
- Откуда: Ростов-на-Дону
Re: Светодиодный индикатор на базе ТМ1637
А чтобы подобного не было, нужно заранее продумать, какие биты могут быть подвержены изменениям и удобно оформить их. На чужих мозгах далеко не уехать в любом случае.изменить напр. один бит.
Не важно чем все начнется. Важно чем кончится!
Re: Светодиодный индикатор на базе ТМ1637
[uquote="Starichok51",url="/forum/viewtopic.php?p=4485567#p4485567"]Vlad_RK, посмотри мой код на ассемблере.
[/uquote]
Спасибо, конечно, за подпрограммки, но можно бы какой-то пример вывода цифр и точек на экран? С кнопками потом буду разбираться.
Я вот пытаюсь что-то подобное выдать: ;START->0x44->STOP->(ACK)->START->0xC0(ACK)->0x06(ACK)->STOP->START->0x8F(ACK)->STOP, но на индикаторе не "1", а что-то совсем другое.
Вот такой вариант (все есть в прикрепленном архиве):
veso74, ваш код работает, но С++ я не знаю, сейчас Си изучаю.
Спойлер
Код: Выделить всё
.def count_bits = R24 ; счетчик битов
.equ pin_TM1637 = pinD
.equ ddr_TM1637 = ddrD
.equ port_TM1637 = portD
.equ pin_clk = 0
.equ pin_data = 1
;--- Порт D ---
; Порт D0 - clock
; Порт D1 - data
ldi R26, (1<<pin_clk)
out port_TM1637, R26
out ddr_TM1637, R26
;clock - выход, = 1, на время передачи битов - активный выход, исключающий работу подтяжки.
;data - вход без внутренней подтяжки, работает внешняя подтяжка.
; подпрограммы
;--- ---
start:
sbi ddr_TM1637, pin_data ; data = 0
nop
nop
cbi port_TM1637, pin_clk ; clock = 0
ret
;--- ---
stop:
sbi port_TM1637, pin_clk ; clock = 1
nop
nop
cbi ddr_TM1637, pin_data ; data = 1, за счет внешней подтяжки
ret
;--- ---
;R26 - передаваемый байт
write_byte:
ldi count_bits, 8 ; счетчик битов
cycle_write_byte:
cbi port_TM1637, pin_clk ; clock = 0
lsr R26 ; сдвиг байта вправо
brcc set_0 ; если бит = 0, переходим на метку set_0
cbi ddr_TM1637, pin_data ; если бит = 1, data = 1, за счет внешней подтяжки
rjmp yes_1 ; и переходим на метку set_1
set_0:
sbi ddr_TM1637, pin_data ; если бит = 0, data = 0, тут data - активный выход
nop
yes_1:
nop
nop
sbi port_TM1637, pin_clk ; clock = 1
dec count_bits
brne cycle_write_byte
; далее действия на время ответного нулевого импульса.
cbi port_TM1637, pin_clk ; clock = 0
cbi ddr_TM1637, pin_data ; data = 1 за счет внешней подтяжки
sbi port_TM1637, pin_clk ; clock = 1, data = 1 за счет ответного нулевого импульса
nop
nop
cbi port_TM1637, pin_clk ; clock = 0
sbi ddr_TM1637, pin_data ; data = 0, тут data - активный выход
ret
Спасибо, конечно, за подпрограммки, но можно бы какой-то пример вывода цифр и точек на экран? С кнопками потом буду разбираться.
Я вот пытаюсь что-то подобное выдать: ;START->0x44->STOP->(ACK)->START->0xC0(ACK)->0x06(ACK)->STOP->START->0x8F(ACK)->STOP, но на индикаторе не "1", а что-то совсем другое.
Вот такой вариант (все есть в прикрепленном архиве):
Спойлер
Код: Выделить всё
.include "m32def.inc"
.def temp = r16 ;Временный регистр
.def count_bits = R24 ;Счетчик битов
.equ pin_TM1637 = pinC
.equ ddr_TM1637 = ddrC
.equ port_TM1637 = portC
.equ pin_clk = 0
.equ pin_data = 1
;--- Порт C ---
; Порт C0 - clock
; Порт C1 - data
;***** Векторы Прерываний *****
.CSEG
.org $000
rjmp RESET ;Сброс вектор
.org $002
reti
.org $004
reti
.org $006
reti
.org $008
reti
.org $00A
reti
.org $00C
reti
.org $00E
reti
.org $010
reti
.org $012
reti
.org $014
reti
.org $016
reti
.org $018
reti
.org $01A
reti
.org $01C
reti
.org $01E
reti
.org $020
reti
.org $022
reti
.org $024
reti
.org $026
reti
.org $028
reti
RESET: ldi temp,high(RAMEND) ;назначить стек
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
ldi R26, (1<<pin_clk)
out port_TM1637, R26
out ddr_TM1637, R26
;clock - выход, = 1, на время передачи битов - активный выход, исключающий работу подтяжки
;data - вход без внутренней подтяжки, работает внешняя подтяжка
;START->0x44->STOP->(ACK)->START->0xC0(ACK)->0x06(ACK)->STOP->START->0x8F(ACK)->STOP
PROG: rcall start
ldi R26, 0x44
rcall write_byte
rcall stop
rcall start
ldi R26, 0xC0
rcall write_byte
ldi R26, 0x06
rcall write_byte
rcall stop
rcall start
ldi R26, 0x8F
rcall write_byte
rcall stop
rjmp PROG
; подпрограммы
;--- ---
start:
sbi ddr_TM1637, pin_data ;data = 0
nop
nop
cbi port_TM1637, pin_clk ;clock = 0
ret
;--- ---
stop:
sbi port_TM1637, pin_clk ;clock = 1
nop
nop
cbi ddr_TM1637, pin_data ;data = 1, за счет внешней подтяжки
ret
;--- ---
;R26 - передаваемый байт
write_byte:
ldi count_bits, 8 ;счетчик битов
cycle_write_byte:
cbi port_TM1637, pin_clk ;clock = 0
lsr R26 ;сдвиг байта вправо
brcc set_0 ;если бит = 0, переходим на метку set_0
cbi ddr_TM1637, pin_data ;если бит = 1, data = 1, за счет внешней подтяжки
rjmp yes_1 ;и переходим на метку set_1
set_0:
sbi ddr_TM1637, pin_data ;если бит = 0, data = 0, тут data - активный выход
nop
yes_1:
nop
nop
sbi port_TM1637, pin_clk ;clock = 1
dec count_bits
brne cycle_write_byte
;далее действия на время ответного нулевого импульса
cbi port_TM1637, pin_clk ;clock = 0
cbi ddr_TM1637, pin_data ;data = 1 за счет внешней подтяжки
sbi port_TM1637, pin_clk ;clock = 1, data = 1 за счет ответного нулевого импульса
nop
nop
cbi port_TM1637, pin_clk ;clock = 0
sbi ddr_TM1637, pin_data ;data = 0, тут data - активный выход
ret- Вложения
-
- TM1637 (Asm).rar
- (43.5 КБ) 97 скачиваний