۱۴۰۱ بهمن ۲۲, شنبه

میکروکنترلر PIC - قسمت چهارم : Text LCD

microchip 16f877

 

مبانی راه اندازی Text LCD:

دو روش برای راه اندازی یکLCD متنی وجود دارد.استفاده از باس 8 بیتی برای انتقال دستورات و دیتا و استفاده از باس 4 بیتی .بدلیل سیم کشی کمتر ما از روش باس 4 بیتی استفاده میکنیم. توصیف پایه های LCD به صورت زیراست:
پایهنمادتوصیف رفتار
1VSSزمین
2VCCتغذیه مثبت
3VEEکنترل درخشندگی
4RSانتخاب رجیستر RS و انتخاب بین دادن فرمان یا نوشتن برروی LCD
5R/WR/W=1 برای خواندن و R/W=0 برای نوشتن در LCD
6Eعملیات لچ کردن داده ها
7DB0گذرگاه داده 8 بیتی
8DB1گذرگاه داده 8 بیتی
9DB2گذرگاه داده 8 بیتی
10DB3گذرگاه داده 8 بیتی
11DB4گذرگاه داده 8 بیتی
12DB5گذرگاه داده 8 بیتی
13DB6گذرگاه داده 8 بیتی
14DB7گذرگاه داده 8 بیتی
15Aولتاژ مثبت برای راه اندازه BackLight
16Kولتاژ منفی برای راه اندازی BackLight



برای ارسال فرمان به LCD هر کدام از دستورات جدول زیر را میتوانیم به LCD اعمال کنیم. ابتدا پایه RS=0 قرار میدهیم و یک پالس بالا به پایین با عرض حداقل 0.5 میلی ثانیه به پایه E اعمال میکنیم و فرمان را بر روی باس داده قرار میدهیم.
برای ارسال داده جهت نمایش بر روی LCD ابتدا باید RS=1 باشد و یک پالس بالا به پایین با عرض حداقل 0.5 میلی ثانیه به پایه E اعمال کنیم.

کد هگزعملکرد
1پاک کردن صفحه نمایش
2بازگشت به مکان اول
4کاهش مکان نما (جابجایی به چپ)
6افزایش مکان نما (جابجایی به راست)
5جابجایی نمایش به راست
7جابجایی نمایش به چپ
8نمایش خاموش،مکان نما خاموش
Aنمایش خاموش ،مکان نما روشن
Cنمایش روشن،مکان نما خاموش
Eنمایش روشن،مکان نما روشن
Fنمایش روشن،مکان نما چشمک زن
10جابجایی مکان نما به چپ
14جابجایی مکان نما به راست
18کل صفحه نمایش به چپ جابجا شود
1Cکل صفحه نمایش به راست جابجا شود
C0انتقال مکان نما به ابتدای سطر دوم
38سازمان دهی LCD بصورت 2 سطر و ماتریس های 5x7

با توجه به توضیحات مقدماتی فوق و مراجعه به برگه اطلاعاتی LCD ها و محل قراری مکان نما در هر سطر و ... کتابخانه lcd.h بصورت زیر برای کار با میکروهای خانواده PIC آماده شده است.

//LCD Functions Developed by electroSome
void Lcd_Port(char a)
{
	if(a & 1)
		D4 = 1;
	else
		D4 = 0;

	if(a & 2)
		D5 = 1;
	else
		D5 = 0;

	if(a & 4)
		D6 = 1;
	else
		D6 = 0;

	if(a & 8)
		D7 = 1;
	else
		D7 = 0;
}
void Lcd_Cmd(char a)
{
	RS = 0;             // => RS = 0
	Lcd_Port(a);
	EN  = 1;             // => E = 1
        __delay_ms(4);
        EN  = 0;             // => E = 0
}

Lcd_Clear()
{
	Lcd_Cmd(0);
	Lcd_Cmd(1);
}

void Lcd_Set_Cursor(char a, char b)
{
	char temp,z,y;
	if(a == 1)
	{
	  temp = 0x80 + b - 1;
		z = temp>>4;
		y = temp & 0x0F;
		Lcd_Cmd(z);
		Lcd_Cmd(y);
	}
	else if(a == 2)
	{
		temp = 0xC0 + b - 1;
		z = temp>>4;
		y = temp & 0x0F;
		Lcd_Cmd(z);
		Lcd_Cmd(y);
	}
}

