avatar_POWER

TM1637

Başlatan POWER, 11 Haziran 2017, 10:30:48

POWER

tm1637 ile 7 segment display sürülmesi uygulası için örnek isis dosyası bulamadım.elinde olan varsa paylaşabilirmi? ingilizce Datasheed dosyasıda bulamdım.dolayısıyla tm1637 ile led dısplay uygulamasını isisde çalıştıramadım.

rexo


POWER

#2
malesef tüm uğraşmama rağmen tm1637 ile led dısplay sürmeyi,çalıştırmayı başaramadım.elinde örnek dosyası olan varsa paylaşabilirmi?

Dtmf

ıyı aksamlar arkadaslar TM1637 ıle ılgılı bır program buldum calısıyor fakat bır turlu mantıgını anlamadım.bu 4 dıgıt dısplay ıle ugrasan arkadaslar varsa yardımcı olabılırlermı degerlı vakıtlerını ayırıp rıca etsem sabahtan bu yana bı turlu cözemedım.
Device = 16F877A
Declare XTAL 4 
ALL_DIGITAL = TRUE
PORTB = %00000011
TRISB = %11111100
PORTB = %00000011
INTCON=0
OPTION_REG=%10001111
Dim segment As Byte
Dim dongu_cikis As Byte
Dim index As Byte
Dim surulen_bitler As Byte
Dim digit_deger As Byte

Dim segment_cikisa As Byte


Dim ekran_degeri As Word

Dim nokta_yak As Bit

''' sürülmek istenen GRID çıkışları için, datasheet'den bakınız 2- Address command setting 
Dim GRID_0 As $C0   ; %11000000 GRID1 çıkış adresi  
Dim GRID_1 As $C1   ; %11000001 GRID2 çıkış adresi 
Dim GRID_2 As $C2   ; %11000010 GRID3 çıkış adresi   
Dim GRID_3 As $C3   ; %11000011 GRID4 çıkış adresi
Dim GRID_4 As $C4   ; %11000100 GRID4 çıkış adresi
Dim GRID_5 As $C5   ; %11000101 GRID4 çıkış adresi  


''' Display ışığı degerleri, bakınız datasheet 3- Display control 
Dim disp_isik_max As $8F     ; %10001111     ( Işık Full )
Dim disp_isik_off As $87     ; %10000111     ( Işık Off  )
Dim disp_isik_1_16 As $88    ; %10001000     ( Işık  1/16 )
Dim disp_isik_2_16 As $89    ; %10001001     ( Işık  2/16 )
Dim disp_isik_4_16 As $8A    ; %10001010     ( Işık  4/16 )
Dim disp_isik_10_16 As $8B   ; %10001011     ( Işık 10/16 )
Dim disp_isik_11_16 As $8C   ; %10001100     ( Işık 11/16 )
Dim disp_isik_12_16 As $8D   ; %10001101     ( Işık 12/16 )
Dim disp_isik_13_16 As $8E   ; %10001110     ( Işık 13/16 )
Dim disp_isik_14_16 As $8F   ; %10001111     ( Işık 14/16 )
''''''''''''

''''  Segmentlere ait bit ler. 
'Dim seg_x As %ngfedcba  
 Dim seg_a As %00000001
 Dim seg_b As %00000010
 Dim seg_c As %00000100
 Dim seg_d As %00001000
 Dim seg_e As %00010000
 Dim seg_f As %00100000
 Dim seg_g As %01000000
 Dim seg_n As %10000000

'''' değişik karakterler için segment atamaları
'  Dim char_ As %ngfedcba 
Dim char_b_A As %01110111   ''' Karakter büyük A 
Dim char_k_a As %01011111   ''' Karakter kücük a 
Dim char_k_b As %01111100   ''' Karakter kücük b 
Dim char_b_C As %00111001   ''' Karakter büyük C
'  Dim char_ As %ngfedcba  
Dim char_k_c As %01011000   ''' Karakter kücük c 
Dim char_k_d As %01011110   ''' Karakter kücük d 
Dim char_b_E As %01111001   ''' Karakter büyük E 
Dim char_k_e As %01111011   ''' Karakter kücük e  
Dim char_b_F As %01110001   ''' Karakter büyük F
'  Dim char_ As %ngfedcba 
Dim char_b_H As %01110110   ''' Karakter büyük H
Dim char_b_I As %00000110   ''' Karakter büyük I
Dim char_b_J As %00001110   ''' Karakter büyük J
Dim char_b_L As %00111000   ''' Karakter büyük L
Dim char_k_n As %01010100   ''' Karakter kücük n
Dim char_u_o As %01100011   ''' Karakter ustte o 
Dim char_a_o As %01011100   ''' Karakter altta o 
Dim char_b_P As %01110011   ''' Karakter büyük P  
'  Dim char_ As %ngfedcba 
Dim char_k_r As %01010000   ''' Karakter kücük r
Dim char_k_t As %01111000   ''' Karakter kücük t
Dim char_b_U As %00111110   ''' Karakter büyük U 
Dim char_k_u As %00011100   ''' Karakter kücük u
Dim char_b_Y As %01101110   ''' Karakter büyük Y


