با ما همراه باشید

امبدد

کنترل موتور DC با رزبری پای (Raspberry Pi)

منتشر شده

در

رزبری پای (Raspberry Pi) یک سیستم مبتنی بر پردازنده معماری ARM برای مهندسان الکترونیک و دوستداران الکترونیک است.  PI  یکی از معتبرترین سیستم های توسعه پروژه است که در حال حاضر وجود دارد. با سرعت پردازنده بالاترو ۱ گیگابایت رم، PI  می تواند برای بسیاری از پروژههای پرطرفدار مثل پردازش تصویر و اینترنت اشیاء استفاده شود.

برای انجام هر یک از پروژه های با مشخصات بالا، نیاز به درک عملکرد اساسی PI است.ما در این آموزشها تمامی ویژگیهای اساسی رزبری پای (Raspberry Pi ) را پوشش خواهیم داد. در هر آموزش ما یکی از توابع PI را موردبحث قرار خواهیم داد. در پایان مجموعه آموزشی، شما قادر خواهید بود تا پروژه های خودرا با کیفیت بالا انجام دهید. برای شروع کار پیکربندی رزبری پای(Raspberry Pi)  و خود رزبری پای (Raspberry) بررسی کنید تا آشنایی داشته باشید.

ما داریم در مورد آموزش های قبلی که در مورد  LEDچشمک زن، کلید های واسط و مولد PWM بوده بحث کرده ایم. در این آموزش ما سرعت موتور DC با استفاده از رزبری پای (Raspberry Pi) و  روش PWM کنترل خواهیم کرد. PWM (مدولاسیون عرض پالس) یک روش مورد استفاده برای گرفتن ولتاژ متغیر از منبع تغذیه ثابت است. ما در مورد PWM در آموزش های قبلی بحث شده است. 

۴۰ پایه خروجی GPIO در رزبری پای۲ (Raspberry Pi 2) وجود دارد. اما از ۴۰ پایه، تنها ۲۶ پایه GPIO2 ) GPIO بهGPIO27) را می توان برنامه ریزی کرد. بعضی از این پایه ها برخی از توابع خاص را انجام می دهند. با GPIO ویژه کنار گذاشته شده است، ما ۱۷ GPIO باقی مانده است داریم. برای دانستن بیشتر در مورد پایهGPIO، مراجعه کنید به پروژه: چراغ LED با رزبری پای

هر یک از این ۱۷ پایه GPIO می تواند حداکثر ۱۵mA راعبور دهد. و مجموع جریان از تمام پایه ها GPIO نمی تواند بیش از ۵۰mA باشد. بنابراین ما می توانیم به طور متوسط از هر یک از این پایه ها GPIO حداکثر ۳mA داشته باشیم. بنابراین،نباید این موارد دستکاری کرد، مگر اینکه شما بدانید که چه کاری انجام می دهید. 

پایه های خروجی تغذیه + ۵V (پایه های ۲ و ۴) و ۳٫۳V (پایه های ۱ و ۱۷) در بورد برای اتصال سایر ماژول ها و سنسورها وجود دارد. این رله تغذیه به موازات قدرت پردازنده متصل است. بنابراين رسيدن جريان زياد از اين رله تغذیه بر پردازنده اثر مي گذارد. یک فیوز در بورد PI است که به یک باره شما درخواست بار بالا داشته باشید. شما می توانید ۱۰۰mA را از رله + ۳٫۳V به طور ایمن استفاده کنید.ما در اینجا درباره این صحبت میکنیم؛ ما در حال اتصال موتور DC به ۳٫۳ ولت هستیم. با توجه به محدودیت قدرت، ما فقط می توانیم موتور کم قدرت در اینجا وصل کنیم، اگر بخواهید موتور قدرت بالا را بکار ببرید، در نظر بگیرید که آن را از یک منبع تغذیه جداگانه وصل کنید. 

اجزای مورد نیاز:

در اینجا ما از Raspberry Pi 2 مدل B باRaspbian Jessie OS استفاده می کنیم. پیش نیازهای سخت افزار و نرم افزار اصلی مورد بحث قرار گرفته است، شما میتوانید در مقدمه  رزبری پای (Raspberry Pi)، به غیر از آنچه ما نیازداریم، نگاه کنید:

اتصال پین ها

مقاومت ۲۲۰Ω  یا ۱KΩ  3(عدد)

موتور کوچک  DC

دکمه ها (۲عدد)

ترانزیستور ۲N2222

دیود ۱N4007

خازن ۱۰۰۰uF

فیبر آزمایشی (Bread Board) 

توضیح مدار:

همانطور که قبلا گفته شد، ما نمیتوانیم بیش از ۱۵ میلی آمپر از هر پایه GPIO بکشیم وموتور DC دارای بیش از ۱۵ میلی آمپر باشد، بنابراین PWM تولید شده توسط  رزبری پای (Raspberry Pi) نمیتواند مستقیما به موتور DC منتقل شود. بنابراین اگرموتور را مستقیما برای کنترل سرعت به رزبری پای  وصل کنیم، بورد ممکن است به طور دائمی آسیب ببیند. بنابراین ما قصد داریم از ترانزیستور (NPN (2N2222 به عنوان یک دستگاه سوئیچینگ استفاده کنیم. این ترانزیستور در اینجا نقش درایور موتور DC با توان بالا با در نظر گرفتن سیگنال PWM از PI داراست. در اینجا باید توجه داشته باشید که اتصال اشتباه ترانزیستور ممكن است بورد به شدت بار بكشد. 

بنابراین در حالی که موتور سوییچ می کند ، ما شاهد اسپک القایی هستیم که از ویژگی های یک موتور القایی است.  اسپک ترانزیستور را به شدت حرارت می دهد، بنابراین ما از دیود (۱N4007) برای حفاظت از ترانزیستور در برابراسپکتیو القایی استفاده خواهیم کرد.

به منظور کاهش نوسانات ولتاژ، ما یک خازن ۱۰۰۰uF در منبع تغذیه همان گونه در  شکل مدارنشان داده شده است متصل می کنیم.



توضیح کار:
هنگامی که همه چیز را همان گونه که در شماتیک مدار است متصل کردیم، می توانیم PI را روشن کنیم تا برنامه را در PYHTON بنویسیم.
ما درباره چند دستور که ما در برنامه Python استفاده می کنیم صحبت خواهیم کرد.
ما قصد داریم فایل GPIO را از کتابخانه وارد کنیم، در زیر توابع ما را قادر می سازد تا پایه GPIO از PI را برنامه ریزی کنیم. ما همچنین “GPIO” را به “IO” تغییر نام دادیم، بنابراین در برنامه هر زمان که بخواهیم به پایه GPIO مراجعه کنیم، کلمه “IO” را استفاده خواهیم کرد.

import RPi.GPIO as IO

گاهی اوقات، زمانی که ما در حال تلاش برای استفاده از پایه GPIO هستیم، ممکن است برخی از توابع دیگر را اجرا کنیم. در این صورت، هنگام اجرای برنامه، هشداری دریافت خواهید کرد. دستور زیر به PI می گوید هشدارها را نادیده بگیرد و با برنامه ادامه دهد.

(IO.setwarnings(False

ما می توانیم پایه های GPIO از PI را با شماره پایه در بورد و یا شماره تابع آنها بیان کنیم. مانند ‘پایه ۳۵’ در بورد ‘GPIO19′ است. بنابراین ما در اینجا می گوییم می خواهیم پایه ’۳۵’ یا ’۱۹’ نشان دهیم.


(IO.setmode (IO.BCM

ما GPIO19 (یا پایه ۳۵) را به عنوان پایه خروجی تنظیم می کنیم. ما خروجی PWM را از این پایه دریافت خواهیم کرد.

(IO.setup(19,IO.IN

پس از تنظیم پایه به عنوان خروجی، ما نیازمند این هستیم که پایه را به عنوان پایه خروجی PWM تنظیم کنیم،


(p = IO.PWM(output channel , frequency of PWM signal

دستور بالا برای تنظیم کانال و همچنین تنظیم فرکانس سیگنال PWM است. ‘p’ در اینجا یک متغیر است که می تواند هر چیزی باشد. ما از GPIO19 به عنوان کانال خروجی PWM استفاده می کنیم. “فرکانس سیگنال PWM” 100 انتخاب شده است، چرا که ما نمی خواهیم چشمک زدن LED را ببینیم.
دستور زیر برای شروع تولید سیگنال PWM استفاده می شود: DUTYCYCLE برای تنظیم نسبت روشن شدن است، ۰ یعنی LED در ۰٪ از زمان روشن خواهد شد، ۳۰ یعنی LED در ۳۰٪ از زمان روشن خواهد شد و ۱۰۰ به طور کامل روشن خواهد شد.


(p.start(DUTYCYCLE

در صورتی که حالت در پرانتز درست باشد، جمله داخل حلقه یک بار اجرا خواهد شد. بنابراین اگر پایهGPIO از ۲۶ LOW باشد، جملات داخل حلقه IF یک بار اجرا می شود. اگر پایه GPIN از ۲۶ LOW نشود، جملات داخل حلقه IF اجرا نخواهد شد.


:(if(IO.input(26) == False

حالت ۱: حلقه بی نهایت استفاده می شود. با این دستور جملات در داخل این حلقه به طور مداوم اجرا خواهد شد.
ما تمام دستورات مورد نیاز برای دستیابی به کنترل سرعت داریم.
پس از نوشتن برنامه و اجرای آن، همه اینهایی که در قسمت چپ است، کنترل کردن را عملیاتی می کنند. ما دو دکمه متصل به PI داریم؛ یکی برای افزایش سیکل سیگنال PWM و دیگری برای کاهش میزان سیکل سیگنال PWM است. با فشار دادن یک دکمه، سرعت موتور DC افزایش می یابد و با فشار دادن دکمه دیگر سرعت موتور DC کاهش می یابد. اینگونه ما به کنترل سرعت موتور DC توسط رزبری پای (Raspberry Pi) دست یافته ایم.

همچنین بررسی کنید:

 کنترل سرعت موتور DC
 کنترل موتور DC با استفاده از آردوینو

کد پروژه:

import RPi.GPIO as IO          # calling header file which helps us use GPIO’s of PI

import time                             # calling time to provide delays in program

IO.setwarnings(False)            #do not show any warnings

x=0                                         #integer for storing the duty cycle value

IO.setmode (IO.BCM)           #we are programming the GPIO by BCM pin numbers. (PIN35 as‘GPIO19’)

IO.setup(13,IO.OUT)         # initialize GPIO13 as an output.
IO.setup(19,IO.IN)             # initialize GPIO19 as an input.
IO.setup(26,IO.IN)             # initialize GPIO26 as an input.

p = IO.PWM(13,100)        #GPIO13 as PWM output, with 100Hz frequency
p.start(0)                            #generate PWM signal with 0% duty cycle

while 1:                             #execute loop forever

  p.ChangeDutyCycle(x)                #change duty cycle for changing the brightness of LED.
      if(IO.input(26) == False):          #if button1 is pressed
          :(if(x<50
             x=x+1                               #increment x by one if x<50
             time.sleep(0.2)                  #sleep for 200ms     if(IO.input(19) == False):         #ifbutton2 is pressed
           :(if(x>0
              x=x-1                              #decrement x by one if x>0
     

time.sleep(0.2)                #sleep for 200ms

       برای دانلود فایل های این پروژه اینجا کلیک کنید.

ادامه مطلب
1 دیدگاه

1 دیدگاه

یک پاسخ بگذارید

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

ATMEGA32

ارتباط صفحه کلید ۴در۴ با میکروکنترلر ATmega32

منتشر شده

در

توسط

ارتباط صفحه کلید ۴ در ۴ با میکروکنترلر AVR  (ATmega32)

در این آموزش، ما یک صفحه کلید ۴ در ۴ (۱۶ کلیدی) به میکروکنترلر ATMEGA32A متصل می کنیم. ما می دانیم که صفحه کلید یکی از مهم ترین ابزار ورودی مورد استفاده در پروژه های الکترونیک است. صفحه کلید یکی از ساده ترین راه ها برای دادن دستورات یا دستورالعمل ها به یک سیستم الکترونیکی است.

قطعات مورد نیاز

سخت افزار:

ATMEGA32

منبع تغذیه (۵V)

پروگرامر AVR-ISP

JHD_162ALCD  (۲*۱۶) LCD

خازن ۱۰۰uF

خازن ۱۰۰nF

مقاومت ۱۰ کبلو اهم ۸ عدد

نرم افزار:

Atmel studio 6.1 یا  Atmel studio 6.2

progisp  یا  flash magic

 

شمایل مدار و توضیح کار

در این مدار پورت B  از ATMEGA32 به عنوان پورت داده به  LCD متصل است. در اینجا باید یادآور شوم که با تغییر بایت های فیوز  اتصال JTAG را در پورت C از ATMEGA غیرفعال می کنیم، اگر کسی بخواهد از پورت C  به عنوان یک پورت ارتباطی معمول استفاده کند . در ۲ LCD در ۱۶ که ۱۶پایه دارد بیشترین پایه داراست بخاطر این هست که می شود نور پشت زمینه (نور بک گراند) هم داشت ، اگر نور پشت زمینه وجود نداشت ۱۴ پایه هستند. می توانید پایه های نور پشت را به برق وصل یا خاموش کنید. در حال حاضر در ۱۴ پایه ۸ پایه داده (۷-۱۴ ) یا )۰-D7))، ۲ پایه برای منبع تغذیه (۱ و ۲ یا VSS و VDD یا gnd + 5v)، پین ۳ برای کنترل کنتراست (VEE- کنترل چگونگی ضرب کردن کاراکترها ) و ۳ پین کنترل (RS & RW & E)هستند.

در این مدار، شما می توانید ببینید که من فقط دو پایه برای کنترل گرفتم، این انعطاف پذیری، بیت کنتراست و READ / WRITE هست که اغلب استفاده نمی شود، بنابراین آنها می توانند به زمین متصل شوند. این باعث می شود که ال سی دی در بالاترین کنتراست و حالت خواندن قرار گیرد. ما فقط نیاز به پایه های ENABLE و RS برای کنترل داریم تا بتواند کارکترها و داده ها بر این اساس ارسال کند.

اتصالاتی که برای LCD انجام می شود، در زیر آمده است:

پایه ۱ یا VSS به زمین

پایه ۲ یا VDD یا VCC به منبع تغذیه ۵V

پایه ۳ یا VEE به زمین (حداکثر کنتراست می دهد برای یک مبتدی بهتر است که پایه ۳ به زمین وصل کند)

پایه ۴  یا  RSبه پورتD6  از میکروکنترلر

پایه ۵  یا RW (خواندن / نوشتن) به زمین (ال سی دی در حالت خواندن قرار می دهد و ارتباطات را برای کاربر آسان می کند)

پایه ۶ یا E ((Enable به پورت D5 از میکروکنترلر

پایه ۷ یا D0  به  پورت B0  از میکروکنترلر

پایه ۸ یا D1  به  پورت B1  از میکروکنترلر

پایه ۹ یا D2  به  پورت B2  از میکروکنترلر

پایه ۱۰ یا D3  به  پورت B3  از میکروکنترلر

پایه ۱۱ یا D4  به  پورت B4  از میکروکنترلر

پایه ۱۲ یا D5  به  پورت B5  از میکروکنترلر

پایه ۱۳ یا D6  به  پورت B6  از میکروکنترلر

پایه ۱۴ یا D7  به  پورت B7  از میکروکنترلر

 

در مدار شما می توانید ببینید که ما از ارتباط ۸ بیتی (D0-D7) استفاده کرده ایم، اما این اجباری نیست، ما می توانیم ارتباط ۴ بیتی (D4-D7) نیز استفاده کنیم، اما برنامه با ارتباط ۴ بیتی پیچیده می شود. بنابراین با مشاهده گذرا جدول بالا، ما ۱۰ پایه ال سی دی را به کنترلر متصل می کنیم که در آن ۸ پایه، پایه داده و ۲ پایه برای کنترل است.

حالا در مورد صفحه کلید صحبت می کنیم، صفحه کلید چیزی جز کلید های چندگانه نیست. دکمه ها در یک فرم چندمنظوره برای کاهش استفاده از پایه های به یک سیستم کنترل (کنترلر) متصل می شوند.

در نظر داشته باشید که ما یک صفحه کلید ۴ در ۴ داریم، در این صفحه کلید ما ۱۶ دکمه داریم، در موارد عادی ۱۶ پایه کنترل کننده برای ۱۶ دکمه نیاز هست اما این مد نظر سیستم کنترل نیست. استفاده از این فرم چندگانه می تواند تعداد پایه های متصل شده به کنترل کننده کاهش یابد.

برای مثال ما فکر میکنیم که ۱۶ دکمه داریم و می خواهیم آن را به یک کنترل کننده وصل کنیم تا یک صفحه کلید ایجاد کنیم، این کلیدها به شکل زیر نشان داده شده است:

این دکمه ها توسط ستون های معمولی به شکل زیر نشان داده شده است:

همانطور که در شکل نشان داده شده، انتهای هر چهار دکمه ادامه می یابد تا آنرا به شکل یک ستون تبدیل کند، و بنابراین برای ۱۶ کلید، ما چهار ستون داریم.

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

همانطور که در شکل نشان داده شده است، برای ۱۶ کلید ما چهار ردیف به صورتی که در شکل داریم نشان داده شده است.

حالا زمانی که آنها هر دو با هم ترکیب شوند ما چیزی شبیه به مدار زیر می بینیم:

در اینجا ما ۱۶ کلید را در یک فرم چندتایی متصل کرده ایم تا پایه های مورد استفاده کنترلر را کاهش دهیم.

در مقایسه با اولین مورد از اتصال ۱۶ کلیدبه کنترلر ما ۱۶ پایه  میکروکنترلر نیاز داریم اما اکنون بعد از چندتایی کردن، ما فقط ۸ پایه از کنترل کننده برای اتصال ۱۶ کلید نیاز داریم.

به طور معمول این چیزی است که در داخل صفحه کلید ارائه شده است:

همانطور که در شکل بالا نشان داده شده است، ۱۶ کلید در صفحه کلید بالا وجود دارد و هر یک از این کلید ها پیکربندی یک دکمه در کی پد را نشان می دهد. و همچنین اتصال ۸ پایه که در شکل بالا وجود دارد نماد اتصال کی پد است.

اکنون برای کار:

صفحه کلید در اینجا دارای چهار ستون و چهار ردیف است، برای اینکه فشار دکمه توسط میکروکنترلر تشخیص داده شود، ما از روش مرجع متقابل استفاده می کنیم. در اینجا ابتدا تمام ستون ها یا تمام ردیف ها را به vcc وصل می کنیم، بنابراین اگر ردیف ها به vcc مشترک وصل شوند، ما ستون ها را به عنوان ورودی ها به کنترل کننده می گیریم.

حالا اگر دکمه  ای را بفشاریم به  صورت شکل زیر نشان داده شده است، می باشد:

پس از آن یک جریان از میان مدار مانند شکل عبور می کند:

بنابراین ما برای C1 ولتاژ داریم وقتی که یک دکمه را به فشاریم. در این لحظه ما قصد داریم که پورت های ورودی و ولتاژ دار تغییر دهیم. می خواهیم ستون ها را ولتاژ دار کنیم و ردیف ها را به عنوان ورودی استفاده کنیم. با این کار جریان به صورت زیر نشان داده می شود:

بنابراین ردیف R1 دارای ولتاژ هست.

در حال حاضر برای مورد اول C1 ولتاژ دارد و برای مورد دوم R1 نیز دارای ولتاژهست، بنابراین با استفاده از موقعیت ماتریسی دکمه ها یعنی شماره یک فشار داده شده است.

اگر دکمه دوم فشار داده شود، ما C1 به عنوان ستون داریم که دارای ولتاژ منطقی یک (+۵ ولت) است، R2 نیز ستون مشترک قرار می گیرد، بنابراین ما C1 و R2 خواهیم داشت، از این رو موقعیت ماتریسی دکمه دوم را داریم.

سوال اینجاست که چگونه ما قرار هست که برنامه ای بنویسیم، ما هشت پایه صفحه کلید را به هشت پایه کنترلر وصل می کنیم.

 

و برای شروع ما چهار پایه کنترل کننده را برای تغذیه دادن به چهار ردیف صفحه کلید وصل می کنیم، در این حال چهار پایه دیگر به عنوان ورودی گرفته می شود. هنگامی که دکمه  ستون مربوطه فشرده می شود پس پین کنترل کننده کشیده می شود، این کار برای شناسایی تغییر ورودی به تغذیه و توان ورودی است، بنابراین ما به عنوان ورودی ردیف در نظر می گیریم.

با این کار، ما دکمه ی مورد نظر کاربر که فشار داده بدست می آوریم. . این آدرس ماتریس به شماره مربوطه اش هدایت می شود و این شماره در LCD نشان داده می شود.

عملکرد ارتباط صفحه کلید با میکروکنترلر AVR  به صورت گام به گام در کد C ، در زیر توضیح داده شده است. همچنین می توانید ارتباط صفحه کلید با میکروکنترلر ۸۰۵۱  بررسی کنید.

 

برنامه

#include <avr/io.h>

//header to enable data flow control over pins

                #define F_CPU 1000000

//telling controller crystal frequency attached

                #include <util/delay.h>

//header to enable delay function in program

                #define    E   ۵

//giving name “enable”  to 5th pin of PORTD, since it Is connected to LCD enable pin

                #define RS  ۶

//giving name “registerselection” to 6th pin of PORTD, since is connected to LCD RS pin

                void send_a_command(unsigned char command);

                void send_a_character(unsigned char character);

               void send_a_string(char *string_of_characters);

                int main(void)

                {

                                DDRB = 0xFF;

                                      //putting portB and portD as output pins

                                DDRD = 0xFF;

                                _delay_ms(50);//giving delay of 50ms

                                int key=0;//allocating integer to reset the LCD once it reaches its display limit

                                int keypressed=0;//integer for storing matrix value

                                send_a_command(0x01); //Clear Screen 0x01 = 00000001

                                _delay_ms(50);

                                send_a_command(0x38);//telling lcd we are using 8bit command /data mode

                                _delay_ms(50);

                                send_a_command(0b00001111);//LCD SCREEN ON and courser blinking

                                send_a_string(“PRESS A KEY”);//displaying a string

                                send_a_command(0x80 + 0x40 +0);// moving courser to second line of LCD

                                                DDRA=0xF0;//taking column pins as input and row pins as output

                                                _delay_ms(1);

                                                PORTA=0x0F;// powering the row ins

                                                _delay_ms(1);

                                while(1)

                {

                       if (PINA!=0b11110000)//in any of column pins goes high execute the loop

                                {

                                                _delay_ms(5);

                                                keypressed = PINA;//taking the column value into integer

                                                DDRA ^=0b11111111;//making rows as inputs and columns as ouput

                                                _delay_ms(1);

                                                PORTA ^= 0b11111111;//powering columns

                                                _delay_ms(1);

                                                keypressed |=PINA;taking row value and OR ing it to column value

                                                if (keypressed==0b00010001)

                                                {

                                                                send_a_string(“1”);//if row1 and column1 is high show “۱”

                                                                                key++;

                                                }

                                                if (keypressed==0b00010010)

                                                {

                                                                send_a_string(“4”);// if row1 and column2 is high show “۴”

                                                                                key++;

                                                }

                                                if (keypressed==0b00010100)

                                                {

                                                                send_a_string(“7”);// if row1 and column3 is high show “۷”

                                                                                key++;

                                                }

                                                if (keypressed==0b00011000)

                                                {

                                                                send_a_string(“*”);//if row1 and column4 is high show “*”

                                                                                key++;

                                                }

                                                if (keypressed==0b00100001)

                                                {

                                                                send_a_string(“2”);// if row2 and column1 is high show “۲”

                                                                key++;

                                                }

                                                if (keypressed==0b00100010)

                                                {

                                                                send_a_string(“5”);// if row2 and column2 is high show “۵”

                                                                key++;

                                                }

                                                if (keypressed==0b00100100)

                                                {

                                                                send_a_string(“8”);// if row2 and column3 is high show “۸”

                                                                key++;

                                                }

                                                if (keypressed==0b00101000)

                                                {

                                                                send_a_string(“0”);// if row2 and column4 is high show “۰”

                                                                key++;

                                                }

                                                if (keypressed==0b01000001)

                                                {

                                                                send_a_string(“3”);

                                                                key++;

                                                }

                                                if (keypressed==0b01000010)

                                                {

                                                                send_a_string(“6”);

                                                                key++;

                                                }

                                                if (keypressed==0b01000100)

                                                {

                                                                send_a_string(“9”);

                                                                key++;

                                                }

                                                if (keypressed==0b01001000)

                                                {

                                                                send_a_string(“#”);

                                                                key++;

                                                }

                                                if (keypressed==0b10000001)

                                                {

                                                                send_a_string(“A”);

                                                                key++;

                                                }

                                                if (keypressed==0b10000010)

                                                {

                                                                send_a_string(“B”);

                                                                key++;

                                                }

                                                if (keypressed==0b10000100)

                                                {

                                                                send_a_string(“C”);

                                                                key++;

                                                }

                                                if (keypressed==0b10001000)

                                                {

                                                                send_a_string(“D”);

                                                                key++;

                                                }

                                                keypressed=0;//after showing integer erasing the row column memory

                                                DDRA ^=0b11111111;//shifting input and power port

                                                _delay_ms(1);

                                                PORTA ^= 0b11111111;//powering row pins of keypad

                                                _delay_ms(220);

                                }

                                if (key==16)//if 16 characters are shown on LCD

                                {

                                                send_a_command(0x01);//clear lcd

                                                send_a_string(“PRESS A KEY”);//display string

                                                send_a_command(0x80 + 0x40 +0);//move courser to second line.

                                                key=0;

                                }

                }

                }

                void send_a_command(unsigned char command)

                {

                                PORTA = command;

                                PORTD &= ~ (1<<RS); //putting 0 in RS to tell lcd we are sending command

                                PORTD |= 1<<E; //telling lcd to receive command /data at the port

                                _delay_ms(50);

                                PORTD &= ~1<<E;//telling lcd we completed sending data

                                PORTA= 0;

                }

                void send_a_character(unsigned char character)

                {

                                PORTA= character;

                                PORTD |= 1<<RS;//telling LCD we are sending data not commands

                                PORTD |= 1<<E;//telling LCD to start receiving command/data

                                _delay_ms(50);

                                PORTD &= ~1<<E;//telling lcd we completed sending data/command

                                PORTA = 0;

                }

                void send_a_string(char *string_of_characters)

{

                while(*string_of_characters > 0)

                {

                                send_a_character(*string_of_characters++);

                }

}

برای دانلود فایل های این پروژه اینجا کلیک کنید.

ادامه مطلب

مطالب برتر

>