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++);
}
}