در این پروژه قصد داریم هشت LED را به ترتیب روشن کنیم برای این کار از پورت A میکروکنترلر ATMEGA 16 استفاده کرده ایم. فرکانس کاری میکرو ۸ مگاهرتز در نظر گرفته شده است. در عکس زیر شماتیک مدار را میتوانید مشاهده کنید.
#include <mega16.h> #include <delay.h> void main(void) { int i; DDRA=0xff; PORTA=0x00; while (1) { for(i=1;i<256;i=i*2) { PORTA=i; delay_ms(1000); } } }
در این برنامه از حلقه تکرار For برای مقدار دهی به رجیستر PORT استفاده شده است. در این حلقه متغیر i از مقدار ۱ شروع میشود و تا زمانی که مقدار آن از ۲۵۶ کمتر باشد دستور i=i*2 با هر بار تکرار حلقه اجرا میشود. i=i*2 به این معنی است که مقدار i در ۲ ضرب شود و در خود i ذخیره شود. اما این دستور از کجا آمده است؟
در داخل حلقه for دستور PORTA=i قرار دارد. این دستور یعنی رجیستر PORT مقدار i را میگیرد. به جدول زیر دقت کنید.
PB0 | PB1 | PB2 | PB3 | PB4 | PB5 | PB6 | PB7 | کد هگز | دهدهی | شماره LED |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0X01 | 1 | LED0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0X02 | 2 | LED1 |
0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0X04 | 4 | LED2 |
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0X08 | 8 | LED3 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0X10 | 16 | LED4 |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0X20 | 32 | LED5 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0X40 | 64 | LED6 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0X80 | 128 | LED7 |
ملاحظه میکنید که برای روشن شدن LED ها به ترتیب میبایست رجیستر PORT به ترتیب جدول مقدار دهی شود. اگر به معادل دهدهی کدها دقت کنید خواهید دید که هر مقدار ۲ برابر مقدار قبلی است. دستور i=i*2 در واقع سازندهی این کدها است زیرا هر بار که دستور i=i*2 اجرا میشود، مقدار قبلی i دو برابر شده و پس از آن این مقدار در رجیستر PORT ریخته میشود.
اطلاعات دانلود
- حجم فایل: 20 کیلوبایت
- فرمت:RAR
باکس دانلود