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