Hi guys ,

have had a need to use the TM1637 4 digit display module

please refer to link for the display module circuit and display unit used

http://www.picbasic.co.uk/forum/showthread.php?t=23968

Thanks to richard for help on the start/stop/ write timing section

hope it of use to save some time when using this module


cheers

Sheldon

Code:
'*  Version : 0.0                                                              *
'*  Notes   : Driver Libary for TM1637 chip                                    *
'*          : For use on 4 digit with centre colon only                        *
'*          : Note: Driver does not support the keyscan option                 *
'*******************************************************************************
' Description:                                                                 *
'             This include supports 4 digits, no Decimal Points on each digit  *
'             and 1 colon in centre of 4 digits only                           *
'             No keyscan support setup on the TM1637 fuctions                  *
'                                                                              *
' Operation:                                                                   *
'             min voltage for Red, Yellow LED digits is 3.3 volt               *
'             min voltage for Green , Blue LED digits is 5v                    *
'             min clock width = 400ns                                          *
'             min data setup = 100ns + hold =100ns                             *
'             The Clock and Data Pin have pull up 4k7 resitor,                 *
'             with a 100pf cap to ground to reduce interfance buit into module *
'             The 2 colon led segments are connected to anode Com2,cath= seg8  *
'                                                                              *
'  Features :                                                                  *
'            Use either raw segment values or decimal numbers                  *
'            (with and without leading zero)                                   *
'            Set either the whole display or any digit independently           *
'            Control the brightness                                            *
'            Test display segments display                                     *
'=============================================================================='
'           TM1637 4 DIGIT COMMON ANODE - 1 COLON DISPLAY MODULE               *
'                                                                              *
'          Note: COLON = Grid2 - seg8(dp)- No other DP on this display         *
'       -----------------------------------------       DISPLAY FACING         *
'       |                                        |                             *
'       |   ______   _____     _____    _____    |                             *
'       |  |  A  |  |     |   |     |  |     |   |                             *
'       |  |F   B|  |     |   |     |  |     |  0 ----- CLK                    *
'       |  |_____|  |_____| O |_____|  |_____|  o ----- DIO                    *
'       |  |  G  |  |     |   |     |  |     |  0 ----- VCC                    *
'       |  |E   C|  |     | O |     |  |     |  0 ----- GND                    *
'       |  |__D__|  |_____|   |_____|  |_____|   |                             *
'       |   dig1     dig2      dig3     dig4     |                             *
'       |   grid1    grid2     grid3    grid4    |                             *
'       -----------------------------------------                              *
'                                                                              *
' =============================================================================*
' Command byte information TM1637                                              *
' Note: Bit5= 0 ,bit4 = 0 always                                               *
'    bit7 : Bit6                                                               *
'     0   :  1    = Data Command                                               *
'     1   :  0    = Display control Command                                    *
'     1   :  1    = Address command                                            '   
'  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *
'  Data Command table ( bit7 = 1 , bit6 = 0 , bit5=0,bit4 =0) Hex value $4x    *
'                                                                              *
' Bit1:Bit0                                                                    *
'  0 : 0   = Write Data to display                                             *
'  1 : 0   = Read key scan                                                     *
'  0 : 1   = reserved                                                          *
'  1 : 1   = reserved                                                          *
' Bit2  0 = Auto Address Adding , 1= Fixed Address                             *
' Bit3  0 = Normal Mode  1 = Test Mode                                         *
' = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =* 
'  Display Control Commnad table ( bit7=1 , Bit6 =0)  hex value $8x            *
'  Bit2:Bit1:Bit0 - display brightness control level 0 = low , level 7 = high  *
'   0  : 0  : 0   Display Brightness  1/16 - level 0                           *
'   0  : 0  : 1   Display Brightness  2/16 - level 1                           *
'   0  : 1  : 0   Display Brightness  4/16 - level 2                           *
'   0  : 1  : 1   Display Brightness 10/16 - level 3                           *
'   1  : 0  : 0   Display Brightness 11/16 - level 4                           *
'   1  : 0  : 1   Display Brightness 12/16 - level 5                           *
'   1  : 1  : 0   Display Brightness 13/16 - level 6                           *
'   1  : 1  : 1   Display Brightness 14/16 - level 7                           *
'                                                                              *
' Bit3 0 = Display Off 1 = Display On                                          *
'                                                                              *
' = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*  
'  Grid Segment Address Command Table ( Bit7= 1 ,Bit6 = 1 ) Hex Value = $Cx    *
'  Display Adreess Registers                                                   *
'  Bit3-Bit0  $C0 = Grid1(dig1), $C1 = Grid2(dig2+colon) ,$C2=Grid3 ,$C3=Grid4 *
'                                                                              *
' Eech bit for each Grid byte controls a digit led Segment                     *
' Bit7=Seg8(DP,COlON),Bit6=Seg7(led-G),Bit5=Seg6(led-F),Bit4=Seg5(led-E)       *
' Bit3=Seg3(led-D),Bit2=Seg2(led-C),Bit1=Seg1(led-B),Bit0=Seg1(led-A)          *
'                                                                              *
'==============================================================================*

