мощные семисегментные микросхемы драйверов

В патенте I этой серии мы сосредоточились на TM1637, его цифровых сигналах и синхронизации. Для сравнения, сигналы TM1638 намного проще. Поскольку у него есть дополнительный STB (так же, как линия CS SPI), нет необходимости в условиях START, END.

Несколько недорогих семисегментных модулей используют TM1638, например QTF-TM1638, модули LED&KEY. Основные функции включают в себя:

  1. 8 семисегментных цифр
  2. кнопочная клавиатура

Вот схема подключения модуля 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)

Что следует отметить:

  1. Функции start, end и send_byte намного проще по сравнению со SPIN-кодом TM1637.
  2. три команды для включения/выключения дисплея (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)

Что следует отметить:

  1. Функция read_byte сдвигает биты с вывода DIO и сохраняет 4 байта в массив.
  2. Эти 4 байта затем используются для освещения 4 семисегментных цифр.
  3. Из-за проводки кнопок от S1 до S8 вы увидите, что соответствующий сегмент загорается при нажатии кнопки.

Легче определить, какая кнопка сканируется в 4-х байтах, посмотрев на сигнал на выводе DIO на осциллографе.

Вы спрашиваете, почему B0 второго байта становится высоким при нажатии S2.

Сначала согласно схеме кнопка S2 подключается между «K3» и «SEG3». Тогда по этой таблице

BYTE2 (вторая строка), K3 и KS3 соответствует B0. Тайна разгадана.