E

74595 LCD BAĞLANTISI

Başlatan Elzemefe, 31 Ocak 2017, 22:51:59

Elzemefe

Merhaba arkadaşlar 8 pin ve PIC kullanırken
PIC teki  pin yetersizliği yüzünden  lcd kullanmak  bazen
sıkıntı  oluyor

Bu sebeple 74595 lcd kullanımını araştırdım
http://www.electronics-lab.com/project/3-wire-serial-lcd-using-a-shift-register/
yukardaki linkteki yazılımı bir PIC BASIC diline çevirebilrimiyiz
bazı  noktlarda  cıkmaza  girdiğim yerler  oldu

kolay gelsin
saygılar

aRci


sonmoikan

#2
Sanırım bende böyle bir çalışma vardı. bulunca ekliyeyim
ABDULLAH

sonmoikan

Aşağıdaki kod işine yarayabilir. LCD bu şekilde ascii kodlarıyala çalışmaktadır bilgin olsun.
Umarım faydalı olur.


'--------------------------sigorta Ayarları-------------------------------------
@ Device PIC12f675
@ Device PIC12f675,  WDT_OFF
@ Device PIC12f675,  PWRT_ON
@ Device PIC12f675,  INTRC_OSC_NOCLKOUT
'--------------------------ADC Ayarlanıyor--------------------------------------
DEFINE ADC_BITS     10     'A/D  çevirim sonucu 10 bit olarak ayarlandı
DEFINE ADC_CLOCK 3     'Clock  kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 50 'Örnekleme zamanı mikro saniye cinsinden.
'--------------------------Kayıtlar Ayarlanıyor---------------------------------
;DEFINE SHIFT_PAUSEUS 100
CMCON=7
OPTION_REG.7=1
WPU=0 ;PULLUP DİRENCLER İPTEAL
ADCON0=%10000011
ANSEL =%00110011 
TRISIO=%000011
GPIO  =0 
'-----------------------Değişkenler Belirleniyor--------------------------------

SYMBOL CLK=GPIO.4
SYMBOL DTA=GPIO.5
SYMBOL VER=GPIO.2

VERI var BYTE
HAM  var BYTE
RST  var BYTE
ENB  var byte
TEMP var byte

DIG1 var byte
DIG2 var byte
DIG3 var byte

;*****************LCD yi hazırla************************************************
pause 200

RST=0
;LCD Start 3-3-3-2-2-8-0-12-0-6
VERI=%00110011    ;3-3
GOSUB LCD_GONDER
VERI=%00110010    ;3-2
GOSUB LCD_GONDER
VERI=%00101000    ;2-8
GOSUB LCD_GONDER 
VERI=%00001100    ;0-12
GOSUB LCD_GONDER
VERI=%00000110    ;0-6
GOSUB LCD_GONDER

;*****************Volt yaz******************************************************
RST=0     
VERI=128           ;lcd yazı baslangic yeri
GOSUB LCD_GONDER

RST=1
VERI=86            ;V  ;ASCI karsiligi olan rakamı yaziyoruz.
GOSUB LCD_GONDER
VERI=79            ;O
GOSUB LCD_GONDER
VERI=76            ;L
GOSUB LCD_GONDER
VERI=84            ;T
GOSUB LCD_GONDER
VERI=0             ;space
GOSUB LCD_GONDER
VERI=0             ;space
GOSUB LCD_GONDER
VERI=61            ;=
GOSUB LCD_GONDER

;*****************Amper yaz*****************************************************
RST=0
VERI=192
GOSUB LCD_GONDER

RST=1
VERI=65           ;A
GOSUB LCD_GONDER
VERI=77           ;M
GOSUB LCD_GONDER   
VERI=80           ;P   
GOSUB LCD_GONDER       
VERI=69           ;E
GOSUB LCD_GONDER
VERI=82           ;R
GOSUB LCD_GONDER
VERI=0            ;space
GOSUB LCD_GONDER
VERI=61           ;=
GOSUB LCD_GONDER

;*****************ANA DONGU*****************************************************
BASLA:

GOSUB ADC_VOLT_OKU  : GOSUB VOLT_GONDER

GOSUB ADC_AMPER_OKU : GOSUB AMPER_GONDER

pause 100

GOTO BASLA

;*****************VOLT DEGERINI OKU VE GONDER***********************************
ADC_VOLT_OKU:

ADCIN 0,HAM   ;Max 30V
pause 20

DIG1=((ham/10) dig 1) + 48 ;ASCi oldugu icin +48 yaptık
DIG2=((ham/10) dig 0) + 48         
DIG3=(ham//10) + 48

RETURN

;*****************AMPER DEGERENI OKU *******************************************
ADC_AMPER_OKU:

ADcIN 1,HAM   ;Max 10A
pause 20

HAM=HAM*/267   ; (ham*267)/256 daha hassas oluyor.
dig1=((HAM/10) dig 1) + 48
dig2=((ham/10) dig 0) + 48
dig3=(ham//10) + 48

RETURN

;*****************VOLT DEGERINI GONDER******************************************
VOLT_GONDER:

RST=0              ;gönderilecek bilgi komut
VERI=136           ;baslama yeri
GOSUB LCD_GONDER   ;baslama yeri bilgisini gonder
RST=1              ;gönderilecek bilgi veri
VERI=DIG1          ;1.Rakam
GOSUB LCD_GONDER   ;veri bilgisini göster
VERI=DIG2          ;2.Rekam     
GOSUB LCD_GONDER
VERI=46            ;.
GOSUB LCD_GONDER
VERI=DIG3          ;3.Rakam
GOSUB LCD_GONDER
VERI=0             ;space
GOSUB LCD_GONDER
VERI=86            ;V
GOSUB LCD_GONDER

RETURN

;*****************AMPER DEGERINI GONDER*****************************************
AMPER_GONDER:

RST=0
VERI=200          ;baslama yeri
GOSUB LCD_GONDER  ;baslama yeri bilgisini gonder
RST=1
VERI=dig1         ;1.rakam
GOSUB LCD_GONDER
VERI=46           ;.
GOSUB LCD_GONDER
VERI=dig2         ;2.rakam
GOSUB LCD_GONDER
VERI=dig3         ;3.rakam
GOSUB LCD_GONDER
VERI=0            ;space
GOSUB LCD_GONDER
VERI=65           ;A
GOSUB LCD_GONDER

RETURN

;*****************74HC595 GONDER************************************************
LCD_GONDER:

;DTA=VERI.7 : pulsout clk,2
;DTA=VERI.6 : pulsout clk,2
;DTA=VERI.5 : pulsout clk,2
;DTA=VERI.4 : pulsout clk,2
;yada
TEMP=(VERI & %11110000)>>4 ;TEMP değişkeninin ilk 4 bitini gönder

enb=1
SHIFTOUT DTA,CLK,1,[TEMP\4,enb\1,rst\1]
pulsout VER,2

enb=0
SHIFTOUT DTA,CLK,1,[TEMP\4,enb\1,rst\1] ;lcd enable
pulsout VER,2

;DTA=VERI.3 : pulsout clk,2
;DTA=VERI.2 : pulsout clk,2
;DTA=VERI.1 : pulsout clk,2
;DTA=VERI.0 : pulsout clk,2
;yada
temp=(VERI & %00001111) ;TEMP değişkeninin ikinci 4 bitini gönder

enb=1
SHIFTOUT DTA,CLK,1,[TEMP\4,enb\1,rst\1]
pulsout VER,2

enb=0
SHIFTOUT DTA,CLK,1,[tEMP\4,enb\1,rst\1] ;lcd enable
pulsout VER,2

RETURN


END


ABDULLAH

Dtmf

iyi gunler ete hocam hc595 2x16 veya 4x20 lcd surmek icin elinizde basic ile yazilmis bir calisma varmi.birde hc595 ve lcd nin nasil kordineli calistigi hakkinda vaktiniz varsa yardimci olurmusunuz.

ete

Böyle bir çalışma yapmıştım çok eskiden ama bulup çıkarmam zor.

Burada bir örnek verilmiş zaten işine yaramıyormu?

595 bir shift registerdir. Seri yoldan verilen bilgiyi 8 bit olarak paralele çevirir.
Bu durumda 595 in her bir data-out pininden istediğin 8 bitlik bir sayıyı çıkartabilirsin. LCD nin 8 bitlik kontrol uçlarını direk 595 çıkışlarına bağlayarak ve bu bağlantılara uygun sayılar vererek LCD yi kontrol etmek mümkündür.
Bu bilgiden sonra bir LCD nin kontrolünü 595 ile yapabilmek için LCD data sheet'ini incelemek gerekir. Bu incelemeden sonra buraya bir LCD bilgisinin nasıl LCD ye yazıldığını anlatmak herhalde bir kaç sayfalık bilgi olur. Bu nedenle en güzeli kendin bunu yapman yada yapmaya çalışman. Yeri gelmiş iken hemen belirteyim. Data sheet olarak LCD de yer alan chip olan HD44780 isimli chip'in data sheet'ini inclemen gerekir. Çünki bütün işi yapan bu chip dir. Linki aşağıda
https://jap.hu/electronic/hd44780.pdf

Ete

Hattuşa

hocam protonda biz sürekli kullanıyoruz gayet güzel çalışıyor, protondan PBP ya dönüştürürüm diyen varsa kodu ve şemayı buraya ekliyorum.




Device = 12F675                     ' Tell the compiler what device is being compiled for
    Declare Xtal = 20                   ' Tell the compiler what speed the device will be operating at
    
   Include "Shift_Print.inc"           ' Load the LCD Shift Print library routine into the program

$define LCD_Pin GPIO.2'PORTB.2                 ' Set the pin to use for the communication with the 74595 shift register

    
    Dim MyByte As Byte = 0
    Dim MyFloat As Float = 3.14

'-----------------------------------------------------------------------
' Create a loop and display the value on both lines of the LCD
'

    DelayMS 100                     ' Wait for the LCD to stabilise

    Cls                             ' Clear the LCD's display
Main:
      Print At 1, 1, "FATIH"
        Print At 2, 1, "BAYSU"
        
        DelayMS 100
GoTo Main


buda kütüphanesi
$ifndef _Shift_Print_inc_
$define _Shift_Print_inc_

    #Disable Print                              ' Disable the compiler's Print library routine

$ifndef LCD_Pin                                 ' Has the LCD_Pin been defined in the main program?
    $define LCD_Pin PORTB.2                     ' No. So set a default pin
    $SendWarning "LCD_Pin is missing from the main program so using the default pin of PORTB.0"
$endif
'
' Create some compiler system and user variables for the replacement Print subroutine
'
    Dim BPF  As Byte System
    Dim PP3  As Byte System
    Dim PP3H As Byte System
    Dim PP4  As Byte System
    Dim PP4H As Byte System

    Dim _LCD_bChar          As PP3              ' Temporary byte for commands to send to the LCD
    Dim _LCD_bCharStore     As PP3H             ' Keeps the byte sent to the the Print routine safe so WREG can be restored before exiting
    Dim _LCD_tInitialised   As BPF.1            ' 1 if the LCD has been initialised
    Dim _LCD_tRS            As BPF.0            ' 0 if a command is to be sent to the LCD

    Dim _LCD_bTemp          As PP4              ' Temporary byte to hold the pin states for the LCD
    Dim _LCD_bShiftSteps    As PP4H             ' Holds the sequence of events required to send out a byte to the LCD
    Dim _LCD_bBitsOut       As Byte Access      ' Holds the value to shift to the LCD
    Dim _LCD_bStepsCounter  As Byte Access      ' Holds the counter for the events required to send out a byte to the LCD
    Dim _LCD_bBitShiftIndex As Byte Access      ' Holds the amount of bits to send in the loop

'--------------------------------------------------------------------
    GoTo _Shift_Print_Main_                             ' Jump over the replacement Print subroutine

'--------------------------------------------------------------------
' Replacement library routine for the compiler's Print command
' The LCD connects to the PIC via a 74595 shift register
' And this routine interfaces to the 74595 via a single pin
'
' Input     : WREG holds the byte to send to the LCD
' Output    : WREG still holds the byte sent to the LCD
' Notes     : None
'
__Print_:
$if _core = 14                                          ' Is it a 14-bit core device?
    $ifdef _ecore                                       ' Is it an enhanced 14-bit core device?
        _LCD_bCharStore = WREG                          ' Transfer the byte to print from WREG to _LCD_bCharStore
    $else
        Wreg_Byte _LCD_bCharStore                       ' Transfer the byte to print from WREG to _LCD_bCharStore
    $endif
$else                                                   ' Otherwise... WREG is an SFR that is accessable
    _LCD_bCharStore = WREG                              ' Transfer the byte to print from WREG to _LCD_bCharStore
$endif
    If _LCD_tInitialised = 0 Then GoTo _LCD_Init        ' Make sure the LCD was initialised
_Print_Continue1:
    If _LCD_bCharStore = $FE Then                       ' Is the value to send $FE?
        _LCD_tRS = 0                                    ' Yes. So the next byte is a command so clear the RS flag bit
        GoTo _Print_Exit                                ' Exit Print for now
    EndIf
    _LCD_bChar = _LCD_bCharStore                        ' Get the byte to send back

_LCD_SendCommand:
    GoTo _Print_ShiftOutByte
_Print_Continue2:
    If _LCD_tRS = 0 Then                                ' Is it a Command byte?
        If _LCD_bChar = 1 Then                          ' Yes. So is the command Cls?
            DelayUS 30                                  ' Yes. So delay for Clear Screen
        Else If _LCD_bChar = 2 Then                     ' Is the command Home?
            DelayUS 30                                  ' Yes. So a longer delay is required for Home
        EndIf
        DelayUS 1                                       ' A standard delay for LCD commands
    EndIf
    _LCD_tRS = _LCD_tInitialised                        ' Set RS to Data next time
_Print_Exit:
$if _core = 14                                          ' Is it a standard 14-bit core device?
    $ifdef _ecore                                       ' Is it an enhanced 14-bit core device?
        WREG = _LCD_bCharStore                          ' Recover the byte sent back into WREG
    $else
        Byte_Wreg _LCD_bCharStore                       ' Recover the byte sent back into WREG
    $endif
$else                                                   ' Otherwise... WREG is an SFR that is accessable
    WREG = _LCD_bCharStore                              ' Recover the byte sent back into WREG
$endif
    Return
'
' Initialise the LCD
'
_LCD_Init:
    Output LCD_Pin
    _LCD_bShiftSteps = 1
    _LCD_bChar = $33
    GoSub _LCD_SendCommand
    DelayUS 5000
    GoSub _LCD_SendCommand
    DelayUS 100
    GoSub _LCD_SendCommand
    DelayUS 100
    _LCD_bChar = $22                                    ' \ Start 4-bit mode
    GoSub _LCD_SendCommand                              ' /
    DelayUS 100

    _LCD_bShiftSteps = 3
    _LCD_bChar = $28                                    ' \
    GoSub _LCD_SendCommand                              ' / Function Set, 4 - bit, 2 - line, 5x7
    _LCD_bChar = $0C                                    ' \
    GoSub _LCD_SendCommand                              ' / Display On
    _LCD_bChar = $06                                    ' \
    GoSub _LCD_SendCommand                              ' / Entry Mode
    _LCD_tInitialised = 1                               ' Indicate that the LCD has been initialised
    GoTo _Print_Continue1
'
' Send a byte to the LCD via the 74HC595
'
_Print_ShiftOutByte:
    For _LCD_bStepsCounter = 0 To _LCD_bShiftSteps      ' Create a loop for teh steps required for the byte to be sent
        Select _LCD_bStepsCounter
            Case 0                                      ' Is _LCD_bStepsCounter 0?
                _LCD_bTemp = _LCD_bChar & %11110000     ' Yes. So isolate the upper nibble
                _LCD_bTemp.2 = _LCD_tRS                 ' Set the RS Bit
                _LCD_bTemp.3 = 1                        ' Set the Enable Bit

            Case 1, 3                                   ' Is _LCD_bStepsCounter 1 or 3?
                _LCD_bTemp.3 = 0                        ' Yes. So clear the Enable Bit

            Case 2                                      ' Is _LCD_bStepsCounter 3?
                _LCD_bTemp = _LCD_bChar & %00001111     ' Yes. So isolate the lower nibble
                Swap _LCD_bTemp, _LCD_bTemp             ' Swap nibbles
                _LCD_bTemp.2 = _LCD_tRS                 ' Set the RS Bit
                _LCD_bTemp.3 = 1                        ' Set the Enable Bit
        EndSelect
        _LCD_bBitsOut = _LCD_bTemp                      ' Transfer the byte into the shifter byte
        '
        ' Shift the bits held in _LCD_bBitsOut to the 74HC595
        '
        For _LCD_bBitShiftIndex = 6 To 0 Step -1        ' Create a loop for the 7-bits to shift
            Rol _LCD_bBitsOut                           ' Shift the bits left
            If STATUSbits_C = 1 Then                    ' Is the Carry Flag set?
                PinClear LCD_Pin
                DelayUS 1                               ' Delay 1 µs
                PinSet LCD_Pin
                DelayUS 15                              ' Delay 15 µs
            Else
                PinClear LCD_Pin
                DelayUS 15                              ' Delay 15 µs
                PinSet LCD_Pin
                DelayUS 30                              ' Delay 30 µs
            EndIf
        Next
        '
        ' Alter the Latch pin
        '
        PinClear LCD_Pin
        DelayUS 200                                     ' Delay 200 µs for Latch
        PinSet LCD_Pin
        DelayUS 300                                     ' Delay 300 µs
    Next
    GoTo _Print_Continue2

'-----------------------------------------------------------------------
_Shift_Print_Main_:

$endif  ' _Shift_Print__inc_
    

ete

Verilen kodları PBP ya çevirebilirim bu sorun değil ama burada özellikle kütüphane kısmında Proton özellikli bir sistem kullanılmış ve Proton daki LCD komutlarının normal LCD yerine seri bağlı LCD ye bilgi aktarması sağlanmış. Bu protonun bir özelliği olsa gerek. PBP da buna benzer bir özellik hiç duymadım ve görmedim. Dolayısıyla kodu çevirsemde PBP da çalışmayacaktır.

Ete

Hattuşa

Alıntı yapılan: ete - 25 Aralık 2021, 22:16:04Verilen kodları PBP ya çevirebilirim bu sorun değil ama burada özellikle kütüphane kısmında Proton özellikli bir sistem kullanılmış ve Proton daki LCD komutlarının normal LCD yerine seri bağlı LCD ye bilgi aktarması sağlanmış. Bu protonun bir özelliği olsa gerek. PBP da buna benzer bir özellik hiç duymadım ve görmedim. Dolayısıyla kodu çevirsemde PBP da çalışmayacaktır.

Ete


hocam dataportu 4 bit ya ascii karaterleri de 4 bite sığacak değerde değil mi? yani 0-9 ve a-z,A-Z ler, RW ve enable biti de karakter sıralamasını teker teker geçiş için kullanılıyor ya 595 e bu şekilde bir deneme yapılamaz mı? açıkcası bende bu proton kütüphanesini bilmiyorum. yani deneme yanılma ile bişeyler yapılamaz mı?

er-da

#9
Alıntı Yaphocam protonda biz sürekli kullanıyoruz gayet güzel çalışıyor

proton 3,5,5,6 derlemedi hata veriyor

Hattuşa

Alıntı yapılan: er-da - 25 Aralık 2021, 23:29:55proton 3,5,5,6 derlemedi hata veriyor

güncel değil usta proton 3.7.5.5 kullanıyorum, sizde ki hata mesajı nedir?

er-da

3.7.5.5  yükledim   derledi. teşekkürler

Powered by EzPortal