مطالب علمی

راه اندازی سون سگمنت چند دیجیت به سادگی نمایشگرهای کاراکتری

راه اندازی سون سگمنت
سون سگمنت از 8 LED تشکیل شده است که از 7 عدد آن برای نمایش اعداد و حروف A تا F و از Led هشتم برای نمایش ممیز (Dot) استفاده میشود.
هر سون سگمنت تک رقمی دارای 10 پایه به شرح زیر است:
پایه که با حروف a تا g نام گذاری شده اند. پایه که با Dot نام گذاری شده است.  پایه که پایه های مشترک بوده و در داخل IC به هم متصل میباشند.

13418125031

سون سگمنت ها به دو دسته تقسیم میشوند:
1- آند مشترک: پایه آند هر 8 LED در داخل به هم وصل است و پایه کاتد آنها آزاد میباشد.
2- کاتد مشترک: پایه کاتد هر 8 LED در داخل به هم وصل است و پایه آند آنها آزاد میباشد.

اتصال سون سگمنت به میکروکنترلر و نمایش عدد بر روی آن
برای اتصال سون سگمنت به میکرو دو راه وجود دارد:
– اتصال پایه های a تا g مستقیم به یکی از پورتها
– استفاده از ای سی های دیکودر مانند 7447 و 7448
نمایش اعداد تک رقمی روی سون سگمنت به روش معمولی
در این روش برای نمایش هر رقم یا حرف روی سون سگمنت ابتدا بایستی کد هگزادسیمال معادل آن را بدست آوریم.برای این کار بایستی به دو نکته توجه داشته باشیم:
1- آند یا کاتد مشترک بودن سون سگمنت.
2- در نمایش هر رقم یا حرف کدامLED ها روشن و کدام LEDها خاموش خواهند شد.
با توجه به دو نکته بالا کد هگزادسیمال را برای ارقام 0 تا 9 جهت نمایش توسط سون سگمنت کاتد مشترک را بدست میآوریم:

13418127681

نمایش اعداد تک رقمی روی سون سگمنت با استفاده از دیکودر دیتا
برای انجام این روش به دونکته بایستی توجه داشت:
انتخاب دیکدر مناسب با توجه به نوع سون سگمنت
وصل خروجی های دیکدر نظیربه نظیر به ورودی های سون سگمنت
برای راه اندازی سون سگمنت آند مشترک از دیکدر 7447 و برای راه اندازی سون سگمنت کاتد مشترک از دیکدر 7448 استفاده میشود. در برنامه نویسی برای نمایش عدد روی سون سگمنت با استفاده از دیکدر مستقیم از معادل دسیمال اعداد در برنامه استفاده میشود.

نمایش اعداد چند رقمی با استفاده از سون سگمنت
برای نمایش اعداد چند رقمی بر روی سون سگمنت یک راه این است که به ازای هر رقم از یک پورت استفاده کنیم اما چون تعداد پورتهای یک میکرو محدود است این روش، روش مناسبی نیست.همانطور که میدانیم چشم انسان در صورتی که 25 تصویر یا بیشتر از یک شی پشت سر هم در یک ثانیه پخش شود آن را پیوسته میبیند و میتوان از این خطای چشم استفاده کرد.که به روش مالتی پلکس کردن معروف است.
در این روش خطوط دیتا یعنی پایه های a تا g را به یکی از پورتها وصل کرده و پایه های دیگر میکرو برای کنترل پایه مشترک سون سگمنت ها مورد استفاده قرار میگیرد.در این روش در هر لحظه فقط یک سون سگمنت روشن است و بقیه ی سون سگمنت ها خاموش میباشند ولی چون این عمل با سرعت بالا انجام میگیرد ما همه ی آن ها را روشن می بینیم.

در ارتباط با اینکه سون سگمنت چی هست و چطوره به طور کلی توضیحاتی ارئه شد. مختصر و مفید می خوام براتون یه سورس رو قرار بدم که به سادگی راه اندازی یه LCD کاراکتری بتونید از سون سگمنت در مدارات خودتون استفاده کنید.

لازم به ذکره که بنده از این روش در بردهای متنوعی استفاده کردم که بسیاری از اونها بیشتر از دوساله کار می کنه و کوچکترین مشکلی نداشته. در این سورس تعداد سون سگمنت ها رو در دیفاین تعریف شده می نویسید و رفرش و تمامی اعمال در وقفه تایمر صفر صورت می گیره.

بنده سورس رو برای چهار عدد سون سگمنت قرار میدم و تغییر در اون بسیار راحت خواهد بود. در این برنامه یک کانال ADC خونده میشه و مقادیر به دست امده بر روی چهار عدد سون سگمنت به نمایش در خواهد آمد. لازم به ذکره هدف از قرار دادن سورس اشنایی با راه اندازی سون سگمنته نه ADC و نمونه کد صرفا نحوه استفاده از متغیرها رو نشون میده .کامپایلر اتمل استدیو می باشد.

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>