void Lcd_Init()
{
  Lcd_Port(0x00);
   __delay_ms(20);
  Lcd_Cmd(0x03);
	__delay_ms(5);
  Lcd_Cmd(0x03);
	__delay_ms(11);
  Lcd_Cmd(0x03);
  /////////////////////////////////////////////////////
  Lcd_Cmd(0x02);
  Lcd_Cmd(0x02);
  Lcd_Cmd(0x08);
  Lcd_Cmd(0x00);
  Lcd_Cmd(0x0C);
  Lcd_Cmd(0x00);
  Lcd_Cmd(0x06);
}

void Lcd_Write_Char(char a)
{
   char temp,y;
   temp = a&0x0F;
   y = a&0xF0;
   RS = 1;             // => RS = 1
   Lcd_Port(y>>4);             //Data transfer
   EN = 1;
   __delay_us(40);
   EN = 0;
   Lcd_Port(temp);
   EN = 1;
   __delay_us(40);
   EN = 0;
}

void Lcd_Write_String(char *a)
{
	int i;
	for(i=0;a[i]!='\0';i++)
	   Lcd_Write_Char(a[i]);
}

void Lcd_Shift_Right()
{
	Lcd_Cmd(0x01);
	Lcd_Cmd(0x0C);
}

void Lcd_Shift_Left()
{
	Lcd_Cmd(0x01);
	Lcd_Cmd(0x08);
}

توابع کتابخانه lcd.h

()void Lcd_Init:در آغاز به کار LCD را تنظیم کرده و برای استفاده آماده میکند.
()Lcd_Clear: صفحه نمایش را کاملا پاک میکند.
void Lcd_Set_Cursor(char a, char b):مکان نما را به سطر a و ستون b منتقل میکند.
void Lcd_Write_Char(char a):یک حرف بر روی LCD چاپ میکند.
void Lcd_Write_String(char *a):یک رشته بر روی LCD چاپ میکند.
()void Lcd_Shift_Right:رشته حروف روی LCD را به راست منتقل میکند.
()void Lcd_Shift_Left:حروف بر روی LCD را به سمت چپ منتقل میکند.

برنامه نمونه به کار گیری lcd.h توسط میکروکنترلرPIC بصورت زیر است. ترتیب پایه ها همانگونه که در ابتدار برنامه ذکر شده بصورت زیر میباشد:

LCD====>Micro
RS====>RD2
EN====>RD3
D4====>RD4
D5====>RD5
D6====>RD6
D7====>RD7

#define _XTAL_FREQ 16000000

#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7

#include < xc.h>
#include "lcd.h"

// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG

int main()
{
  unsigned int a;
  TRISD = 0x00;
  Lcd_Init();
  while(1)
  {
    Lcd_Clear();
    Lcd_Set_Cursor(1,1);
    Lcd_Write_String("LCD Library for");
    Lcd_Set_Cursor(2,1);
    Lcd_Write_String("MPLAB XC8");
    __delay_ms(2000);
    Lcd_Clear();
    Lcd_Set_Cursor(1,1);
    Lcd_Write_String("Developed By");
    Lcd_Set_Cursor(2,1);
    Lcd_Write_String("ALI Moradi");
    __delay_ms(2000);
    Lcd_Clear();
    Lcd_Set_Cursor(1,1);
    Lcd_Write_String("electronic4fun");

    for(a=0;a<15;a++)
    {
        __delay_ms(300);
        Lcd_Shift_Left();
    }

    for(a=0;a<15;a++)
    {
        __delay_ms(300);
        Lcd_Shift_Right();
    }

    Lcd_Clear();
    Lcd_Set_Cursor(2,1);
    Lcd_Write_Char('A');
    Lcd_Write_Char('l');
    Lcd_Write_Char('i');
    __delay_ms(2000);
  }
  return 0;
}

هیچ نظری موجود نیست:

ارسال یک نظر