TM_DIO_OUT     var  LATB.2          ' Data Pin OUT TM1637 include - 4dig 7seg Display Module  
TM_DIO_IN      VAR  PORTB.2         ' Data Pin In  ( not used )
TM_CLK         var  LATB.3          ' Clock Pin- set in TM1637 include - 4dig 7seg Display Module 
DIR_TM_DIO     var  TRISB.2         ' Direction control for tm_dio pin  0 = out  1 = in


TM1637_WR          con $40          ' write data command , with auto Address adding , display mode = normal 
TM1637_WR_fixed    con $44          ' write data command , with fixed Address , display mode = normal
Cmd_Dig_Seg        con $C0          ' Grid Segment Address Command $C0 - $C3 used on this module 
TM1637_Dsp_CTL     con $80          ' display bright control command , bit3-0=display off 1= on ,bit2-0 brightness 0 - low 7 = high  

Dig_7seg      var byte[4]           ' 4 byte array byte for each digit in use  
TM1637_Data   var byte              ' value for each digit / segment in send command  
YY            var byte              ' geneeral loop varable 
g_num         var word              ' reqested number or chr to be dipslayed 
TM1637_Bright var byte              ' display brightness value (0-7) 0=low to 7=high brighness 
Colon_On      var bit               ' select if the colon segment is on/off 
TM1637_On     var bit               ' select display on / off bit for command3  
R_Justfy      var bit               ' set leading 0 if digit value 0 displayed over the digits  


 DIR_TM_DIO = 0     ' set direction output as start 
 TM_CLK     = 1     ' SET HIGH AT START   - modual has pullups 
 TM_DIO_out = 1      ' set high at start - module has pullups 

goto Jumpover_TM1637
'======================================

TM1637_Startup:
' Command to do test pattern at device starup
'---- each digit turn on in seq, all digits 
    
      Dig_7seg(0) = 0
      Dig_7seg(1) = 0 
      Dig_7seg(2) = 0 
      Dig_7seg(3) = 0 
      TM1637_on = 1 
      for g_num = 0 to 3 
         Dig_7seg(g_num) = $FF 
          TM1637_On = 1 
          TM1637_Bright = 7
         gosub WR_4dig 
         pause 200
      next g_num
      gosub TM1637_flash   ' flash the display 3 times 
      gosub TM1637_off     ' turn off display 
 return 


' -------------------------------
TM1637_flash:
' flash the display 3 times with current values and brightness 
' if display was off prior to call , will leave it off after , visa versa if display was on prior      
     for g_num = 0 to 5         ' flash display on / off 3 times
          toggle TM1637_On  
          TM1637_Bright = 7
          gosub WR_Disp_Command3 
          pause 300
     next g_num    
return

'---------------------------------------------------------
   TM1637_Off:
 ' turn off the tm1637 display 
 
   TM1637_On = 0           ' set bit to 0 turn off display
   gosub WR_Disp_Command3  ' send the commands to display, other values dont care as display tuned off 
 return  
'--------------------------------------  

 WR_4dig:
' assumes each digit data 7 segment info varable ( dig1_7seg,dig2_7seg, dig3_7seg dig4_7seg ) 
' assumes brightness setting value for command3  ( tm1637_bright) 
' assumes colon bit,TM1637_ON Bit , Dig_7seg(0-3) value 


 '     TM1637_On = 1
 '     Colon_On = 1
 '     TM1637_Bright = 7

    gosub Start_data                               ' start seq
    TM1637_Data =  TM1637_WR                       ' set write data command1 , with auto Address increment , display mode = normal 
    Gosub Write_Tm1637                             ' write to module 
    gosub Stop_data                                ' stop seq after data command1 
    
    gosub Start_data                               ' start seq for command2  
    TM1637_Data = Cmd_Dig_Seg                      ' grid1 start address for auto increment  
    Gosub Write_Tm1637                             ' write to module 
    
    TM1637_Data = Dig_7seg(3)                      ' digit 4 Data on grid1  
    Gosub Write_Tm1637                             ' write to module 
    
    TM1637_Data = Dig_7seg(2)                      ' digit 3 Data on Grid2 
    TM1637_Data = TM1637_Data + (Colon_On << 7)    ' add colon bit setting  (bit7) to  digit2 data for grid2  
    Gosub Write_Tm1637                             ' write to module 
    
    TM1637_Data = Dig_7Seg(1)                      ' digit 2 data for grid3  
    Gosub Write_Tm1637                             ' write to module  
    
    TM1637_Data = Dig_7Seg(0)                      ' digit 1 data for grid4 
    Gosub Write_Tm1637                             ' write to module 
    Gosub Stop_data                                ' send stop seq to show end of address data 

