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
'* 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
Re: K42 and Timer Interrupts
Thanks for the explanation.
Ioannis - 28th April 2025, 19:28I misinterpreted these paragraphs. My understanding was to have ASYNC cleared and use Fosc/4.
Ioannis