'''''''''
Dim CLK As PORTC.6
Dim DIO As PORTC.7

DelayMS 10
clrwdt


    GoSub aydinlik_ayari    
    ''' isis de "ışık" olarak farkedilmeyebilir. 
    ''' display Pinlerini skop ile gözlemek fikir verebilir.

    GoSub oto_ilerlemeyi_kur
''''''''''    
basla:
    clrwdt
    
    ''' segment test yapalım
    GoSub segment_test


    ''' rakam ekranlayalım, ekranlayacağımız değer
    For ekran_degeri = 0 To 5234 
'        ekran_degeri = 5234
        GoSub gonderim_x_hane
        
        ''' 10 a kadar yavaş saysın sonra hızlansın
        If ekran_degeri < 10 Then   
            DelayMS 300
        Else
            DelayMS 1
        EndIf
        clrwdt
    Next
    

    
GoTo basla
''''''''''	




'''''''''''
segment_gonder:
    surulen_bitler = segment
    
bitleri_itele:             ''' surulen_bitler değerini gönderen dongu
	For dongu_cikis = 0 To 7	 
		Low CLK
		DIO = surulen_bitler.0      ''' data pinine surulen_bitler 'in 0. bitini yükle
		nop              ''' mcu hızı düşük ve bekleme gerekmiyorsa bunu sil
        High CLK
        surulen_bitler = surulen_bitler >> 1   ''' 1 bit saga kayar		
	Next 
	
	Low CLK		  ;  
    While DIO =1
    clrwdt
    Wend
	High CLK
	Low CLK
Return

''''''''''''
''' data gönderimi başlıyor
start_ver:
    clrwdt
	High CLK
	High DIO
	Low DIO
Return

'' data gönderimi bitti.	
stop_ver:
    clrwdt
	Low CLK
	Low DIO
	High CLK
	High DIO
Return


''''''''
segment_degeri_al:
    clrwdt
    segment = LookUp digit_deger, [$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F,$00] ; 0-9 ve Blank (10 degeri)
    
    ''' digitin noktası yakılacak ise 
    If nokta_yak = 1 Then
        segment.7 = 1           ''' ilgili biti setle
        nokta_yak = 0
    EndIf
        
Return

''''''''''''''''
gonderim_x_hane:    
    ''' Gönderim başlıyor bildirgesi START pulse i
	GoSub start_ver
	
	''' Gösterime Hangi haneden başlayacağız  
	GoSub ilk_hane_ne

    ''' Kaç hane sürecek isek digitleri almak gerek.
    ''' 4 hane
    For index = 3 To 0 Step -1
        ''' ekran_degeri değişkeninin digitlerini sırayla al 5, 2, 3, 4 gibi
        digit_deger = Dig ekran_degeri, index
        
        '''' gereksiz segmentler sönsün denirse
        GoSub gereksizse_sondur
        
        
        ''' alınan digite göre segment bitleri nedir, oradan dönen deger degişkeni "segment" dir
        GoSub segment_degeri_al      ''' segment bitleri oluşturuldu                 
        GoSub segment_gonder         ''' mcu pininden TM1637 'ye sür.
    Next
    
    ''' Gönderim bitti STOP pulse i
    GoSub stop_ver
Return    
''''''''''