//*********** Defines *************

const unsigned char UcAlphabet[10] PROGMEM={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

#define DataPort  PORTZ
#define Digit    4


#define EN_A_S PORTX |= (1<<PORTXY)//xxx1
#define EN_A_R PORTX &=~ (1<<PORTXY)
#define EN_B_S PORTX |= (1<<PORTXY)//xx1x
#define EN_B_R PORTX &=~ (1<<PORTXY)
#define EN_C_S PORTX |= (1<<PORTXY)//x1xx
#define EN_C_R PORTX &=~ (1<<PORTXY)
#define EN_D_S PORTX |= (1<<PORTXY)//1xxx
#define EN_D_R PORTX &=~ (1<<PORTXY)


//*********** Variables *************

int ICount = 0;
int IFlag = 0;
int IFirstDigit = 0; // XXX1
int ISecondDigit = 0; // XX1X
int IThirdDigit = 0; // X1XX
int IFourthDigit = 0; // 1XXX


ISR(TIMER0_OVF_vect)
{
	static int ICountDigit = 0;
	
	PORTX = 0x00;
	DataPort = 0xff;
	
	if (ICountDigit > (Digit-1)) ICountDigit = 0;

	switch (ICountDigit)
	{
		case 0:
			EN_A_S;
		   DataPort=pgm_read_byte_near(&UcAlphabet[IFirstDigit]);
			//DataPort=pgm_read_byte_near(&UcAlphabet[0]);
		break;
		case 1:
			EN_B_S;
			DataPort=pgm_read_byte_near(&UcAlphabet[ISecondDigit]);
			//DataPort=pgm_read_byte_near(&UcAlphabet[1]);
		break;
		case 2:
			EN_C_S;
			DataPort=pgm_read_byte_near(&UcAlphabet[IThirdDigit]);
			//DataPort=pgm_read_byte_near(&UcAlphabet[2]);
		break;
		case 3:
			EN_D_S;
			DataPort=pgm_read_byte_near(&UcAlphabet[IFourthDigit]);
			//DataPort=pgm_read_byte_near(&UcAlphabet[3]);
		break;
	}
	ICountDigit ++;
		
}

int main(void)
{
	
	float    Fdata= 0;
	unsigned int Ivalue = 0;

		
	//*************TIMER Init***********	
	TCCR0 = (1<<CS00)|(1<<CS01);//OCS / 64 =125Khz
	TIFR = (1<<TOV0);
	TIMSK = (1<<TOIE0);
	//**************ADC Init************
	ADMUX=(1<<REFS1)|(1<<REFS0);// Selected Chanel 3 and refrence AVCC & ADLAR = 0
	ADCSRA=(1<<ADEN)|(1<<ADPS0)|(1<<ADPS2);//adc enable & selected prescale F_CPU/32
	SFIOR=0x00;
		
	sei();
	_delay_ms(500);

	
  while(1)
  {

		ADCSRA|=(1<<ADSC);
		while(!(ADCSRA&=~(1<<ADSC)));
		
		Fdata = (float) ADCW / 0.4;
		Ivalue = (unsigned int) Fdata;
		
		IFourthDigit = Ivalue / 1000;
		IThirdDigit = (Ivalue - (IFourthDigit * 1000)) / 100;
		ISecondDigit = (Ivalue - ((IFourthDigit * 1000)+(IThirdDigit * 100))) / 10;
		IFirstDigit = Ivalue - ((IFourthDigit * 1000)+(IThirdDigit * 100)+(ISecondDigit * 10)); 
  }
}

نویسنده: سوران آراسته

لینک مطلب در انجمن: http://www.eca.ir/forums/thread68269.html

نوشته های مشابه

2 دیدگاه

  1. خدا خیرتون بده کارمو راه انداختین.فقط یه سوال اگه بخوایم تو یه عدد یه رقمی صفر سمت چپش روشن نشه باید چیکار کنیم؟

    1. خب میتونین چک کنین که زمانی مثلا ده گان به بالا همه صفر بودن میکرو اصلا پایه ی مربوط به اون سون سگمنت رو صفر (کاتد مشترک) یا یک(اند مشترک) نکنه، شرطش رو هم میتونین بنویسین( اگر عدد مورد نظر از 10 کوچک تر بود) ، با این شرط دیگه اون سون سگمنت ها اصلا روشن نمیشن، اما باید حواست باشه که اینکار باعث میشه عدد یکان نمایش داده شده خراب بشه، پس بهتره زمانی نوبت به بقیه ی سونسگمنت ها رسید که خاموش بشن سونسگمنت یکان هم خاموش بشه تا عدد صفر مربوط به دهگان یا صدگان روی اون تاثیر نزاره

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا