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
Yayım tarihi: 2011/10/03 Etiketler: 74HC595, 74hc595 lcd, msp430 74hc595, msp430 asm, msp430 programlama, msp430 projeleri
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..
merhaba Merve hanım aşağıdaki linkte benzer bi resim ekledim
umarım işinize yarar
http://www.mcu-turkey.com/?p=17368
Merhaba, ben ı2c kullanarak LCD ile msp’yi haberleştirmek istiyorum ama kaynak bulamadım. Yardımcı olabilir misiniz ?
Merhaba,
https://gist.github.com/sourceperl/5704409
google “msp430 i2c lcd” yazdım bir sürü kaynak var
ek olarak ilgili yazılar;
https://320volt.com/msp430-denetleyiciler-ile-karakter-lcd-kullanimi/
https://320volt.com/tag/msp430-kullanimi/
İyi çalışmalar.