gereksizse_sondur:
    If ekran_degeri < 10 Then                   ''' 0 - 9 arası degerde, 3 hane boşa yanar
        If index > 0 Then digit_deger = 10      ''' 10 değeri blank yapar
    EndIf
    
    If ekran_degeri < 100 Then                   ''' 0 - 9 arası degerde, 3 hane boşa yanar
        If index > 1 Then digit_deger = 10      ''' 10 değeri blank yapar
    EndIf
    
    If ekran_degeri < 1000 Then                   ''' 0 - 9 arası degerde, 3 hane boşa yanar
        If index > 2 Then digit_deger = 10      ''' 10 değeri blank yapar
    EndIf
Return 
'''''''''''''


'''''''''''''''
''    ''''  Segmentlere ait bit ler. 
''    'Dim seg_x As %ngfedcba  
''     Dim seg_a As %00000001
''     Dim seg_b As %00000010
''     Dim seg_c As %00000100
''     Dim seg_d As %00001000
''     Dim seg_e As %00010000
''     Dim seg_f As %00100000
''     Dim seg_g As %01000000
''     Dim seg_n As %10000000
segment_test:

    segment = %00000001 ''' seg_a
    
segment_test_2:
   
    ''' Gönderim başlıyor bildirgesi START pulse i
	GoSub start_ver
	
	''' Gösterime Hangi haneden başlayacağız  
	GoSub ilk_hane_ne

    ''' Kaç hane sürecek isek digitleri almak gerek.
    ''' 4 hane
    For index = 3 To 0 Step -1
        GoSub segment_gonder         ''' mcu pininden TM1637 'ye sür.
    Next

    ''' Gönderim bitti STOP pulse i
    GoSub stop_ver
    
    DelayMS 300
    clrwdt
    
    segment = segment << 1
    If segment > 0 Then segment_test_2

Return


;;;;;;;;;;;;;;;
''''''''''' KURULUM KOMUTLARI
ilk_hane_ne:
    '''' Hangi haneden başlıyacağız gösterime, onu bildirelim	
	''' Haneleri Peşisıra süreceğimiz için ilk haneyi hangisinden versin
	''' oto ilerlemeli gösterim için ilk hane hangisi olsun
    surulen_bitler = GRID_0        ''' soldan 1.       
'    surulen_bitler = GRID_3       ''' soldan 3. gibi.
    ''' GRID_x 'lerin sayı değerleri en üstte, sabitlerin atamalarında 
    GoSub bitleri_itele            ''' hane bildirimi komutunu TM1637 ye sür
Return


''' bakınız 1- Data command setting bölümünde 
''' Address adding mode setting sekmesi 2 deger içerir
    ''' Automatic address adding. Değeri %01000000 = $40
    ''' Fix address               Değeri %01000100 = $44
oto_ilerlemeyi_kur:
	GoSub start_ver    ''' data gönderimi başlıyor
	''' Automatic address adding. Otomatik adres ekleme için değer %01000000 = $40
	surulen_bitler = %01000000        ''%01000000 adresi oto arttırma,  bakınız 1- Data command setting 
	GoSub bitleri_itele    '' datayı gönder, Command datası olarak 1 byte gönderir
	GoSub stop_ver         '' data gönderimi bitti.
Return

'''
aydinlik_ayari:
    ''' Display ışık seviyesi ayarı
	GoSub start_ver
	surulen_bitler = disp_isik_max    ''' max ışık
'    surulen_bitler = disp_isik_off   ''' ışık kapalı
'    surulen_bitler = disp_isik_12_16  ''' 12/16
	GoSub bitleri_itele
	GoSub stop_ver
Return	

Dtmf

ekrana bıseyler yazdırıp sacma karakterler cıktı ama olsun :) dısplay ısık yarlarını yapabılıyormuyum dıye bıseyler yaptım oldu. fakat bu sacma karakterler yerıne 1.2.3.4...sayılar yazdırıp  4 dıgıtı ayrı ayrı kontrol etmek ıstıyorum.amacım bu

ete

İlişikte bir program ve simulasyon dosyası veriyorum. Programın ilk halini ben yazmadım ama yeniden düzenledim. Açıklamaları programda mevcut zaten biraz dikkatlice incelenirse anlaşılıyor.

Ete

Dtmf

Tesekkur ederim hocam.inceleyim bakalim.tm1637 data shette baya karisik.

Dtmf

