Künye

Okuduğunuz yazı PIC24F dsPIC30F dsPIC33F Uygulamaları Kategorisi altında 31/03/2010 Tarihinde Tarafından Yazıldı - 4.590 kez okunmuş

Yazı Seçenekleri : | Pdf Kayıt | Arkadaşına Gönder | Yazıyı Paylaş | Geri izleme | Yorum takibi

Etiketler : , , , , , ,

Merhaba,

Bu bölümde PIC24F serisi ile 4×20 LCD’ye nasıl sürüleceğini gösteren bir program ekliyeceğim. Yararlı olacağını umuyorum.

  
/*
Aykut ULUSAN
Elektronik Mühendisi 
IZMIR

www.uicroarm.com

işlemci : PIC24Fj32
osc: dahili fast osc, 8mhz, TCY=1us/8=125ns
LCD busy flag kullanılmayacak, 4bit interface
Board : EXPKITS  EX16L-A (PIC24F ve PIC33F geliştirme boardu)
*/

#include <p24Fxxxx.h>			// 

_CONFIG1(0x3F20)  // JTAG, WDF, flash memory'ye yazma kullanılmayacak
_CONFIG2(0x78EF)	// Dahili fast rc osc enable, xtal uçları boş olacak
//_CONFIG2(  IESO_OFF & FNOSC_PRI & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_ON & I2C1SEL_PRI & POSCMOD_HS );
//_CONFIG1(  JTAGEN_OFF & GCP_OFF &  GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx1 & WINDIS_OFF ); 	
	
#define	LCD_RS			LATBbits.LATB8		// lcd için register select pin
#define	LCD_E			LATBbits.LATB5		// lcd enable pin	
#define	LCD_PORT		LATB
#define	LCD_TRIS		TRISB
#define	d				1					// lcd'ye data/karakter yazılacak
#define	c				0					// lcd'ye komut yazılacak
#define	D				d					// lcd'ye data/karakter yazılacak
#define	C				c					// lcd'ye komut yazılacak


#define NOP() 		{__asm__ volatile ("nop");}
#define CLRWDT() 	{__asm__ volatile ("clrwdt");}
#define SLEEP() 	{__asm__ volatile ("pwrsav #0");}
#define IDLE() 		{__asm__ volatile ("pwrsav #1");}

#define	LINE_1			0x80
#define	LINE_2			0xC0
#define	LINE_3			0x94
#define	LINE_4			0xD4			
/*
LCD			PIC24
D4			PORTBbits.RB0
D5			PORTBbits.RB1
D6			PORTBbits.RB2
D7			PORTBbits.RB3
*/


// X*10US
void
DLY_10US(unsigned int us){
	while(us--) {
		__asm__ volatile ("repeat #33");
		__asm__ volatile ("nop");
	}
}


// 65536ms'ye kadar 
void
DLY_MS(unsigned int ms){
	while(ms--){
		DLY_10US(100);
	}
}




void 
LCD_ENABLE(void){	
	LCD_E=1;asm("nop");asm("nop");asm("nop");asm("nop");LCD_E=0;
}

void
LCD_WRITE(unsigned char da_ta, unsigned char D_C){
	if(D_C) LCD_RS=1;					// data modu
	else	LCD_RS=0;					// komut modu
	LCD_PORT&=0x3F0;
	LCD_PORT|=da_ta>>4;					// lcd'ye gönder, RS ve E bozulmamalı
	LCD_ENABLE();						// enable

//	while(1);

	LCD_PORT&=0x3F0;
	LCD_PORT|=da_ta&0x0F;				// lcd'ye gönder
	LCD_ENABLE();						// enable
	DLY_10US(50);						// 50us delay
	LCD_RS=0;
}

void
LCD_SETUP(void){
	DLY_MS(100);			// lcd'nin kendini hazırlaması için 100ms
	LCD_PORT=0x3;
	LCD_ENABLE();
	DLY_MS(10);
	LCD_ENABLE(); 
	DLY_MS(10);
	LCD_ENABLE();  
	DLY_MS(10);
	LCD_PORT=0x2;
	LCD_ENABLE();
	DLY_MS(10);
	LCD_WRITE(0x28,c);		// disp on, cursor off
	LCD_WRITE(0x0c,c);		// 
    LCD_WRITE(0x06,c);		// 
	LCD_WRITE(0x01,c);		// clear display 
	LCD_WRITE(0x02,c);		//
	DLY_MS(2);		
	
}

void
LCD_STRING(const char *str){
	while(*str)
		LCD_WRITE(*str++,d);
} 

void
LCD_GOTO(unsigned char satir,unsigned char adres){
	LCD_WRITE(satir+adres,c); 
}
	
 
int 
main(void){
	AD1PCFG=0xFFFF;				// portlar dijital
	PMCON=0;
	PORTB=0;					// latch'leri temizle
	TRISB=0; asm("NOP");		// B portu çıkış


	LCD_SETUP();
	LCD_GOTO(LINE_1,0);
	LCD_STRING("www.uicroarm.com"); 
	LCD_GOTO(LINE_2,0);
	LCD_STRING("PIC24 by Kutay");
	while(1);	
	return(0);
}