450 likes | 719 Views
Session 5. مطالب این جلسه:. معرفی 7segment ها و نحوه راه اندازی آنها Lcd های کارکتری و نحوه ارتباط دهی با میکرو. نمایشگر های seven segment.
E N D
مطالب این جلسه: • معرفی 7segment ها و نحوه راه اندازی آنها • Lcdهای کارکتری و نحوه ارتباط دهی با میکرو
نمایشگر های seven segment سون سگمنت ها از 8 دیود نوری تشکیل شده اند که یک سر دیود ها به هم وصل شده اند و به عنوان سر مشترک استفاده می شوند.دو نوع سگمنت وجود دارد : یک آند مشترک و دیگری کاتد مشترک. در سون سگمنت آند مشترک تمام سر های مثبت دیود ها به همدیگر وصل شده اند و در کاتد مشترک تمام سرهای منفی.
Common Anode • در این سون سگمنت با صفر کردن هر پایه متصل به میکرو کنترلر سگمنت متناظر روشن خواهد شد
Common Cathode • در این سون سگمنت با یک کردن هر پایه متصل شده به میکرو سگمنت متناظر روشن خواهد شد
Example-5 • برنامه ای بنویسید که اعداد 0 تا 9 را بر روي 7segmentآند مشترك به فاصله يك ثانيه نشان دهد . #include <mega32.h> #include <delay.h> unsigned char seven_seg_code(unsigned char num); void main(void) { unsigned chari; DDRA=0xff; while (1) { for (i=0;i<10;i++) { PORTA=seven_seg_code(i); delay_ms(1000); } } }
Example-5 unsigned char seven_seg_code(unsigned char num) { unsigned char out; switch(num) { case 0:out=0xc0;break; case 1:out=0xf9;break; case 2:out=0xa4;break; case 3:out=0xb0;break; case 4:out=0x99;break; case 5:out=0x92;break; case 6:out=0x83;break; case 7:out=0xf8;break; case 8:out=0x80;break; case 9:out=0x98;break; } return out; }
اتصال 7SEGMENTبه میکرو کنترلر • سون سگمنت به روشهاي مختلفی به میکروکنترلر متصل می شود. روش اول این است که کدهارا مطابق جدول به صورت مستقیم به سون سگمنت اعمال کنیم. روش دوم استفاده از IC های مبدل کد BCD به سون سگمنت است مانند:7448,7447,45114054,4055,MAX7219, MAX7221
مالتی پلکس کردن سون سگمنت ها • برای استفاده از چند سون سگمنت مالتی پلکس شده تمامی پایه های دیتا را روی یک پورت قرار داده و پایه های مشترک سون سگمنت ها را کنترل میکنیم.به این صورت که با فعال کردن آن پایه ی مشتر ک وارسال اطلاعات به سگمنت مورد نظر با توالی 20 میلی ثانیه .تمامی سگمنت ها باتوجه به خطای چشم انسان روشن به نظر میرسند.
مالتی پلکس کردن سون سگمنت ها استفاده از تکنیک رفریشینگ
Practice -2 • 1- مثال قبل را براي يك 7seg كاتد مشترك پياده سازي كنيد. • 2- مثال قبل را با استفاده از IC مبدل BCD به 7segment ، 7447 پياده سازي كنيد. • 3- با استفاده از 7segment كاتد مشترك و IC ، 7448 يك شمارنده 0 تا 9 با فاصله زماني 1 ثانيه بسازيد. • 4- برنامه اي بنويسيد كه عددي را از پورت B خوانده و برروي 7seg نمايش دهد. • 5- يك شمارنده 0 تا 99 با فاصله زماني 1 ثانيه بسازيد
صفحه نمایش LCD: یکی از اصلی ترین ابزارهای خروجی برای میکروکنترلرها صفحه نمایش LCD کاراکتری می باشد که به وسیله آن می توانیم کاراکترها و رشته های مختلف را نمایش دهیم!
آشنایی با توابع کتابخانه ای lcd.h: برای نمایش حروف و کلمات بر روی LCD راه های مختلفی وجود دارد که استفاده از نرم افزار CodeVision به دلیل در اختیار داشتن توابع کتابخانه ای لازم از بقیه بسیار آسان تر می باشد. این توابع از بیشتر LCDهای موجود در بازار، با تعداد ردیف و ستون های مختلف پشتیبانی می کند. void _lcd_ready(); void _lcd_write_data(unsigned char data); Unsigned char lcd_read_byte(unsigned char addr); unsigned char lcd_init(unsigned char lcd_columns) voidlcd_clear(void) voidlcd_gotoxy(unsigned char x, unsigned char y) voidlcd_putchar(char c) voidlcd_puts(char *str) voidlcd_putsf(char flash *str)
آشنایی با توابع کتابخانه ای lcd.h: توابع سطح پایین: 1. void_lcd_ready(); زمانی که این تابع فراخوانی شود، میکروکنترلر منتظر آماده شدن LCD برای دریافت اطلاعات می شود. 2. void_lcd_write_data(unsigned char data); از این تابع برای مقداردهی کردن ثبات درون LCD استفاده می شود. این ثبات برای کنترل تنظیمات LCD می باشد و به کمک این تابع تنظیمات LCD را تغییر می دهیم.برای مشاهده این تنظیمات به جدول صفحه بعد مراجعه کنید _lcd_ready(); //waits until the LCD module is ready for receiving data _lcd_write_data(0x0E); //نمایش روشن و مکان نما روشن
توابع کتابخانه ای lcd.h: 3. void lcd_write_byte(unsigned char addr, unsigned char data); بوسیله این تابع می توانیم یک متغیر Char را طوری مقداردهی کنیم که یک کاراکتر دلخواه شود، سپس بوسیله این تابع می توانیم آن را نمایش دهیم!به عنوان مثال برای فارسی نویسی در lcdمیتواتد استفاده شود 4. Unsigned char lcd_read_byte(unsigned char addr); این تابع مشابه تابع قبل عمل می کند با این تفاوت که یک کاراکتر را از LCD می خواند و یک متغیر که شکل آن را دربر دارد را برمی گرداند. flash byte char0[8]={ 0b0000000, 0b0001111, 0b0000011, 0b0000101, 0b0001001, 0b0010000, 0b0100000, 0b1000000};
توابع کتابخانه ای lcd.h: توابع سطح بالا: 1. unsignedcharlcd_init(unsigned char LcdCollumns); برای مقدار دهی اولیه و تعیین تعداد ستون lcd این تابع در ابتدای برنامه فراخوانی می شود. این تابع مکان نمای چاپ را به خانه (0,0) می برد و همچنین مکان نمای چاپگر را غیر فعال می کند. Example: lcd_init(16)
توابع کتابخانه ای lcd.h: 2. voidlcd_clear(); به وسیله این تابع صفحه نمایش پاک می شود! 3. Voidlcd_gotoxy(unsigned char x, unsigned char y); مکان نمای چاپ را به (X,Y) مورد نظر می برد. بعد از فراخوانی این تابع کاراکترها از این نقطه شروع به چاپ شدن می کنند! X: ستون و Y: ردیف Lcd_gotoxy(4,2)
توابع کتابخانه ای lcd.h: 4. voidlcd_putchar(char c); برای ارسال یک کارکتر به lcdاستفاده میشود Example : lcd_putchar('a');
توابع کتابخانه ای lcd.h: 5. voidlcd_puts(char *str); رشته str را که آرایه ای از کارکترها می باشد، را در موقعیت فعلی نمایش می دهد. توجه کنید که وقتی از این تابع استفاده می کنیم که رشته str درون RAM قرار داشته باشد. Example: sprintf(buffer, “tempreture= %d”, temp); lcd_puts(buffer);
توابع کتابخانه ای lcd.h: 6. void lcd_putsf(char flash *str); رشته str را که آرایه ای از کارکترها می باشد، را در موقعیت فعلی نمایش می دهد. توجه کنید که وقتی از این تابع استفاده می کنیم که رشته str درون Flash قرار داشته باشد. برای مثال: lcd_clear();//صفحه نمای را پاک میکند lcd_init(16); //موقعیت مکان نما را در خانه 0و0 قرار داده و اعلام میکند 16 کارکتر داریم char c = ‘|’; //Declares char c, and sets its value to ‘|’ lcd_putchar(c); //Prints variable c on the LCD lcd_gotoxy(8,1); //Sets the new position for the cursor at (8,2) char str1[16] = “Hi…”; //Define a array of chars(string). Just like variable c This variable is stored in the microcontrollers RAM. lcd_puts(str1); //because str1 is stored in RAM we have to use lcd_puts() lcd_clear(); //Clears the LCD again lcd_putsf(“Hello Majid!”); //Prints “Hello Majid” on the LCD! we use lcd_putsf() because the string “AVR Rocks” is part of the code and wasn’t declared in the middle of the program.
نکته: همواه قبل از استفاده از کتابخانه lcd.h باید توسط دستورات اسمبلی زیر پورت متصل به lcd در برنامه معرفی شود.به عنوان مثال دستور زیر بیانگر اتصال lcd به portcاست.(0x15 آدرس ریجستر پورت c است) #asm//شروع زبان اسمبلی .equ __lcd_port=0x15//معرفی پرت متصل به نمایشگر #endasm//پایان زبان اسمبلی حال مجاز هستیم کتابخانه lcdرا در برنامه فراخوانی کنیم #include <lcd. h> Lcd_init(20);
Example - 7 • در سطر اول ستون پنجم كاراكتر ‘a’ و در سطر دوم ستون اول عبارت “CodeVisionAVR” را بر روي يك LCD 2x16 نمايش دهيد. • #include <mega16.h> • #asm • .equ __lcd_port=0x1B ;PORTA • #endasm • #include <lcd.h> • #include <delay.h> • void main(void) • { • lcd_init(16); • while (1) • { • lcd_clear(); • lcd_gotoxy(5,0); • lcd_putchar('a'); • lcd_gotoxy(0,1); • lcd_putsf("CodeVisionAVR"); • delay_ms(200); • }; • }
Example-8 • تابعي بنويسيد كه بصورت روان كلمه CodeVision را بر روي LCD نمايش دهد. • #include <mega16.h> • // Alphanumeric LCD Module functions • #asm • .equ __lcd_port=0x1B ;PORTA • #endasm • #include <lcd.h> • #include <delay.h> • void main(void) • { • inti; • lcd_init(16); • while (1) • { • for (i=0;i<7;i++) • { • lcd_clear(); • lcd_gotoxy(i,0); • lcd_putsf("CodeVision"); • delay_ms(400); • } • }; • }
توابع کتابخانه ای stdlib.h: درون این کتابخانه ها چندین تابع پرکاربرد برای ساختن رشته ها و کار با آنها موجود می باشد. 1. itoa(intn,char *str); این تابع عدد 16 بیتی n را به صورت کارکتر های اسکی درآورده و در متغییر strکه به صورت رشته ای تعریف شده است می ریزد(عدد n بین 0 تا 65535 است) 2. Ltoa(long intn , char *str); این تابع عدد 32 بیتی nرا به صورت کارکتر های اسکی درآورده و در متغییر strکه به صورت رشته ای تعریف شده است می ریزد(عدد n بین 0 تا 4294967295 است)
توابع کتابخانه ای stdlib.h: 3. voidftoa(float n, unsigned char decimals, char *str); این تابع عدد اعشاری n را به صورت کارکتر های اسکی در آورده و در متغییر رشته ایی str قرار می دهد. تعداد ارقامی که توسط این عدد اعشاری قرار است در رشته قرار داده شود توسط متغیر decimals مشخص می شود! 4. voidftoe(float n, unsigned char decimals, char *str); این تابع عدد اعشاریو توان دار nرا (مثل (4.8e-6 را به صورت کارکتر های اسکی در آورده و در متغییر رشته ایی str قرار می دهد. تعداد ارقامی که توسط این عدد اعشاری قرار است در رشته قرار داده شود توسط متغیر decimals مشخص می شود! 5. rand(); این تابع یک عدد تصادفی بین صفر تا 32767 تولید میکند
Example-9 برنامه یک شمارنده 0 تا 999 را بر روی LCD بنویسیدکه به صورت صعودی شمار تا 999 را با تاخیر 1 ثانیه شمارش کند #include <mega32.h>//معرفی تراشه مورد نظر به کامپایلر #include <alcd.h>//استفاده از کتابخانه جدید کدویژن برای ال سی دی ها #include <delay.h>//چون از تابع تاخیری استفاده میکنیم باید کتابخانه ۀن به برنامه اضافه شود #include <stdlib.h>//چون از تابع itoa استفاده میکنیم باید کتابخانه مورد نظر به برنامه اضافه شود void main(void) { //در این مکان متغییر های محلی تعریف میشوند unsigned int count;//این متغییر برای شمارش تا 999 باید تا 65535 گنجایش داشته باشد char show[3];//این متغییر از نوع رشته ای با طول 3 برای نمایش یک عدد 3 رقمی تعریف میشود lcd_init(16);//پیکره بندی صفحه نمایش و بردن مکان نما به خط اول و ستون اول while (1) { lcd_clear(); //تازه سازی صفحه نمایش lcd_putsf("counter:");//درج مستقیم عبارت مورد نظر بر روی ال سی دی for(count=0;count<1000;count++)// حلقه شمارشی برای شمارش اعداد تا 999 { itoa(count,show);//تبدیل یک متغییر عددی معمولی به یک متغییر رشته ایی lcd_puts(show);//نمایش رشته مورد نظر بر روی ال سی دی delay_ms(1000);//تااخیر 1 ثانیه ایی lcd_gotoxy(8,0);//قرار دادن مکان نما در مکان مورد نظر برای تغییر اعداد بعد از یک ثانیه } } }
توابع کتابخانه ای stdio.h: این کتابخانه همانند کتابخانه قبلی دارای توابع کاربردی زیادی می باشد که با اکثر آنها در قسمت ارتباط سریال در جلسات آینده آشنا خواهیم شد . اما برای کارکردن با lcdها یک تابع بسیار قدرتمند این کتابخانه دارد که در زیر معرفی شده است. 1. voidsprintf(char *str, flash char *str, arg1, arg2 , . . . ); در آرگومان این تابع ابتدا نام مقصد که یک متغییر رشته ایی باید باشد ,ذکر میگردد . سپس قالب مورد نظرمان برای نمایش و در آخر نام متغییر هایی که محتوایشان باید به اسکی تبدیل شود , می آید برای اینکه تعیین کنید متغییر مورد نظر با چه فرمتی در قالب نمایش ظاهر شود ,از جدول صفحه بعد کمک بگیرید
تنظیمات تابع sprintfدر:codevision • نکته:هرگاه در نرم افزار codevisionavr از توابع printfیا sprintfاستفاده کنیم باید ویژگی آن را تعیین نماییم .در ضمن این توابع حجم کد تولیدی برنامه را زیاد می کنند.
Example-10 • برنامه مثال 9 را با تابع sprintfبه صورت ساده تر بازنویسی کنید #include <mega32.h>//معرفی تراشه مورد نظر به کامپایلر #include <alcd.h>//استفاده از کتابخانه جدید کدویژن برای ال سی دی ها #include <delay.h>//چون از تابع تاخیری استفاده میکنیم باید کتابخانه ۀن به برنامه اضافه شود #include <stdio.h>//چون از تابع پرینت استفاده میکنیم باید کتابخانه آن را نیز به برنامه اضافه کنیم void main(void) { در این مکان متغییر های محلی تعریف میشوند unsigned int count;//این متغییر برای شمارش تا 999 باید تا 65535 گنجایش داشته باشد char show[3];//این متغییر از نوع رشته ای با طول 3 برای نمایش یک عدد 3 رقمی تعریف میشود lcd_init(16);//پیکره بندی صفحه نمایش و بردن مکان نما به خط اول و ستون اول while (1) { for(count=0;count<1000;count++)//حلقه شمارشی برای شمارش اعداد تا 999 { sprintf(show,"counter:%u",count);//دستورات قالب بندی رشته ها برای چاپ عبارات مورد نظر در خروجی lcd_clear();//تازه سازی صفحه نمایش lcd_puts(show);//چاپ متغییر رشته ای بر روی ال سی دی delay_ms(1000);//تاخیر ا ثانیه ایی } } }
تنظیمات CodeVision AVR: در قسمت NewProject بوسیله CodeWizard:
نمایش کارکتر های استاندارد • منظور از کارکتر استاندارد، کارکتر هایی است که برای LCD های کارکتری از قبل تعریف شده اندکه تمامی انها مطابق جدول صفحه بعد می باشند. • به ازای هر کارکتر در سطر و ستون مربوطه یک عدد 4بیتی نوشته شده که اگر این اعداد را طوری کنار هم قرار دهیم که 4 بیت کم ارزش و پر ارزش به ترتیب متناظر با سطر و ستون کارکتر مورد نظر باشد می توانید از فرمت زیر برای نمایش آن کارکتر بر روی LCD استفاده کنید • \xعدد به دست امده به صورت هگزادسیمال • مثال:فرض کنید متغیر res مقدار یک مقاومت بر حسب اهم را به صورت یک عدد صحیح بیان کند.در اینصورت برای نمایش مقدار مقاومت همراه با واحد(Ω) در دنباله آن چنین می نویسیم: • Sprintf(str,”resistance=%u\xf4”,res);
Practice -3 1-برنامه ایی بنوسید که اسم خود را بر روی lcdکارکتری نوشته و ان را هر ms 200 به سمت چپ شیفت دهد 2-برنامه ایی بنوسید که به صورت نزولی شمار از 100000 تا 10 را شمارش کندو حاصل را بر روی lcdنمایش دهد .فاصله شمارش را یک ثانیه در نظر بگیرید 3-برنامه ایی بنوسید که با زدن یک کلید دلخواه به اسم up مقدار شمارشی یک واحد افزایش یابد و با زدن کلید دلخواه به نام down حاصل یک واحد کاهش یابد و حاصل روی LCD متصل یه پورت D نمایش داده شود 4-برنامه ایی بنوسید که حاصل مقدار باینری پورت Aرا خوانده و بر روی LCD متصل شده به پورتB نمایش دهد