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

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 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
Yazar: mujdat117
Yazarımızın 320volt.com Blog üzerinde şu an okuduğunuz yazı dahil 5 yazısı bulunmaktadır. Yazarımız hakkında bilgileri ve diğer yazılarını görmek için bakınız; mujdat117