ete hocam programı baya bı sadelestırdım :)) ama hala dusunuyorum 4 dıgıt calıstırmak ıcın ne gergı vardı bukadar programa ve sayfalarca datashte :).bence cok sacma bır mantıgı var ı2c ıle bu ısı cozebılırlerdı yapan fırma.bır kac sensorun oldugu bır projede kullanmaya kalksak program kalabalıgı benım dusuncem
Device = 16F877A
Declare XTAL 4 
ALL_DIGITAL = TRUE
PORTB = %00000011
TRISB = %11111100
PORTB = %00000011
INTCON=0
OPTION_REG=%10001111
Dim segment As Byte
Dim dongu_cikis As Byte
Dim index As Byte
Dim surulen_bitler As Byte
Dim digit_deger As Byte

Dim segment_cikisa As Byte


Dim ekran_degeri As Word

Dim nokta_yak As Bit

''' sürülmek istenen GRID çıkışları için, datasheet'den bakınız 2- Address command setting 
Dim GRID_0 As $C0   ; %11000000 GRID1 çıkış adresi  
Dim GRID_1 As $C1   ; %11000001 GRID2 çıkış adresi 
Dim GRID_2 As $C2   ; %11000010 GRID3 çıkış adresi   
Dim GRID_3 As $C3   ; %11000011 GRID4 çıkış adresi
Dim GRID_4 As $C4   ; %11000100 GRID4 çıkış adresi
Dim GRID_5 As $C5   ; %11000101 GRID4 çıkış adresi  


''' Display ışığı degerleri, bakınız datasheet 3- Display control 
Dim disp_isik_max As $8F     ; %10001111     ( Işık Full )
Dim disp_isik_off As $87     ; %10000111     ( Işık Off  )
Dim disp_isik_1_16 As $88    ; %10001000     ( Işık  1/16 )
Dim disp_isik_2_16 As $89    ; %10001001     ( Işık  2/16 )
Dim disp_isik_4_16 As $8A    ; %10001010     ( Işık  4/16 )
Dim disp_isik_10_16 As $8B   ; %10001011     ( Işık 10/16 )
Dim disp_isik_11_16 As $8C   ; %10001100     ( Işık 11/16 )
Dim disp_isik_12_16 As $8D   ; %10001101     ( Işık 12/16 )
Dim disp_isik_13_16 As $8E   ; %10001110     ( Işık 13/16 )
Dim disp_isik_14_16 As $8F   ; %10001111     ( Işık 14/16 )

 Dim seg_a As %00000001
 Dim seg_b As %00000010
 Dim seg_c As %00000100
 Dim seg_d As %00001000
 Dim seg_e As %00010000
 Dim seg_f As %00100000
 Dim seg_g As %01000000
 Dim seg_n As %10000000


Dim char_b_A As %01110111   ''' Karakter büyük A 
Dim char_k_a As %01011111   ''' Karakter kücük a 
Dim char_k_b As %01111100   ''' Karakter kücük b 
Dim char_b_C As %00111001   ''' Karakter büyük C
  
Dim char_k_c As %01011000   ''' Karakter kücük c 
Dim char_k_d As %01011110   ''' Karakter kücük d 
Dim char_b_E As %01111001   ''' Karakter büyük E 
Dim char_k_e As %01111011   ''' Karakter kücük e  
Dim char_b_F As %01110001   ''' Karakter büyük F

Dim char_b_H As %01110110   ''' Karakter büyük H
Dim char_b_I As %00000110   ''' Karakter büyük I
Dim char_b_J As %00001110   ''' Karakter büyük J
Dim char_b_L As %00111000   ''' Karakter büyük L
Dim char_k_n As %01010100   ''' Karakter kücük n
Dim char_u_o As %01100011   ''' Karakter ustte o 
Dim char_a_o As %01011100   ''' Karakter altta o 
Dim char_b_P As %01110011   ''' Karakter büyük P  
Dim char_k_r As %01010000   ''' Karakter kücük r
Dim char_k_t As %01111000   ''' Karakter kücük t
Dim char_b_U As %00111110   ''' Karakter büyük U 
Dim char_k_u As %00011100   ''' Karakter kücük u
Dim char_b_Y As %01101110   ''' Karakter büyük Y

Dim CLK As PORTC.6
Dim DIO As PORTC.7
DelayMS 10
clrwdt
GoSub aydinlik_ayari  
nokta_yak=1
;====================================================BASLA============================================   
BASLA:
    clrwdt
