QC

Interfacing LCD with ATmega32 Microcontroller

 Interfacing LCD with ATmega32 Microcontroller - Giao diện LCD với Vi điều khiển ATmega32.


   Để thiết lập một giao tiếp tốt giữa thế giới con người và thế giới máy móc, các đơn vị hiển thị đóng một vai trò quan trọng. Và vì vậy chúng là một phần quan trọng của hệ thống nhúng. Các đơn vị hiển thị - lớn hay nhỏ, hoạt động trên nguyên tắc cơ bản giống nhau. Bên cạnh các đơn vị hiển thị phức tạp như màn hình đồ họa và trình chiếu 3D, người ta phải biết làm việc với các màn hình đơn giản như đơn vị 16x1 và 16x2. Đơn vị hiển thị 16x1 sẽ có 16 ký tự và nằm trên một dòng. Màn hình LCD 16x2 sẽ có 32 ký tự trong tổng số 16 ký tự ở dòng thứ nhất và 16 ký tự khác ở dòng thứ hai. Ở đây ta phải hiểu rằng trong mỗi ký tự có 5x10 = 50 pixel nên để hiển thị một ký tự thì tất cả 50 pixel phải hoạt động cùng nhau. Nhưng chúng ta không cần phải lo lắng về điều đó vì có một bộ điều khiển khác (HD44780) trong bộ hiển thị thực hiện công việc điều khiển các pixel. (bạn có thể nhìn thấy nó trong đơn vị LCD, nó là mắt đen ở phía sau).

Components Required

Hardware: 

ATmega32 microcontroller

Power supply (5v)

AVR-ISP Programmer

JHD_162ALCD (16x2 LCD)

100uF capacitor.

Software: 

Atmel studio 6.1

Progisp or flash magic

Circuit Diagram and Explanation


Như được hiển thị trong giao diện LCD với mạch ATmega32, bạn có thể thấy rằng PORTA 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 của 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ị ), 3 chân điều khiển (RS & RW & E)


Trong mạch trên để giao diện LCD 16x2 với vi điều khiển AVR, 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 mang lại 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 thường xuyên được sử dụng để 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 giữa vi điều khiển ATmega32 và màn hình LCD 16x2 được đưa ra dưới đây:


PIN1 hoặc VSS - mặt đất


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


PIN3 hoặc VEE - mặt đấ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ý) - PD6 của vi điều khiển


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) - PD5 của vi điều khiển


PIN7 hoặc D0 - PA0 của vi điều khiển


PIN8 hoặc D1 - PA1


PIN9 hoặc D2 - PA2


PIN10 hoặc D3 - PA3


PIN11 hoặc D4 - PA4


PIN12 hoặc D5 - PA5


PIN13 hoặc D6 - PA6


PIN14 hoặc D7 - PA7


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


Vì vậy, từ quan sát đơn thuần 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.

Working

Bây giờ để bắt đầu bạn phải biết chức năng của 10 chân của LCD 16x2 (8 chân dữ liệu + 2 chân điều khiển). 8 chân dữ liệu dùng để gửi dữ liệu hoặc lệnh tới LCD. Trong hai chân điều khiển:

1. Chân RS (Lựa chọn thanh ghi) là để cho màn hình LCD biết chúng ta đang gửi dữ liệu đến nó hay lệnh cho nó.

  Ví dụ:





Trong bảng trên, một giá trị của cổng Dữ liệu (D7-D0) là “0b0010 1000 hoặc 0x28” cho màn hình LCD hiển thị biểu tượng “(”. Trong bảng hai, giá trị giống nhau của 0x28 cho màn hình LCD biết “bạn là màn hình LCD 5x7 và hành xử như một ”, vì vậy đối với cùng một giá trị, người dùng có thể xác định hai điều, bây giờ tình huống này được hóa giải bởi chân Đăng ký Lựa chọn, nếu chân RS được đặt ở mức thấp thì LCD hiểu rằng chúng ta đang gửi lệnh. Nếu chúng ta đặt chân RS thành cao thì LCD hiểu rằng chúng ta đang gửi dữ liệu và vì vậy trong cả hai trường hợp, LCD đều tôn trọng giá trị cổng dữ liệu theo giá trị chân RS.


2. Chân E (Enable) chỉ đơn giản là để thông báo “đèn LED báo nguồn của PC”, chân này được đặt thành cao để thông báo cho màn hình LCD “nhận cổng dữ liệu dạng dữ liệu của bộ điều khiển”. Khi chân này xuống thấp sau cao, màn hình LCD sẽ xử lý dữ liệu nhận được và hiển thị kết quả tương ứng. Vì vậy, chân này được đặt ở mức cao trước khi gửi dữ liệu và được kéo xuống mặt đất sau khi gửi dữ liệu.


Bây giờ sau khi kết nối phần cứng, hãy khởi động Atmel studio và bắt đầu một dự án mới để viết chương trình, bây giờ hãy mở màn hình lập trình và bắt đầu vắt chương trình. Chương trình phải làm theo như hiển thị sau đây.


Đầu tiên, chúng tôi cho bộ điều khiển biết cổng nào chúng tôi đang sử dụng cho dữ liệu và điều khiển màn hình LCD. Sau đó, cho bộ điều khiển biết thời điểm gửi dữ liệu hoặc lệnh tương ứng bằng cách chơi với các chân RS và E.


Giải thích ngắn gọn về các khái niệm được sử dụng trong chương trình:


1. E được đặt ở mức cao (thông báo cho LCD nhận dữ liệu) và RS được đặt ở mức thấp (cho LCD biết chúng tôi đang ra lệnh)


2. Cung cấp giá trị 0x01 cho cổng dữ liệu như một lệnh để xóa màn hình


3. E được đặt ở mức cao (cho LCD nhận dữ liệu) và RS được đặt ở mức cao (cho LCD biết chúng tôi đang cung cấp dữ liệu)


4. Lấy một chuỗi ký tự gửi từng ký tự trong chuỗi một.


5. E được đặt ở mức thấp (cho LCD biết rằng chúng tôi đã gửi xong dữ liệu)


6. Sau lệnh cuối cùng, màn hình LCD kết thúc giao tiếp và xử lý dữ liệu và hiển thị chuỗi ký tự trên màn hình.


Trong kịch bản này, chúng tôi sẽ gửi các nhân vật lần lượt. Các ký tự được cấp cho màn hình LCD bằng mã ASCII (Mã tiêu chuẩn của Mỹ để trao đổi thông tin).


Bảng mã ASCII được hiển thị ở trên. Ở đây để màn hình LCD hiển thị ký tự “@”, chúng ta cần gửi một mã thập lục phân “64”. Nếu chúng tôi gửi ‘0x62’ đến màn hình LCD, nó sẽ hiển thị ký hiệu ‘>’. Như vậy, chúng tôi sẽ gửi các mã thích hợp đến màn hình LCD để hiển thị tên.



// Code for LCD Interfacing with ATmega32 AVR microcontroller

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

#define RS 6
#define E  5

void send_a_command (unsigned char command);
void send_a_character(unsigned char character);

int main(void)
{
    DDRA = 0xFF;
    DDRD = 0xFF;
    _delay_ms(50);
    send_a_command(0x01);// sending all clear command
    send_a_command(0x38);// 16*2 line LCD
    send_a_command(0x0E);// screen and cursor ON
    
     send_a_character (0x44); // ASCII(American Standard Code for Information Interchange) code for 'D'
     send_a_character (0x49); // ASCII(American Standard Code for Information Interchange) code for 'I'
     send_a_character (0x4C); // ASCII(American Standard Code for Information Interchange) code for 'L'
     send_a_character (0x49); // ASCII(American Standard Code for Information Interchange) code for 'I'
     send_a_character (0x50); // ASCII(American Standard Code for Information Interchange) code for 'P'
    
}

void send_a_command (unsigned char command)
{
    PORTA=command;
    PORTD&= ~(1<<RS);
    PORTD|= (1<<E);
    _delay_ms(50);
    PORTD&= ~(1<<E);
    PORTA =0;
}

void send_a_character (unsigned char character)
{
    PORTA=character;
    PORTD|= (1<<RS);
    PORTD|= (1<<E);
    _delay_ms(50);
    PORTD&= ~(1<<E);
    PORTA =0;
}



















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