Elektronik Devreler Projeler Elektronik ve biraz daha fazlası İletişim - Araçlar - Dikkat - Topluluk
Elektronik / Mikrodenetleyici Projeleri/

MSP430 ASM 74HC595 ile 2X16 LCD Ekran Kullanımı

Sponsorlu Bağlantılar

Merhaba arakdaşlar bu yazımda MSP430 LCD ekran kullanımından bahsedeceğim. Bu ekranlar 8/4 bit modunda iki farklı yöntem ile sürülebilir. Biz 8 bit modunda süreceğiz bunu yapabilmek için daha önce yayınlanış olan 74hc595 sürücü kodumuz üzerine eklemler yaparak gerçekleştireceğiz.

Kısaca 8 bitlik Veriyi 74hc595 üzerinden gönderip konfigrasyon bitlerinide mcu tarafından kontrol edip kodun işlenmesini sağlıyacağız. Öncelikle ilk satırda Müjdat 2. satırda ise TEKE yazısı görünecek ve belli süre sonra ekrandaki yazılar silinecek ve 2. satırda belirli aralıklarda saymaya başlayacak sayma işlem 99.999 sayısından sonra başa döner ve buton yardımıyla sayma işlemini durudurup yeniden başlatablirsiniz.

lcd-74hc595

LCD Sürülmesinde 74hc595 entegresi hakkında bilgi ve kullanımı için “MSP430 ASM 74HC595 Kullanımı” başlığı altında yayınlanmış olan yazımı inceleyebilirsiniz.

Kaynak kod;




#include "msp430g2231.h"                     ; #kulanılan mcu yu tanımlıyoruz

;*******74595 PİNLERİ***********

#define    R_PIN EQ 00010000B;BIT4;10h;

#define    E_PIN EQ 00100000B;BIT5;20h;00100000b;

#define    D_PIN EQ 01000000B;BIT6;40h;01000000b;

#define    C_PIN EQ 10000000B;BIT7;80h;10000000b;



;************LCD PİNLERİ********

;#define    RW_PIN   BIT2;lcd RW okuma yazma modu pinin

#define    EN_PIN EQ 0000100B;BIT2;lcd enable data portlarındaki bilgiyi lcdyeyazdırma pini

#define    DI_PIN EQ 0000001B;BIT0;Data komut pini göndeilen pinin datamı yoksa komutmuoldugunu belirler

;*****************************

#define    KOMUT_MODU  bic.b     BIT0,P1OUT

#define    VERI_MODU bis.b    BIT0,P1OUT

#define    YAZDIR_1 bis.b     BIT2,P1OUT

#define    YAZDIR_0 bic.b     BIT2,P1OUT

;#define    OKUMA_MODU bis.b     BIT2,P1OUT

;#define    YAZMA_MODU bic.b     BIT2,P1OUT

#define     PN

DATA1 EQU 0x0200;R15;shift regestiriye gönderilen veri bu değişkende

VERI  EQU 0x0202;#define   VERI  0x0210;R9 ;veri değişkeni ise şift regestiriye gönderilmek

CNT1  EQU 0x0204; #define    CNT1 0x0202;şift regestiriye gönderilen veri 16 bit

LCD_INFO  EQU 0X0206

LCD_1      EQU 0X0208

LCD_2      EQU 0X0210

LCD_3      EQU 0X0212

LCD_4      EQU 0X0214

LCD_5      EQU 0X0216

;LCD_CNT   EQU 0X0210

;LCD_CHR   EQU 0X0212

;LCD_STR  EQU 0X0206



;***********MAKROLAR********************



SHIFTOUT    MACRO    SENT_DATA

;        MOV.W  #SENT_DATA,&R7

    MOV    #SENT_DATA,DATA1

    CALL    #SHIFTREG    

        ENDM

