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