• Touch Keypad Interfacing with ATmega32 Microcontroller

QC

Touch Keypad Interfacing with ATmega32 Microcontroller

 Touch Keypad Interfacing with ATmega32 Microcontroller


Trong hướng dẫn này, chúng ta sẽ giao diện bàn phím cảm ứng 4x2 (8 phím) với vi điều khiển ATMEGA32A. Chúng ta đều biết bàn phím là một trong những thiết bị đầu vào quan trọng nhất được sử dụng trong kỹ thuật điện tử. Mô-đun này không có các phím thực tế, nhưng có các miếng đệm kim loại điện dung được thiết kế đặc biệt và các miếng đệm này rất nhạy. Vì vậy, khi một người tiếp xúc với một trong các tấm đệm, sẽ có sự thay đổi điện dung trong vòng lặp tương ứng và sự thay đổi này sẽ được cảm biến bởi điện tử điều khiển trong mô-đun. Khi một phản ứng với chạm, chân đầu ra của pad tương ứng sẽ tăng cao.


Đối với bàn phím cảm ứng tám phím, chúng ta sẽ có tám đầu ra. Mặc dù có các tính năng khác với mô-đun này, chúng tôi sẽ không thảo luận chúng ở đây.

Components Required

Hardware: ATMEGA32 microcontroller, power supply (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF capacitor, 100nF capacitor, 1KΩ resistor (2 pieces), Touch keypad module.

Software: Atmel studio 6.1 or Atmel studio 6.2, progisp or flash magic.


Circuit Diagram and Working Explanation



Trong mạch PORTB của ATMEGA32 được kết nối với màn hình LCD cổng dữ liệu. Ở đây, người ta nên nhớ vô hiệu hóa giao tiếp JTAG trong PORTC thành ATMEGA bằng cách thay đổi các byte cầu chì, nếu người ta muốn sử dụng PORTC như một cổng giao tiếp thông thường. Trong LCD 16x2 có 16 chân trên tất cả nếu có đèn nền, nếu không có đèn nền sẽ có 14 chân. Người ta có thể cấp nguồn hoặc để lại các chân đèn phía sau. Bây giờ trong 14 chân có 8 chân dữ liệu (7-14 hoặc D0-D7), 2 chân cấp nguồn (1 & 2 hoặc VSS & VDD hoặc gnd & + 5v), chân thứ 3 để điều khiển độ tương phản (VEE-điều khiển độ dày của các ký tự sẽ được hiển thị ), và 3 chân điều khiển (RS & RW & E)


Trong mạch, bạn có thể quan sát thấy tôi chỉ lấy hai chân điều khiển, điều này cho sự linh hoạt của sự hiểu biết tốt hơn, bit tương phản và READ / WRITE không được sử dụng thường xuyên nên chúng có thể được nối đất. Điều này đặt màn hình LCD ở chế độ đọc và độ tương phản cao nhất. Chúng ta chỉ cần điều khiển các chân ENABLE và RS để gửi các ký tự và dữ liệu cho phù hợp.


Các kết nối được thực hiện cho LCD được đưa ra dưới đây:


PIN1 hoặc VSS để nối đất


PIN2 hoặc VDD hoặc VCC đến nguồn + 5v


PIN3 hoặc VEE nối đất (mang lại độ tương phản tối đa tốt nhất cho người mới bắt đầu)


PIN4 hoặc RS (Lựa chọn đăng ký) đến PD6 của uC


PIN5 hoặc RW (Đọc / Ghi) nối đất (đặt màn hình LCD ở chế độ đọc giúp giảm bớt giao tiếp cho người dùng)


PIN6 hoặc E (Bật) đến PD5 của uC


PIN7 hoặc D0 đến PB0 của uC


PIN8 hoặc D1 đến PB1 của uC


PIN9 hoặc D2 đến PB2 của uC


PIN10 hoặc D3 đến PB3 của uC


PIN11 hoặc D4 đến PB4 của uC


PIN12 hoặc D5 đến PB5 của uC


PIN13 hoặc D6 đến PB6 của uC


PIN14 hoặc D7 đến PB7 của uC


Trong mạch các bạn có thể thấy chúng ta đã sử dụng giao tiếp 8bit (D0-D7) tuy nhiên đây không phải là điều bắt buộc, chúng ta có thể sử dụng giao tiếp 4bit (D4-D7) nhưng với giao tiếp 4 bit chương trình trở nên hơi phức tạp.


Vì vậy, bằng cách quan sát bảng trên, chúng ta đang kết nối 10 chân của LCD với bộ điều khiển trong đó 8 chân là chân dữ liệu và 2 chân để điều khiển.


Trước khi đi sâu hơn, cần biết rằng, mô-đun điện dung hoạt động ở hiệu điện thế 2,5V. Và dòng điện được rút ra bởi mô-đun cảm ứng cũng không cao. Vì vậy, để nhận được 2,5V cho mô-đun từ 5V, chúng tôi sẽ sử dụng mạch phân áp.


Mạch phân áp trước đây bằng điện trở được hiển thị trong hình dưới đây.


Bây giờ mạch phân áp cung cấp điện áp thấp cho các mô-đun và các tài liệu tham khảo khác. Như thể hiện trong hình, điện áp đầu ra tại điểm giữa là một tỷ số của điện trở. Vì vậy, để nhận được 2,5v từ 5V, chúng tôi sẽ sử dụng R1 = R2 = 1KΩ, do đó, đối với điện áp cung cấp là 5V, điện áp trung điểm sẽ là 2,5V đối với mặt đất. Điện áp này từ mạch phân chia được kết nối với mô-đun. Một tụ điện được kết nối trên nó để lọc các sóng hài, như được hiển thị trong sơ đồ mạch.


Cổng đầu ra của mô-đun cảm ứng được kết nối với bộ điều khiển atmega, vì vậy bất cứ khi nào chạm vào miếng đệm, đầu ra chân tương ứng sẽ tăng cao. Sự thay đổi logic này được cảm nhận bởi bộ điều khiển. Bộ điều khiển hiển thị chữ số trên màn hình LCD dựa trên chân cắm ở mức cao.


Về bảo mật, người ta có thể kéo tất cả các chân đầu ra của mô-đun xuống đất thông qua điện trở 10K, mặc dù nó không bắt buộc.


Hoạt động của GIAO DIỆN BÀN PHÍM CẢM ỨNG được giải thích tốt nhất theo từng bước của mã C được đưa ra dưới đây.



#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   5

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

#define RS  6

//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;

DDRA = 0;//porta as input

_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

while(1)

{

if (bit_is_set(PINA,0))

{

send_a_string("1");//if pin0 goes high show” 1”

_delay_ms(220);

key++;

}

if (bit_is_set(PINA,1))

{

send_a_string("2");// if pin1 goes high show” 2”

_delay_ms(220);

key++;

}

if (bit_is_set(PINA,2))

{

send_a_string("3");// if pin2 goes high show” 3”

_delay_ms(220);

key++;

}

if (bit_is_set(PINA,3))

{

send_a_string("4");// if pin3 goes high show” 4”

_delay_ms(220);

key++;

}

if (bit_is_set(PINA,4))

{

send_a_string("5");// if pin4 goes high show” 5”

_delay_ms(220);

key++;

}

if (bit_is_set(PINA,5))

{

send_a_string("6");// if pin5 goes high show” 6”

_delay_ms(220);

key++;

}

if (bit_is_set(PINA,6))

{

send_a_string("7");// if pin6 goes high show” 7”

_delay_ms(220);

key++;

}

if (bit_is_set(PINA,7))

{

send_a_string("8");// if pin7 goes high show” 8”

_delay_ms(220);

key++;

}

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

}

}




Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...