LCD_INIT MACRO PIN_CNT,SATIR_CNT,FONT

       CLR.W  LCD_INFO

       BIS.B  #BIT5,LCD_INFO

       IF PIN_CNT=4;LCD 4BİT MODUNDAMI YOKSA 8 BİT MODUNDAMI ÇALIŞTIRILACAK

       BIC.B  #BIT4,LCD_INFO;4 BİT MODUNDA

       ELSE

       BIS.B  #BIT4,LCD_INFO;8BİT MODUNDA

       ENDIF

       IF SATIR_CNT=1;KULLANILAN LCD 1 Mİ 2 Mİ SATIR İÇERİYO

       BIC.B  #BIT3,LCD_INFO;1 SATIRLIK LCD

       ELIF SATIR_CNT=2;ELIF SATIR_CNT=1

       BIS.B  #BIT3,LCD_INFO;2 SATIRLI LCD

       ENDIF

       IF FONT=1;FONT 5X7 Mİ 5X10 MU OLACAK

       BIC.B  #BIT2,LCD_INFO;5X7 FONT

       ELSE;ELIF SATIR_CNT=1

       BIS.B  #BIT2,LCD_INFO;5X10 FONT

       ENDIF

       MOV.W  LCD_INFO,DATA1

       CALL #KOMUT_YAZ

       ENDM

LCD_KOR MACRO RW,CLM

    IF  RW=1    

    MOV   #007fH+CLM,DATA1

    ELIF  RW=2  

    MOV   #00BFH+CLM,DATA1;ELSE

    ELIF  RW=3

    MOV   #008FH+CLM,DATA1;ELSE

    ELIF  RW=4  

    MOV   #00CFH+CLM,DATA1;ELSE    

    ENDIF

    CALL  #KOMUT_YAZ

    ENDM

LCD_KARAKTER  MACRO TXT

       REPTC C_TXT,TXT;"MUJDAT"

       MOV.W   #'C_TXT',DATA1;LCD_CHR

       CALL  #VERI_YAZ;LCD_KARAKTER #LCD_CHR

       ENDR

    ENDM

LCD_TEMIZLE MACRO RW

    IF  RW=1    

    MOV   #007fH+1,DATA1

    ELIF  RW=2  

    MOV   #00BFH+1,DATA1;ELSE

    ELIF  RW=3

    MOV   #008FH+1,DATA1;ELSE

    ELIF  RW=4  

    MOV   #00CFH+1,DATA1;ELSE    

    ENDIF

    CALL  #KOMUT_YAZ

    CALL  #TEMIZLE

    ENDM

LCD_OUT MACRO LCD_DATA,ROW,COLM

    IF  ROW=1    

    MOV   #007fH+COLM,DATA1

    ELIF  ROW=2  

    MOV   #00BFH+COLM,DATA1;ELSE

    ELIF  ROW=3

    MOV   #008FH+COLM,DATA1;ELSE

    ELIF  ROW=4  

    MOV   #00CFH+COLM,DATA1;ELSE   

    ENDIF

    CALL  #KOMUT_YAZ

    MOV.B  LCD_DATA,DATA1

    CALL  #VERI_YAZ

    ENDM

LCD_ON  MACRO KURSOR,EFEK

       CLR  LCD_INFO

       BIS.B  #BIT3,LCD_INFO

       BIS.B  #BIT2,LCD_INFO

       IF KURSOR=0;

       BIC.B  #BIT1,LCD_INFO;

       ELIF KURSOR=1;ELSE

       BIS.B  #BIT1,LCD_INFO;

       ENDIF

       IF EFEK=0;

       BIC.B  #BIT0,LCD_INFO;

       ELIF EFEK=1;ELSE;ELIF SATIR_CNT=1

       BIS.B  #BIT0,LCD_INFO;

       ENDIF

       MOV  LCD_INFO,DATA1

       CALL #KOMUT_YAZ

       ENDM

LCD_KOMUT MACRO KMT

    MOV   KMT,DATA1

    CALL  #KOMUT_YAZ   

    ENDM

LCD_SIL MACRO

    MOV #01H,DATA1

    CALL  #KOMUT_YAZ

    ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        NAME    Mainloop                   ; module name

        PUBLIC  Mainloop                    ; make the main label vissible

        RSEG    CSTACK                  ; pre-declaration of segment

        RSEG    CODE  

