KIT Thực hành, thí nghiệm AVR ATMEGA16/32 | Giao tiếp LCD 1602 trên CodeVisionAVR

Xem thêm:
KIT Thực hành, thí nghiệm AVR ATMEGA16/32

Xin chào mọi người!

Hôm nay chúng ta sẽ cùng tìm hiểu về màn hình LCD16x2 và cách thức giao tiếp với nó với vđk atmega 16 trên bộ KIT. LCD16x2 là một module được thiết kế với chip điều khiển và màn hình LCD, cùng với đèn nền... Giao tiếp với chip điều khiển thường được thực hiện theo phương pháp song song, có hai chế độ là 8bit 4bit. Chúng ta thường sử dụng chế độ 4bit vì nó tiết kiệm số lượng chân giao tiếp hơn.

Tên gọi LCD16x2 đến từ việc màn hình LCD này có khả năng hiển thị 16 ký tự trên một dòng và có tổng cộng 2 dòng. Tương tự, có màn hình 16x4, 20x4... Cần lưu ý rằng, màn hình LCD12864 sử dụng điểm ảnh pixel với 128 điểm theo chiều ngang và 64 điểm theo chiều dọc, tổ chức dưới dạng ma trận.

Trong môi trường lập trình CodeVisionAVR, đã tích hợp sẵn thư viện cho LCD, điều này giúp chúng ta chỉ cần khai báo các hàm và sử dụng chúng một cách dễ dàng. Ngoài ra, CodeVisionAVR cũng cung cấp các công cụ để thay đổi và cài đặt chân giao tiếp trong phần cài đặt của dự án. Quá trình này thường diễn ra như sau:

B1: Tạo mới Project dùng CodeWizardAVR

  • Vào File --> New --> Project

B2: Chọn Chip và xung Clock

  • Chọn thẻ Chip sau đó chọn chip ATmega16A và clock là 8MHz

B3: Cấu hình cho LCD

  • Chọn thẻ Alphanumeric LCD sau đó tick chọn Enable Alphanumeric LCD Support.

Các bạn chọn các chân giao tiếp với LCD tươg ứng, chú ý là không được sử dụng các chân đã set cho các kết nối khác, ở trên sử dụng PORTD và PORTB  của ATmega16 làm ví dụ.

B4: Bấm nút Generate program save and exit để lưu và tạo code.

Ngoài thư viện của chip ta sẽ chèn thêm 2 thư viện là alcd.hdelay.h cả hai thư viện này đều dùng cho giao tiếp LCD.

Các hàm giao tiếp LCD trong thư viện alcd.h:

lcd_init(16); //Hàm khởi tạo LCD, ta truyền tham số 16 nghĩa là khởi tạo cho LCD16x2

lcd_puts("Nội dung"); //Hàm truyền chuỗi nội dung lên LCD

lcd_putchar(ký_tự); //Hàm truyền 1 ký tự lên LCD

lcd_gotoxy(X,Y); //Hàm chọn vị trí hiển thị, trong đó X là vị trí từ 0-15, Y là dòng 0-1

lcd_clear(); //Hàm xóa trắng màn hình

Code mẫu:

/*******************************************************
Author  : Truong Cong Ly
Chip type               : ATmega16A
Program type            : Application
AVR Core Clock frequency: 8.000000 MHz
*******************************************************/

#include <mega16a.h>

// Alphanumeric LCD functions
#include <alcd.h>
#include <delay.h>
// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA = (0 << DDA7) | (0 << DDA6) | (0 << DDA5) | (0 << DDA4) | (0 << DDA3) | (0 << DDA2) | (0 << DDA1) | (0 << DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA = (0 << PORTA7) | (0 << PORTA6) | (0 << PORTA5) | (0 << PORTA4) | (0 << PORTA3) | (0 << PORTA2) | (0 << PORTA1) | (0 << PORTA0);

// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB = (0 << DDB7) | (0 << DDB6) | (0 << DDB5) | (0 << DDB4) | (0 << DDB3) | (0 << DDB2) | (0 << DDB1) | (0 << DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB = (0 << PORTB7) | (0 << PORTB6) | (0 << PORTB5) | (0 << PORTB4) | (0 << PORTB3) | (0 << PORTB2) | (0 << PORTB1) | (0 << PORTB0);

// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC = (0 << DDC7) | (0 << DDC6) | (0 << DDC5) | (0 << DDC4) | (0 << DDC3) | (0 << DDC2) | (0 << DDC1) | (0 << DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC = (0 << PORTC7) | (0 << PORTC6) | (0 << PORTC5) | (0 << PORTC4) | (0 << PORTC3) | (0 << PORTC2) | (0 << PORTC1) | (0 << PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD = (0 << DDD7) | (0 << DDD6) | (0 << DDD5) | (0 << DDD4) | (0 << DDD3) | (0 << DDD2) | (0 << DDD1) | (0 << DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD = (0 << PORTD7) | (0 << PORTD6) | (0 << PORTD5) | (0 << PORTD4) | (0 << PORTD3) | (0 << PORTD2) | (0 << PORTD1) | (0 << PORTD0);

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 6
// RD - PORTD Bit 5
// EN - PORTD Bit 4
// D4 - PORTB Bit 4
// D5 - PORTB Bit 5
// D6 - PORTB Bit 6
// D7 - PORTB Bit 7
// Characters/line: 16

lcd_init(16); //Khoi tao LCD 16x2
delay_ms(500); //Tao tre
lcd_puts("truongcongly.com"); //Gui chuoi len LCD
delay_ms(1000);
lcd_clear(); //Xoa man hinh
lcd_puts("Test LCD for AVR");
delay_ms(500);
lcd_gotoxy(0, 1); //Tro toi vi tri dau tien dong 2
lcd_puts("0123456789");
delay_ms(500);
lcd_gotoxy(13, 1);
lcd_puts("OK!");

while (1)
    {
    // Place your code here
    }
}

Mạch mô phỏng ví dụ:

Video

Nhận xét

Mới hơn Cũ hơn