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

موفق و پیروز باشید
در ارتباط با اینکه سون سگمنت چی هست و چطوره در سطح سایت به فراوانی بحث شده و در اینجا نمی خوام در زمینه ساختار سون سگمنت بحث کنم.
مختصر و مفید می خوام براتون یه سورس رو قرار بدم که به سادگی راه اندازی یه 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)); } }
امیدوارم مشکل سون سگمنت برای همیشه حل بشه


موفق و پیروز باشید
دیدگاه