init:   MOV    #SFE(CSTACK), SP        ; set up stack

           MOV.W    #WDT_ADLY_1000,&WDTCTL;WDT_ADLY_1000 WDT Yİ KULLANARAK 1000MS GECİKME YARATIR

           BIS.B    #10001B,IE1           ;IE1 REGESTİRİSİ GENEL KESME KAYNAKLARINI KONTROL EDN REGESTİRİ

;            BURDAN NMIIE VE WDTIE BAYRAKLARINI KURUYORUZ WDT KESMESİ OLUŞMASI İÇİN

            mov.b   #11110111b,P1DIR        ; P1 portunun 0 ve 6 bitleri çıkış gerisi giriş olarak ayarlandı

            mov.b   #00001000b,P1IE         ;P1 PORTUNUN HANGİ PİNİNDEN KESME OLUŞACAĞINI BLİERLER

            mov.b   #00001000b,P1IES         ; KESMENİN DÜŞEN KENARMI YOKSA YÜKSELEN KENARMI OLDUGUNU BELİRLER.

          LCD_SIL               ;LCD Yİ TAMAMEN SİLER

          LCD_INIT 8,2,1        ;1. PARAMETRE 4/8 BİTMİ ÇALIŞTIRILICAĞINI SEÇMEYE YARAR.

          ;2. PARAMETRE KULLANILAN LCD NİN KAÇ SATIR OLDUĞUNU BELİRTİR.

          ;3. PARAMETRE

          LCD_ON 0,0            ;LCD YE AÇMA KOMUTU GÖNDERİR BUNU YAPRKEN2 ADET PARAMETRE ALIR

          ;1. PARAMETRE İMLECİ GÖRÜNÜR/GİZLİ YAPMAYA YARAR(0/1)

          ;2. OARAMETRE İMLECİN KIRPMA EFEKTİ AÇMA/KAPAMAYA YARAR (0/1)

          LCD_SIL

          MOV   #'0',LCD_1

          MOV   #'0',LCD_2

          MOV   #'0',LCD_3

          MOV   #'0',LCD_4

          MOV   #'0',LCD_5

          EINT                 ;Genel interput kaynaklarını etkinleşirir.

Mainloop    ;Ana program bloğu

; LCD YAZDIRMAK İÇİN 2 ADET MAKRO YAZDIM ,LCD_OUT BELİRTİLEN KORDİNATLARA 1 KAREKTER YAZAR.

; 1. MAKROMUZ LCD_OUT BU MAKRODA 3 ADET PARAMAETRE VAR 1. PARAMETRE YAZILACAK KAREKTERİ BELİRTİR.

; 2.PAREMETREDE SATIR 3.PARAMETREDE SUTUN BELİRTİLİREK İSTENİLEN SATIR VE SUTUNDA İSTEDİĞİMİZ

; KAREKTERİ GÖSTEREBLİRSİNİZ.

       LCD_OUT   #'M',1,5

       LCD_OUT   #'U',1,6

       LCD_OUT   #'J',1,7

       LCD_OUT   #'D',1,8

       LCD_OUT   #'A',1,9

       LCD_OUT   #'T',1,10              

       LCD_OUT   #'T',2,6

       LCD_OUT   #'E',2,7

       LCD_OUT   #'K',2,8

       LCD_OUT   #'E',2,9

        jmp     $; Mainloop  ;herhangibi bir kesme oluşana kadar sonsuz döngüye girer.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;**********************74595 entegresine veri gönderen komut***************

SHIFTREG                  ;74595 regestiri bitleri yazdıracak gönderecek program

      CALL  #SRESET       ;Regestiriyi resetle( tüm bitleri sıfırla)

      mov.w     #10h,CNT1 ;Sayac regestirisin 16 sayısını yükle

SRG   RLA     DATA1       ;DATA1 deişkeninideki değeri bir sola kaydır.kaydırma işleminde Değişkenini 16. biti herzaman Status regestirisinin C (Caeryy)bitinde gösterilir.

; bizde bu özelliği kullanrak C floğındaki değere göre 74hc595 entegresindeki Data pininin değerini ayarlamak suretiyle bitlerin yazdırılmasıın sağlıyacağız.

      jc      SETPIN      ;SR nin C bitinin değeri Set(1) ise SETPIN etiketine git

      jnc     CLRPIN      ;SR nin C bitinin değeri reset(0) ise CLRPIN etiketine git

SETPIN                    ;74595 entegresinin data(DS 14 nolu pini) değerini set(1) yap.

      BIS.B #BIT6,&P1OUT   

      jmp   CLOCK

CLRPIN  BIC.B #BIT6,&P1OUT ;74595 entegresinin data(DS 14 nolu pini) değerini reset(0) yap.

CLOCK                     ; clock palsi göndererek data pinindeki değeri şift regestiriye yazdırır.

; clock işlemi portlardaki bitleri bir sola kaydırarak data(ds 14.)pinindeki değeri 0. bite yazdırarak 8bitlik veriyi portlara gönderir.

      BIC.B #BIT7,&P1OUT   ;clock pinini resetle

      NOP                 ;bir saykıl bekle

      BIS.B #BIT7,&P1OUT   ;clock pinini Set et.

      dec   CNT1          ;göndrilen veriyi say 16 ya ulaştığında işlemi bitir.

      jnz   SRG           ;sayma işlemi 16 dan küçükse başa dön.

E_                        ;veri gönderme işlemi bitti ise gönderilen verileri 74595 entegresine yazdır ve işlem portlardan görünsün

      BIC.B #BIT5,&P1OUT

      NOP

      BIS.B #BIT5,&P1OUT

      ret                  ;veri gönderme prosödürü bitti. kaldığın yerden çalışmak için geri dön.

;********************************************************************************************************

SRESET                     ;74595 entegresinini reset pinine bir pals göndrir ve entegrenin resetlenerek portların değerini sıfırlar.

      BIC.B #BIT4,&P1OUT

      NOP

      BIS.B #BIT4,&P1OUT

      ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;***********LCD KOMUTLARI*******************

TEMIZLE

    MOV   #10H,R7

TEMIZLE_   

    MOV.B   #00010000B,DATA1

    CALL  #VERI_YAZ

    DEC   R7

    JNZ  TEMIZLE_

RET

KOMUT_YAZ

;    YAZMA_MODU

     bic.b     #BIT0,P1OUT;KOMUT_MODU

     bis.b     #BIT2,P1OUT;YAZDIR_0

    MOV.W   DATA1,R5

    CALL  #SHIFTREG;SHIFTOUT  #DATA1;   CALL  #SHIFTREG

    CALL  #GECIKME

    bic.b     #BIT2,P1OUT;YAZDIR_1

  RET

VERI_YAZ

;    YAZMA_MODU

    bis.b    #BIT0,P1OUT;VERI_MODU

    bis.b     #BIT2,P1OUT;YAZDIR_0

    MOV #DATA1,R5

    MOV DATA1,R5

    CALL  #SHIFTREG;SHIFTOUT  DATA1

    CALL  #GECIKME

    bic.b     #BIT2,P1OUT;YAZDIR_1

    RET

GECIKME

      MOV #0FFFH,R6

DLY1  DEC   R6

      JNZ DLY1

      RET

 ;************SAYDIRMA PROGRAMI*********************

SAYAC

;       ;1. SAYI

        CMP #'9',LCD_1

        JGE  SAYI_2

        INC.B LCD_1

        RET;JMP SAYI_2_

;2. SAYI      

SAYI_2  MOV #'0',LCD_1;CLR   LCD_1

        CMP #'9',LCD_2

        JGE  SAYI_3

        INC.B LCD_2

        RET;JMP SAYI_3_

;3. SAYI      

SAYI_3  MOV #'0',LCD_2;CLR   LCD_2

        CMP #'9',LCD_3

        JGE  SAYI_4

        INC.B LCD_3

        RET;JMP SAYI_4_

;4. SAYI      

SAYI_4  MOV #'0',LCD_3;CLR LCD_3

        CMP #'9',LCD_4

        JGE  SAYI_5

        INC.B LCD_4

        RET;JMP SAYI_5_

;5. SAYI      