WR_Disp_Command3:                                  ' Label to write display command3 only  , assumes dig_7seg(0-3)+ colon setting, brightness , display on /off setting  
    gosub Start_data                               ' start seq  for command 3 to start 
    TM1637_Data = TM1637_Dsp_CTL                   ' build display command3 byte
    TM1637_Data = TM1637_Data +(TM1637_On <<3)     ' add display on/off bit setting(bit3)to command3  
    TM1637_Data = TM1637_Data + TM1637_Bright      ' add display brighness value ( 0-7 ) to byte command3
    Gosub Write_Tm1637                             ' write to module 
    gosub Stop_data                                ' stop seq 
    
  return 

 
'-----------------------------------------------------------------------------
' digits placed and display left to right with 4th digit first 1digit last 
' routine can set all 4 values
' assumes R_Justfy value, g_num  
 Put_4dig:
    TM1637_Data = g_num DIG 3            ' get 4th digit value into temp varable 
    gosub lookup_dig                        ' convert value to 7seg display value 
    Dig_7seg(3) = TM1637_Data               ' place 7seg value into digit1 including "0" 
    if TM1637_Data = $3F then               ' if it 7seg "0" then 
       if R_Justfy = 0 then Dig_7seg(3) = 0 ' if flag not set dont show digit   
    endif       

 Put_3dig:
    TM1637_Data = g_num DIG 2            ' get 3rd digit value into temp varable 
    gosub lookup_dig                        ' convert value to 7seg display value 
    Dig_7seg(2) = TM1637_Data               ' place 7seg value into digit1 including "0" 
    if TM1637_Data = $3F then               ' if it 7seg "0" then 
       if R_Justfy = 0 then Dig_7seg(2) = 0 ' if flag not set dont show digit   
    endif       
 
 Put_2dig:
    TM1637_Data = g_num DIG 1           ' get 2nd digit value into temp varable 
    gosub lookup_dig                        ' convert value to 7seg display value 
    Dig_7seg(1) = TM1637_Data               ' place 7seg value into digit1 including "0" 
    if TM1637_Data = $3F then               ' if it 7seg "0" then 
       if R_Justfy = 0 then Dig_7seg(1) = 0 ' if flag not set dont show digit   
    endif       
 
 Put_1dig:
	TM1637_Data = g_num DIG 0            ' get 1st digit value into temp varable 
    gosub lookup_dig                        ' convert value to 7seg display value 
    Dig_7seg(0) = TM1637_Data               ' place 7seg value into digit1 including "0" 
   
 return 
'------------------------------------------------------------------------------
lookup_dig: 
' converts selected dec value to 7seg display value 
' digits display      0   1   2   3   4   5   6   7   8   9   
 lookup TM1637_Data,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],TM1637_Data

return

'-----------------------------------------------------------------------------
test_txt:

' place "CH:" txt and current Rf CH value onto display ,
' use R_justfy leading 0 for 2 digits   
   Dig_7seg(3) = $39   '"C"
   Dig_7seg(2) = $76   '"H"
   Colon_On = 1        '":"
  g_num  = 1    ' get the current RF CH value 
   R_Justfy = 1        ' set leading 0 if single digit 
   gosub put_2dig      ' put 2 digits values for location dig3, dig4
   
   TM1637_Bright = 7   ' Set display  to full brightness  - value (0-7) 0=low to 7=high brighness 
   TM1637_On  = 1      ' select display on in command3 
   gosub WR_4DIG       ' write the values to display
return

 '--------------------------------------------
' signal requirments at start of command 
 Start_data:
   tm_CLK = 1
   tm_DIO_out = 1 
@ NOP   
   Tm_DIO_out = 0
@ NOP
   tm_CLK = 0
 return
'------------------------------------
' signal requirement after command is sent 
 Stop_data:
   tm_CLK = 0
   tm_DIO_out = 0
   tm_CLK = 1
@ NOP
   tm_DIO_out = 1
@ NOP 
 return

'--------------------------------------------
Write_TM1637:
' assumes TM1637_Data 
' commands/ data  sent LSbit first    
      yy= 0
      for yy = 0 to 7                   ' send 8 bits of data 
         tm_CLK = 0  
         tm_dio_out = TM1637_Data.0(yy)
         tm_CLK = 1 
@ NOP
      Next yy
      tm_CLK = 0                 ' clock in data to look for the Ack from TM1637 
      DIR_TM_DIO = 1             ' set Data pin direction to input , release  
      tm_CLK = 1                 ' clock in ACK data on rising edge from TM1637 
@ NOP                            ; allow time for input of ACK 
@ NOP
@ NOP
      tm_CLK = 0                 ' release DIO on oomplete 9th clock 
@ NOP 
      DIR_TM_DIO = 0             ' set Data pin direction to output
    
 return
 
 '----------------
'show_number:
'send number example 
     g_num = 32
     R_Justfy = 1      ' place leading 0 in display 
     gosub Put_4dig    ' place 4 digit values 
     
     TM1637_On = 1
     Colon_On = 0
     TM1637_Bright = 7
     gosub WR_4dig 


'return
'-------------------------------------
 
 
 
 
 
'==========================================================================

 Jumpover_TM1637:    'Jumpover code for PBP compile requirements