For ekran_degeri =6059 To 0 Step -1
        GoSub gonderim_x_hane
        DelayMS 500
        clrwdt
Next
GoTo BASLA
;===========================================END========================
;====================X HANE===================
gonderim_x_hane:    
    	GoSub start_ver
    	GoSub ilk_hane_ne
For index = 3 To 0 Step -1  ;   Kaç hane sürecek isek digitleri almak gerek.4 hane
        digit_deger = Dig ekran_degeri, index
        GoSub gereksizse_sondur
        GoSub segment_degeri_al      ''' segment bitleri oluşturuldu                 
        GoSub segment_gonder         ''' mcu pininden TM1637 'ye sür.
Next
        GoSub stop_ver
Return    
;======================AYDINLIK AYARI===============
aydinlik_ayari:
	GoSub start_ver
	surulen_bitler = disp_isik_max    ''' max ışık
	GoSub bitleri_itele
	GoSub stop_ver
Return	
;=======================================================================================================
;=================START======
start_ver:
    clrwdt
	High CLK
	High DIO
	Low DIO
Return
;============= ILK HANE=====
ilk_hane_ne:
    surulen_bitler = GRID_0        ''' soldan 1.       
    GoSub bitleri_itele            ''' hane bildirimi komutunu TM1637 ye sür
Return
;===============GEREKSIZ SONDUR==========
gereksizse_sondur:
    If ekran_degeri < 10 Then                   ''' 0 - 9 arası degerde, 3 hane boşa yanar
        If index > 0 Then digit_deger = 10      ''' 10 değeri blank yapar
    EndIf
    
    If ekran_degeri < 100 Then                   ''' 0 - 9 arası degerde, 3 hane boşa yanar
        If index > 1 Then digit_deger = 10      ''' 10 değeri blank yapar
    EndIf
    
    If ekran_degeri < 1000 Then                   ''' 0 - 9 arası degerde, 3 hane boşa yanar
        If index > 2 Then digit_deger = 10      ''' 10 değeri blank yapar
    EndIf
Return 
;====================SEGMENT DEGERI AL===============
segment_degeri_al:
    clrwdt
    segment = LookUpL digit_deger, [$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F,$00] ; 0-9 ve Blank (10 degeri) ;$7D
    If nokta_yak = 1 Then
        segment.7 = 1           ''' ilgili biti setle
       ; nokta_yak = 0
    EndIf
        
Return
;===============sEGMENT GONDER============
segment_gonder:
surulen_bitler = segment
;============================BIT ITELEME================    
bitleri_itele:        
SHOut DIO,CLK,0,[surulen_bitler]	
	Low CLK		  ;  
    While DIO =1
    clrwdt
    Wend
	High CLK
	Low CLK
Return
;====================STOP=====
stop_ver:
    clrwdt
	Low CLK
	Low DIO
	High CLK
	High DIO
Return

Maxim

Alıntı yapılan: ete - 10 Nisan 2020, 08:55:21İlişikte bir program ve simulasyon dosyası veriyorum. Programın ilk halini ben yazmadım ama yeniden düzenledim. Açıklamaları programda mevcut zaten biraz dikkatlice incelenirse anlaşılıyor.

Ete


ete hocam üzerinden çok zaman geçmiş farkındayım
sadece 2. digitteki noktayı nasıl yakabilirim? beceremedim bir türlü şunu

ete

Aslında programda bu özellik var zaten.
    If nokta_yak = 1 Then
        segment.7 = 1           ''' ilgili biti setle
        nokta_yak = 0
    EndIf
tek yapman gerekn şey hangi digit de noktayı aktif edecek isen o digitte Nokta_Yak=1 demen yeterli.

Hatta bunu aynı yerde de yapabilirsin şöyle,

SEGMENT_DEGERI_AL:
    CLEARWDT
     LookUp digit_deger, [$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F,$00],segment ; 0-9 ve Blank (10 degeri)
    If index=1 then nokta_yak=1' 1 değeri 2 nolu digit oluyor sıfırdan başlıyor çünki
    ''' digitin noktası yakılacak ise 
    If nokta_yak = 1 Then
        segment.7 = 1           ''' ilgili biti setle
        nokta_yak = 0
    EndIf
        
Return
ete

Maxim

ete abi eline sağlık, teşekkürler.

Powered by EzPortal