SAYI_5  MOV #'0',LCD_4;CLR   LCD_4

        CMP #'9',LCD_5

        JGE  SAYI_0

        INC.B LCD_5

        RET

SAYI_0  MOV #'0',LCD_5;CLR LCD_5

        RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

BTN_KESME               ;buton kesmesi oluştuğunda WDT kesmesinin oluşması için gerekli(IE1 Reg. 0. biti) bitin değerini tersleyerek WDT kesmesinin durumunu değiştiri (AÇ/KaPA)  

            xor.b      #1h,IE1  ;Genel kesme ayarları için gerekli Regestirinin WDT kesmesi için ayrılmış bitinin durumunu tesrle

            BIC.B      #WDTIFG,IFG1 ;kesme kaynaklarını gösteren regestirinin WDt ileilgili bitini sıfırla  

            BIC.B      #00001000b,P1IFG ;buton kesmesinin hangi butondan olluştuğunu göstren regestirirni ilgili bitin sıfırla.

            EINT       ;genel kesme bayrağını etkinleştir (herhanigbi bir kesme oluştuğunda algıla)

            RETI       ;kesmeden dön ve kaldığın yerden işlemlerin yapmaya devam et.

WDT_KES    ;WDT kesmesi oluştuğunda bu etikete dallan.

          LCD_KOR 1,3;YAZIYI YAZACAĞI KORDİNATLARI BELİRTİYORUZ

          LCD_KARAKTER  "CIZGI-TAGEM";YAZIYI BİR DÖNGÜ İLE LCD YE YAZDIRIYORUZ

          CALL  #SAYAC  ;LCD DEKİ SAYILASRI BİRER BİRER ARTIRMAYA YARAYAN KODDU ÇAĞIRIYORUZ.

          MOV   #LCD_1,R8;LCD DEKİ 1LER BASAMAĞINI R8 REG. ALIR

          LCD_OUT    @R8,2,10;R8 DEKİ SAYIYI LCD DE GÖSTER

          MOV   #LCD_2,R8

          LCD_OUT    @R8,2,9

          MOV   #LCD_3,R8

          LCD_OUT    @R8,2,8

          MOV   #LCD_4,R8

          LCD_OUT    @R8,2,7

          MOV   #LCD_5,R8

          LCD_OUT    @R8,2,6

BITIR         

            BIC.B     #1H,IFG1              ;IFG1 REGESTİRİSİ OLUŞAN KESMENİNİ KAYNAĞINI GÖSTEREN rEGESTİRİDİR.

;WDTIFG (0 BİTİ) WDT KESME KAYNAĞINI GÖSTERİR. KESME OLUŞTUĞUNDA BU BAYRAK 1 OLUR YENİDEN WDT KURMAK İÇİN BU BAYRAĞIN SIFIRLANMASI GERKLİDİR.

            EINT                            ; (GIE) GENEL KESME BAYRAĞINI AKTİFLEŞTİRİR

            RETI

COMMON  INTVEC

            DINT              ;GIE KESME BAYRAĞINI TEMİZLE (0 YAPAR)

            ORG     WDT_VECTOR;0FFFEh WDT KESME VEKTÖRÜ

            DW      WDT_KES   ; KESME OLUŞUNCA BU ETİKETE DALLAN

            ORG     RESET_VECTOR;0FFFEh; İLK ENERCİ GELDİĞİNDE VEYA RESET EDİLDİĞİNDE BU ETİKETE DALLAN

            DC16    init  

            ORG     PORT1_VECTOR;0xFFE4;buton kesme vektörü

            DW      BTN_KESME;kesme butondan oluştuğunda gidilecek kesme etiketi

            END Mainloop



  • Merve

    Merhaba
    Benim projem 16×2 karakter lcd de isim soyisim ve sıcaklık göstermek.acaba bu devrenin board üzerine nasıl kurulacağına dair bir şema paylaşabilir misiniz? çok sevinirim..Kolay gelsin..

  • Mujdat117

    merhaba Merve hanım aşağıdaki linkte benzer bi resim ekledim
    umarım işinize yarar
    http://www.mcu-turkey.com/?p=17368