عکس پیش‌فرض نوشته

در این مطلب می خواهیم برنامه یک شمارنده قابل کنترل با قابلیت شمارش صعودی و نزولی دو رقمی را طراحی کنیم به طوری که با فشردن کلید 1 شمانده صعودی و با فشردن کلید 2 شمارنده نزولی و اگر هیچ کلیدی فشار داده نشد عمل شمارش انجام نشود و آن را به 7-seg متصل کنیم تا اعداد را نمایش دهد.

برنامه را با استفاده از نرم افزار  Bascom می نویسیم و از میکرو ATmega32 استفاده می کنیم، همچنین دو عدد 7-seg معمولی کاتد مشترک به میکرو متصل می کنیم به این صورت که هر کدام از 7-seg ها به پورت مجزا متصل می شود، این کار از جهت برنامه نویسی بسیار ساده و آسان است ولی مشکلات خود را نیز دارد. همچنین دو عدد کلید برای کنترل عمل شمارش باید به میکرو متصل شود.

مهمترین مشکل، این است که تعداد زیادی از پایه های میکرو اشغال می شود و استفاده از میکرو برای کارهای سنگین و پیچیده مشکل خواهد شد.

مطابق همیشه اولین کاری که باید قبل از برنامه نویسی انجام داد بستن سخت افزار است. بنابراین برای این کار ما یکی از 7-seg ها را به پورت A و دیگری را به پورت B متصل می کنیم.(این کار اختیاری است و شما می توانید 7-seg ها را به پورت دیگری وصل کنید.) و پایه مشترک

ترتیب اتصال پایه ها مطابق مطالب قبلی می باشد. بنابراین به این صورت که پایه a نمایشگر اول (یکان) به PortA.0  و به همین ترتیب پایه g نمایشگر اول (یکان) به PortA.6 میکرو متصل می کنیم همچنین پایه a نمایشگر دوم (دهگان) به PortB.0 و به همین ترتیب پایه g نمایشگر دوم (دهگان) به PortB.6 میکرو متصل می شود.

به طور خلاصه رقم یکان عددی که میخواهیم نمایش دهیم باید بر روی پورت A ارسال شود و رقم دهگان آن بر روی پورت B ارسال شود.

برنامه نویسی شمارنده دو رقمی در AVR

یک سری از دستورات مربوط به پیکربندی می باشد که نوع میکرو و فرکانس کاری آن را مشخص می کند.

همچنین باید در این قسمت دو پورت مربوط به 7-seg را به عنوان خروجی تعریف نمود.

و دو پایه از میکرو با باید به عنوان کلید تعریف کنیم. (همانطور که می دانید کلید یک وسیله ورودی به میکرو محسوب می شود.)

$regfile="m32def.dat"
$crystal=8000000
config portA=OUTPUT
config portB=OUTPUT
config pinC.0=INPUT
config pinC.1=INPUT

در قسمت بعدی متغیرها را تعریف و در صورت لزوم مقداردهی می کنیم.

یک متغیر به نام x تعریف کرده ایم که همان عدد ما است و متغیر z نیز به عنوان متغیر میانی می باشد.

Dim x as Byte
Dim z as Byte
Dim yekan as Byte
Dim dahgan as Byte
x=0

شروع برنامه اصلی و انجام شمارش و نمایش آن

Do
If pinc.0=1 then
	Incr x
	Wait 1
	If x>99 then x=0
End if

در شرط اول وضعیت (صفر یا یک) بودن کلید اول را بررسی می کند و اگر کلید فشار داده شده بود وارد شرط می شود.

بعد از ورود به شرط متغییر x را یک واحد افزایش می دهد و بررسی می کند که اگر عدد بزرگتر از 99 شد آن را به مقدار 0 برگرداند.

سپس برای مدت زمان 1 ثانیه صبر می کند و از حلقه خارج می شود.

If pinc.1=1 then
	decr x
	Wait 1
	If x>99 then x=99
End if

در شرط دوم وضعیت (صفر یا یک) بودن کلید دوم را بررسی می کند و اگر کلید فشار داده شده بود وارد شرط می شود.

بعد از ورود به شرط متغییر x را یک واحد کاهش می دهد و بررسی می کند که اگر عدد بزرگتر از 99 شد آن را به مقدار 99 برگرداند. دقت کنید که ما متغییر را نوع byte تعریف کرده ایم پس زمانی که مقدار x به صفر می رسد و ما یک واحد از آن کم می کنیم، مقدار متغییر برابر با 255 خواهد شد و به دلیل اینکه شمارنده 2 رقمی است باید مقدار متغییر را به 99 تغییر دهیم.

سپس برای مدت زمان 1 ثانیه صبر می کند و از حلقه خارج می شود.

در ادامه متغییر x را نمایش می دهد

   dahgan = x / 10
   z = dahgan * 10
   yekan = x - z

   portA=lookup(yekan,dta)
   portB=lookup(dahgan,dta)

Loop
End

برای جداسازی رقم یکان از دهگان روش های مختلفی وجود دارد ولی یکی از ساده ترین روش ها، روشی است که ما در اینجا از آن استفاده کرده ایم به صورتی که ابتدا عدد را بر 10 تقسیم می کنیم و در متغیر دهگان ذخیره می کنیم(توجه داشته باشید، زمانی که عدد بر 10 تقسیم می شود قسمت اعشاری دارد ولی به دلیل اینکه ما متغیر dahgan را از نوع بایت(byte) تعریف کرده ایم قسمت اعشاری عدد را حذف و فقط قسمت صحیح عدد تقسیم شده را در داخل متغیر dahgan ذخیره می کند.)

سپس متغیر dahgan را در 10 ضرب و سپس حاصل را از عدد اصلی کم می کنیم.

به طور مثال زمانی که شمارنده به 57 می رسد متغیرها به صورت زیر مقدار دهی می شوند: x=57 و dahgan=5 و z=50 و yekan=7

و در نهایت جدول دیتای خروجی نوشته می شود.

dta:
Data &B00111111,&B00000110,&B01011011,&B01001111,&B01100110,&B01101101,&B01111101,&B00000111,&B01111111,&B01101111