мощные семисегментные микросхемы драйверов
В патенте I этой серии мы сосредоточились на TM1637, его цифровых сигналах и синхронизации. Для сравнения, сигналы TM1638 намного проще. Поскольку у него есть дополнительный STB (так же, как линия CS SPI), нет необходимости в условиях START, END.
Несколько недорогих семисегментных модулей используют TM1638, например QTF-TM1638, модули LED&KEY. Основные функции включают в себя:
- 8 семисегментных цифр
- кнопочная клавиатура
Вот схема подключения модуля LED&KEY с пропеллером.
CON _clkmode = xtal1 + pll16x 'Standard clock mode * crystal frequency = 80 MHz _xinfreq = 5_000_000 CON DIO_PIN = 24 CLK_PIN = 25 STB_PIN = 26 DAT digits BYTE %00111111, %00000110, %01011011, %01001111, %01100110, %01101101, %01111101, %00000111, %01111111, %01101111 PUB main dira[DIO_PIN] := 1 dira[CLK_PIN] := 1 dira[STB_PIN] := 1 outa[STB_PIN] := 1 outa[CLK_PIN] := 1 start send_byte($8f) 'turn on end start send_byte($40) 'write to register end start 'clear send_byte($c0) repeat 16 send_byte($00) end start send_byte($c0) send_byte(digits[3]^$80) send_byte($01) send_byte(digits[1]) send_byte($01) send_byte(digits[4]) send_byte($01) send_byte(digits[1]) send_byte($01) send_byte(digits[5]) send_byte($01) send_byte(digits[9]) send_byte($01) send_byte(digits[2]) send_byte($01) send_byte(digits[6]) send_byte($01) end repeat PRI send_byte(data_byte) 'lsb first repeat 8 outa[CLK_PIN] := 0 delay outa[DIO_PIN] := data_byte & $01 data_byte >>= 1 outa[CLK_PIN] := 1 delay PRI start outa[STB_PIN]:= 0 delay PRI end outa[STB_PIN] := 1 delay PRI delay '10us waitcnt(clkfreq/100_000 + cnt)
Что следует отметить:
- Функции start, end и send_byte намного проще по сравнению со SPIN-кодом TM1637.
- три команды для включения/выключения дисплея (0x80/0x8F), установки ввода/вывода данных (0x40/0x44/0x42), установки адреса (от 0xC0 до 0xCF) очень похожи на TM1637; однако, поскольку TM1638 поддерживает 10 сегментов, для хранения их информации о включении/выключении требуется два байта. Согласно схеме модуля (здесь), сегмент 9 идет на зажигание светодиода.
Теперь давайте добавим код для чтения нажатия кнопки, отсканированного TM1638.
CON _clkmode = xtal1 + pll16x 'Standard clock mode * crystal frequency = 80 MHz _xinfreq = 5_000_000 CON DIO_PIN = 24 CLK_PIN = 25 STB_PIN = 26 DAT digits BYTE %00111111, %00000110, %01011011, %01001111, %01100110, %01101101, %01111101, %00000111, %01111111, %01101111 VAR byte DIN[4] PUB main | Index dira[DIO_PIN] := 1 dira[CLK_PIN] := 1 dira[STB_PIN] := 1 outa[STB_PIN] := 1 outa[CLK_PIN] := 1 start send_byte($8f) 'turn on end start send_byte($40) 'write to register end start 'clear send_byte($c0) repeat 16 send_byte($00) end repeat start send_byte($42) delay repeat Index from 0 to 3 read_byte(@DIN[Index]) end start send_byte($40) end start send_byte($c0) repeat Index from 0 to 3 send_byte(DIN[Index]) send_byte($01) end waitcnt(clkfreq/10 + cnt) PRI read_byte(data_byte_addr) | tmp tmp := 0 dira[DIO_PIN]~ repeat 8 tmp <<= 1 outa[CLK_PIN] := 0 delay outa[CLK_PIN] := 1 tmp := tmp | ina[DIO_PIN] delay byte[data_byte_addr] := tmp >< 8 dira[DIO_PIN]~~ PRI send_byte(data_byte) 'lsb first repeat 8 outa[CLK_PIN] := 0 delay outa[DIO_PIN] := data_byte & $01 data_byte >>= 1 outa[CLK_PIN] := 1 delay PRI start outa[STB_PIN]:= 0 delay PRI end outa[STB_PIN] := 1 delay PRI delay '10us waitcnt(clkfreq/100_000 + cnt)
Что следует отметить:
- Функция read_byte сдвигает биты с вывода DIO и сохраняет 4 байта в массив.
- Эти 4 байта затем используются для освещения 4 семисегментных цифр.
- Из-за проводки кнопок от S1 до S8 вы увидите, что соответствующий сегмент загорается при нажатии кнопки.
Легче определить, какая кнопка сканируется в 4-х байтах, посмотрев на сигнал на выводе DIO на осциллографе.
Вы спрашиваете, почему B0 второго байта становится высоким при нажатии S2.
Сначала согласно схеме кнопка S2 подключается между «K3» и «SEG3». Тогда по этой таблице
BYTE2 (вторая строка), K3 и KS3 соответствует B0. Тайна разгадана.