How to use TM1637 chip for LED Display?


Closed Thread
Results 1 to 14 of 14

Hybrid View

  1. #1
    Join Date
    May 2011
    Location
    Bangalore, India
    Posts
    33


    Did you find this post helpful? Yes | No

    Default Re: How to use TM1637 chip for LED Display?

    WOW! FINALLY, IT HAPPENED!!

    The TM1637 LED display module came alive!!!
    I used your revised code for 18F devices and after I made a few changes in the CONFIG section, the compilation for 18F2620 was successful.
    I programmed and inserted the PIC in the breadboard and powered it up. After the LED blinked 3 times, it was a real pleasant sight to see the digits appear on the LED module.
    Thanks a lot Richard, for your patience and helping nature.

    The code I used for 18F2620 is reproduced below.
    OSCCON = $60; OSCTUNE.6 = 1 - These two settings in your code make the Osc 16Mhz (4MHz x 4). So, I changed the Osc speed from 32 to 16MHz. Later, I tried the code at 8MHz and 4MHz. It works beautifully at those speeds too.

    Code:
    '-------------------------------------------------------------------------------
    'PIC used: 18F2620
    'Pinout
    '                  ---------                                                        
    '   E.3 =         1         28  B.7 = 
    '   A.0 =         2         27  B.6 = 
    '   A.1 =         3         26  B.5 = 
    '   A.2 =         4         25  B.4 = LED
    '   A.3 =         5         24  B.3 = 
    '   A.4 =         6         23  B.2 = 
    '   A.5 =         7         22  B.1 = CLK
    '   Gnd           8         21  B.0 = DIO
    '   A.7 =         9         20  +5V 
    '   A.6 =        10         19  Gnd     
    '   C.0 =        11         18  C.7 = 
    '   C.1 =        12         17  C.6 = 
    '   C.2 =        13         16  C.5 = 
    '   C.3 =        14         15  C.4 =  
    '                  ---------
    '-------------------------------------------------------------------------------
    #CONFIG
      CONFIG  OSC = INTIO67         ; CONFIG  FOSC = INTIO67
      CONFIG  FCMEN = OFF
      CONFIG  IESO = OFF
      CONFIG  PWRT = OFF
      CONFIG  BOREN = SBORDIS
      CONFIG  BORV = 2              ; CONFIG  BORV = 18
      CONFIG  WDT = ON              ; CONFIG  WDTEN = ON
      CONFIG  WDTPS = 512
      CONFIG  CCP2MX = PORTC
      CONFIG  PBADEN = OFF
      CONFIG  LPT1OSC = OFF
    ;  CONFIG  HFOFST = ON        ;Not applicable to 18F2620
      CONFIG  MCLRE = ON
      CONFIG  STVREN = ON
      CONFIG  LVP = OFF
      CONFIG  XINST = OFF
      CONFIG  DEBUG = OFF
      CONFIG  CP0 = OFF
      CONFIG  CP1 = OFF
      CONFIG  CP2 = OFF
      CONFIG  CP3 = OFF
      CONFIG  CPB = OFF
      CONFIG  CPD = OFF
      CONFIG  WRT0 = OFF
      CONFIG  WRT1 = OFF
      CONFIG  WRT2 = OFF
      CONFIG  WRT3 = OFF
      CONFIG  WRTC = OFF
      CONFIG  WRTB = OFF
      CONFIG  WRTD = OFF
      CONFIG  EBTR0 = OFF
      CONFIG  EBTR1 = OFF
      CONFIG  EBTR2 = OFF
      CONFIG  EBTR3 = OFF
      CONFIG  EBTRB = OFF
    #ENDCONFIG
    
        OSCCON = $60   '4 mhz
        OSCTUNE.6 = 1  'PLL Enabled
       
    DEFINE OSC 16    '16MHz (4X4 = 16)
    
        TRISB.4=0
    '    ANSELH=0          'Not applicable to 18F2620
        ADCON1 = 15        'Disable ADC
    
        LED    VAR  PORTB.4  ' Assign name "LED" to 
             
        USERCOMMAND "DISPLED"    ; BUFFER{,COLON }
        USERCOMMAND "STRLEN"     ; BUFFER
        USERCOMMAND "RJUSTBUFF"  ; BUFFER
        
        TM_BIT        VAR BYTE BANK0
        TM_DAT        VAR BYTE BANK0
        TM_NAK        VAR BYTE BANK0       ;set to $80 if tx error occured
        TM_DIG        VAR BYTE BANK0
        TM_BRIGHT     VAR BYTE BANK0       ;display pwm level 0 to 7
        TM_COLON      VAR BYTE BANK0       ;display colon  0/1
        TM_TMP        VAR BYTE[2] BANK0
        str_len       VAR BYTE BANK0
        
        CMD_AUTO_ADDR CON $40 
        START_ADDR    CON $c0 
        NUM_DIGITS    CON 4                ;number of 7seg leds
        COLON_FLAG    CON $80 
        DISPLAY_ON    CON $88
        ;tm1637      DIO AND CLK NEED TO BE ON SAME PORT
        @TM_OUT_PORT = LATB       ;TM_DIO  OUT
        @TM_IN_PORT  = PORTB      ;TM_DIO  IN
        @TM_CLK      = 1          ;PIN
        @TM_DIO      = 0          ;PIN
        @TM_TRIS     = TRISB 
        
        BLINK         VAR BYTE
        LEDBUFF       VAR BYTE[NUM_DIGITS +1] 
        COUNTER       VAR BYTE
        
    GOTO OVERASM
      
    ASM  
    DISPLED?B  macro BUFFER       
        movlw   low BUFFER
        movwf   FSR0L
        movlw   high BUFFER
        movwf   FSR0H 
        L?CALL _TM_DISP4 
        endm  
    DISPLED?BC  macro BUFFER ,COLON      
        movlw   low BUFFER
        movwf   FSR0L
        movlw   high BUFFER
        movwf   FSR0H 
        MOVE?CB COLON ,_TM_COLON 
        L?CALL _TM_DISP4 
        endm    
    DISPLED?BB  macro BUFFER ,COLON      
        movlw   low BUFFER
        movwf   FSR0L
        movlw   high BUFFER
        movwf   FSR0H 
        MOVE?BB COLON ,_TM_COLON 
        L?CALL _TM_DISP4 
        endm 
    STRLEN?B  macro BUF      
        MOVE?CB high BUF, FSR0H ;load highbyte 
        MOVE?CB low  BUF, FSR0L ;load low byte
        L?CALL   STRlen
        endm
    RJUSTBUFF?B  macro BUF      
        MOVE?CB high BUF, FSR0H ;load highbyte 
        MOVE?CB low  BUF, FSR0L ;load low byte
        MOVE?CB low  BUF, _TM_TMP  ;load low byte
        MOVE?CB HIGH  BUF, _TM_TMP+1  ;load low byte
        L?CALL  STRlen
        L?CALL  _strpad
        endm  
     
          
         
      
               
    STRlen                     ;get buffer usage size 
        CLRF     _str_len    
    str_tok_chr 
        ;MOVIW    FSR0 ++       ; Get character
        MOVF INDF0,W
        INFSNZ FSR0L
        incf   FSR0H
        btfsC    STATUS,Z     
        goto     exit_str_null ; EXIT ON Null char
        INCF     _str_len,F    ; not null so increment index
        goto     str_tok_chr
    exit_str_null
        return 
      
     
    _strpad           ;right justify by padding with spaces " "
        BANKSEL 0
        MOVLW   5
        ;ADDWF   _str_field_size,w  ;buffer size
        subwf   _str_len,f         ;tx string size 
        btfsc   STATUS, C          ;tx string size  gotcha
        goto    expd ;if positive difference then exit buffer overrun will occur  ;tx string size  gotcha
        comf    _str_len           ;the difference is number of spaces to SHIFT in
        btfsc   STATUS, Z
        goto    expd               ;if zero difference then exit
        moVLW    4  ;buffer size
        addwf   _TM_TMP,f         ;add  NUM_DIGITS to  addr of buffer
        ;btfsc   STATUS, C
        ;INCF    _STR_TMP+1,f
    nxpd
        movf    _TM_TMP,w         ;low (addr of buffer + NUM_DIGITS )
        MOVWF   FSR0L
        movwf   FSR1L
        DECF    FSR0L,F             ;offset pointer 0
        ;btfsc   STATUS, C 
        ;DECF    FSR0H,F 
        movf    _TM_TMP+1,w        ;high (addr of buffer + NUM_DIGITS )
        MOVWF   FSR0H
        movwf   FSR1H
        MOVLW   4 
        movwf   _TM_BIT
    nxby                            ;buffer shift right x 1
       ifdef TBLPTRL                ;fsr 
          movf  POSTDEC0, W         ;[pic18]
          MOVWF POSTDEC1
       else 
          MOVIW FSR0 --
          MOVWI FSR1 --
       endif
        DECFSZ  _TM_BIT,F
        GOTO    nxby
        movlw   0x20
        ifdef TBLPTRL               ;fsr 
          MOVWF POSTDEC1
        else 
          MOVWI FSR1 --
        endif
        DECFSZ  _str_len,F          ;need another one ?
        goto    nxpd
    expd                            ;nah!
        BANKSEL 0
        return
    SEG_val
        CHK?RP  _TM_TMP
        MOVWF   _TM_TMP
        CLRF _TM_TMP +1
        SUBLW   0x21
        btfsc   STATUS, C
        retlw   0   ;" "
        MOVF    _TM_TMP,W
        SUBLW   0x2f
        btfsc   STATUS, C
        retlw   64   ;"-"
        MOVF    _TM_TMP,W
        MOVLW   0X40
        SUBWF   _TM_TMP,W
        btfsC   STATUS, C
        GOTO    TM_ALPHA
        MOVF    _TM_TMP,W
        ANDLW   0X0F
        GOTO    TM_LU
    TM_ALPHA 
        ANDLW   0xdf    ;ucase
        SUBLW   6
        btfsS   STATUS, C
        retlw   0       ;ERROR
        MOVLW   0X37
        SUBWF   _TM_TMP,W
        ANDLW   0xdf    ;ucase
    TM_LU  
        addlw   LOW TABLE_START
        movwf   TBLPTRL
        rlcf    _TM_TMP +1 ,w
        addlw   HIGH TABLE_START 
        movwf   TBLPTRH
        movlw   UPPER TABLE_START 
        movwf   TBLPTRU
        tblrd   *+
        movf   TABLAT,w    
        return
          
      
    TABLE_START 
     db    0X3F,6,0X5B,0X4F,0X66,0X6D,0X7D,7,0X7F,0X67,0X77 ,0X7C ,0X39 ,0X5E ,0X79 ,0X71                        
        
        
    TM_START    
        CHK?RP TM_OUT_PORT
        BSF    TM_OUT_PORT,TM_CLK
        BSF    TM_OUT_PORT,TM_DIO
        NOP
        BCF    TM_OUT_PORT,TM_DIO
        NOP
        BCF    TM_OUT_PORT,TM_CLK
        NOP
        RETURN
        
    TM_STOP 
        CHK?RP TM_OUT_PORT
        BCF    TM_OUT_PORT,TM_CLK 
        BCF    TM_OUT_PORT,TM_DIO 
        NOP
        BSF    TM_OUT_PORT,TM_CLK 
        NOP
        BSF    TM_OUT_PORT,TM_DIO 
        NOP
        RETURN
        
    TM_WRITE 
        MOVLW  8 
        CHK?RP _TM_BIT
        MOVWF  _TM_BIT
    NXBT   
        CHK?RP TM_OUT_PORT
        BCF    TM_OUT_PORT,TM_CLK 
        CHK?RP _TM_DAT
        BTFSS  _TM_DAT,0
        GOTO   TM_0
        CHK?RP TM_OUT_PORT
        BSF    TM_OUT_PORT,TM_DIO 
        GOTO   TM_NB
    TM_0    
        CHK?RP TM_OUT_PORT
        BCF    TM_OUT_PORT,TM_DIO  
    TM_NB   
        CHK?RP _TM_DAT
        RRCF    _TM_DAT,F
        CHK?RP TM_OUT_PORT
        BSF    TM_OUT_PORT,TM_CLK 
        CHK?RP _TM_BIT
        DECFSZ _TM_BIT,F
        GOTO   NXBT
        CHK?RP TM_OUT_PORT
        BCF    TM_OUT_PORT,TM_CLK 
        CHK?RP TM_TRIS
        BSF    TM_TRIS,TM_DIO 
        CHK?RP TM_IN_PORT
        BTFSC  TM_IN_PORT,TM_DIO 
        BSF    _TM_NAK,7
        CHK?RP TM_OUT_PORT
        BSF    TM_OUT_PORT,TM_CLK 
        NOP
        NOP
        NOP
        NOP
        BCF    TM_OUT_PORT,TM_CLK 
        CHK?RP TM_TRIS 
        BCF    TM_TRIS ,TM_DIO 
        RST?RP
        RETURN
    _TM_INIT
        CHK?RP  _TM_COLON
        CLRF    _TM_COLON
        CLRF    _TM_BRIGHT
        CHK?RP TM_TRIS
        BCF    TM_TRIS ,TM_DIO
        BCF    TM_TRIS ,TM_CLK
        RST?RP
        RETURN
        
    _TM_DISP4 
        MOVLW   _CMD_AUTO_ADDR
        CHK?RP  _TM_DAT
        MOVWF   _TM_DAT
        CLRF    _TM_NAK
        CALL    TM_START
        CALL    TM_WRITE
        CALL    TM_STOP
        MOVLW   _NUM_DIGITS          
        CHK?RP  _TM_DIG
        MOVWF   _TM_DIG
        MOVLW   _START_ADDR
        CHK?RP  _TM_DAT
        MOVWF   _TM_DAT
        CALL    TM_START
        CALL    TM_WRITE 
    NXDIG
        ;MOVIW   FSR0 ++
        MOVF INDF0,W
        INFSNZ FSR0L
        incf   FSR0H
        CALL    SEG_val
        CHK?RP  _TM_DAT
        IORWF   _TM_COLON ,W
        movwf   _TM_DAT
        CALL    TM_WRITE
        CHK?RP  _TM_DIG
        DECFSZ  _TM_DIG,F
        GOTO    NXDIG
        CALL    TM_STOP
        CHK?RP  _TM_BRIGHT 
        MOVF    _TM_BRIGHT ,W
        ANDLW   7
        IORLW   _DISPLAY_ON
        CHK?RP  _TM_DAT
        MOVWF   _TM_DAT
        CALL    TM_START
        CALL    TM_WRITE
        CALL    TM_STOP
        RST?RP
        RETURN
        
        
    _TM_DISP1     ; WRITES TO A DISP POSN TM_TMP HOLDS DATA FOR TM_DIG IS POSN  0-3
        CHK?RP  _TM_DAT
        MOVLW   _CMD_AUTO_ADDR
        MOVWF   _TM_DAT
        CALL    TM_START
        CALL    TM_WRITE
        CALL    TM_STOP
        MOVLW   _START_ADDR
        addwf   _TM_DIG,W
        CHK?RP  _TM_DAT
        MOVWF   _TM_DAT
        CALL    TM_START
        CALL    TM_WRITE 
        CHK?RP  _TM_TMP
        MOVF    _TM_TMP,W
        movwf   _TM_DAT
        CALL    TM_WRITE
        CALL    TM_STOP
        BANKSEL 0
        RETURN 
        
        
        
        
        
        
        
    ENDASM  
    OVERASM: 
        FOR COUNTER=0 TO 3
         TOGGLE LED 
           PAUSE 500
        next
        CALL TM_INIT
      BLINK=0  
        
     ALOOP:   
         TOGGLE LED  
        TM_BRIGHT=TM_BRIGHT-1
        if TM_BRIGHT>7 then TM_BRIGHT=7
        ARRAYWRITE LEDBUFF ,["B- ",#TM_BRIGHT]
       
        DISPLED  LEDBUFF,0
        
        
        PAUSE 500
        FOR COUNTER=0 TO 255
            ARRAYWRITE LEDBUFF ,[hex COUNTER,0]
            RJUSTBUFF  LEDBUFF 
            DISPLED  LEDBUFF,0
            PAUSE 50
        NEXT
        FOR COUNTER=0 TO 255
            IF  !(COUNTER//20) THEN BLINK = TM_COLON ^ $80
            ARRAYWRITE LEDBUFF ,[sdec COUNTER,0]
            RJUSTBUFF  LEDBUFF 
            DISPLED  LEDBUFF,BLINK
            PAUSE 50
        NEXT
        goto ALOOP

  2. #2
    Join Date
    May 2013
    Location
    australia
    Posts
    2,690


    Did you find this post helpful? Yes | No

    Default Re: How to use TM1637 chip for LED Display?

    WOW! FINALLY, IT HAPPENED!!

    The TM1637 LED display module came alive!!!
    I used your revised code for 18F devices and after I made a few changes in the CONFIG section, the compilation for 18F2620 was successful.

    very good. you would have to wonder why the 12f1840 did not work

    I changed the Osc speed from 32 to 16MHz. Later, I tried the code at 8MHz and 4MHz. It works beautifully at those speeds too.
    the code works up t0 64mhz and can write the 4 digits in less than 50uS
    Attached Images Attached Images  
    Warning I'm not a teacher

Similar Threads

  1. TM1637 - display module include example
    By longpole001 in forum Code Examples
    Replies: 5
    Last Post: - 13th April 2020, 19:19
  2. 3642bh display module pinouts on tm1637 module
    By longpole001 in forum Schematics
    Replies: 0
    Last Post: - 31st July 2018, 19:09
  3. LED Matrix display
    By Art in forum General
    Replies: 13
    Last Post: - 5th October 2013, 05:06
  4. LED Bargraph chip (guitar LED bling-age) ..do with a PIC?
    By HankMcSpank in forum mel PIC BASIC Pro
    Replies: 10
    Last Post: - 13th July 2009, 00:15
  5. TV Display Chip
    By zadok in forum mel PIC BASIC Pro
    Replies: 19
    Last Post: - 17th April 2008, 23:17

Members who have read this thread : 0

You do not have permission to view the list of names.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts