Hướng dẫn Bài 5 hiển thị text LCD

mta_cdt

Super Moderator
Thành viên BQT
#1
Bài trước mình đã hiển thị được trên led 7 seg nhưng nhược điểm của led 7 seg là chỉ hiển thị được số, phần này mình xin giới thiệu hiển thị trên text LCD mình lấy ví dụ lcd16x2 còn những LCD khác như 2x20, 4x20 ... cũng không khác gì.
LCD có các thanh ghi là
- IR: thanh ghi lệnh của LCD, người dùng gửi lệnh đến LCD bằng cách set RS (chân số 4) bằng 0, chân đọc ghi RW=0, EN cho 1 xung từ cao xuống thấp sẽ đưa 1 lệnh vào LCD
- thanh ghi DR chứa dữ liệu 8 bit lưu vào DDRAM hoặc CGRAM
DDRAM Đây là vùng RAM dùng để hiển thị, nghĩa là ứng với một địa chỉ của RAM là một ô kí tự trên màn hình.
Untitled.png

CGROM đây là bảng font để hiển thị LCD, người dùng truy cập bằng cách gửi mã ascii của ký tự tương ứng thì LCD sẽ hiển thị ký tự đó.
CGRAM vùng này chứa ký tự do người ùng tự định nghĩa. Phần này mình xin ko giới thiệu
video hướng dẫn giao tiếp với LCD dùng codevison avr​
code và file mô phỏng xin download file đính kèm bên dưới.​
 

Đính kèm

mta_cdt

Super Moderator
Thành viên BQT
#2
Đối với trình biên dịch avrstudio không hỗ trợ thư viện lcd.h chính vì vậy người dùng phải tự tạo thư viện. Tạo thư viện giao tiếp với LCD thì có 1 số phần như sau.
Mình đã tạo được thư viện
Untitled.png
Phần này mình nối thẳng RW với GND vì vậy hiển thị LCD chỉ mất 6 chân, tuy nhiên là phải chờ 1 thời gian để thực hiện xong lệnh LCD.
Ta tạo ra 1 thư viện có đuôi.h (tên do bạn tự đặt, mình lấy tên là textlcd.h)
Untitled.png
chuột phải vào header file chọn creart new header file. dòng bên trên add ... hearder file là add 1 file đã có sẵn vào.
2.png
sau đó bạn gõ tên thư viện có đuôi .h (của mình là textlcd.h) nhấn ok hộp thoại gõ code được mở ra.
3.png
Đầu tiên là khai báo dùng delay.h
#include <util/delay.h>
và định nghĩa 2 macro dùng để set từng bit
#define sbi(sfr,bit) sfr|=(1<<bit);// dinh nghia macro set vd set PORTB.5=1 ta viết sbi(PORTB,5)

#define cbi(sfr,bit) sfr&=~(1<<bit) // dinh nghia macro xoa 1 bit ve 0
 
Sửa lần cuối:

mta_cdt

Super Moderator
Thành viên BQT
#3
Đây là thư viên mình viết như phần bên trên
Mã:
#define sbi(sfr,bit) sfr|=(1<<bit);// dinh nghia macro set

#define cbi(sfr,bit) sfr&=~(1<<bit) // dinh nghia macro xoa 1 bit ve 0

#define lcd_data PORTB  // su dung portb de noi voi lcd
#define lcd_rs 0        // rs noi voi B.0
//lcd_rw =0
#define lcd_en 2
#define lcd_d4 4
#define lcd_d5 5
#define lcd_d6 6
#define lcd_d7 7

void make_out_data(char buffer_data)
{
if((buffer_data&0x01)==1) {sbi(lcd_data,lcd_d4);}  // neu bit 1 buffer_data=1 thì lcd_d4=1 nguoc lai bang 0
else{cbi(lcd_data,lcd_d4);}
if((buffer_data&0x02)==2) {sbi(lcd_data,lcd_d5);}  // neu bit 2 buffer_data=1 thì lcd_d5=1 nguoc lai bang 0
else{cbi(lcd_data,lcd_d5);}
if((buffer_data&0x04)==4) {sbi(lcd_data,lcd_d6);}  // neu bit 1 buffer_data=3 thì lcd_d6=1 nguoc lai bang 0
else{cbi(lcd_data,lcd_d6);}
if((buffer_data&0x08)==8){ sbi(lcd_data,lcd_d7);}  // neu bit 1 buffer_data=4 thì lcd_d7=1 nguoc lai bang 0
else{cbi(lcd_data,lcd_d7);}
}
void lcd_send_nibble(char buffer_nibble)            // ham gui 1/2 byte den lcd vi la 4bit len phai truyen lam 2 lan
{ make_out_data(buffer_nibble);
//delay_us(10);
sbi(lcd_data,lcd_en); // cho 1 xung en de chot data gui len lcd
_delay_us(10);
cbi(lcd_data,lcd_en);
}

void lcd_send_byte( char xx, char n )  // gui 1 byte den lcd neu xx=1 truyen du lieu, xx=0 thi truyen lenh
{
cbi(lcd_data,lcd_rs);                 
_delay_us(400); // thoi gian giua 2 byte truyen di

if(xx){sbi(lcd_data,lcd_rs);}      // xx=1 thi rs=1
else {cbi(lcd_data,lcd_rs);}        //xx=0 thi rs=0
//rs=xx;//xx=0 la ghi lenh , xx=1 thi ghi data

_delay_us(40);
cbi(lcd_data,lcd_en);
lcd_send_nibble(n >> 4);  // truyen 4 bit cao dich phai 4 bit
lcd_send_nibble(n & 0xf);  // lay 4 bit thap truyen di
}
void lcd_init(void)  // ham khoi tao lcd
{ char i;
cbi(lcd_data,lcd_rs);  // xoa rs
cbi(lcd_data,lcd_en);  // xoa en
_delay_ms(10);     
for(i=1;i<=3;++i)
{
lcd_send_nibble(3);  // gui lenh 0x03 den lcd minh ko nho lenh nay lam gi
_delay_ms(5);
}
lcd_send_nibble(2);    // ve dau dong
lcd_send_byte(0,0x28);  // ma tran 5x7 o che do 4 bit
lcd_send_byte(0,0x0c);  // ve dau dong thu 2
//lcd_send_byte(0,1);
lcd_send_byte(0,6);      //dich con tro sang phai

lcd_send_byte(0,1); _delay_ms(10);  // xoa lcd

//for(i=0;i<=3;++i)
//lcd_send_byte(0,LCD_INIT_STRING[i]);
}
void lcd_gotoxy( char x, char y)  // ham dung goi dia chi con tro
{unsigned char address;
switch(y) {
case 0 : address=0x80;break;      // hang 0 bat dau o dia chi 0x80 
case 1 : address=0xc0;break;      // hang 1 bat dau 0xc0
case 2 : address=0x94;break;
case 3 : address=0xd4;break;
}
address=address+x;              //tang len x
lcd_send_byte(0,0x80|address);  // gui lenh den lcd
}

void lcd_putc( char c)            // hien thi 1 ky tu
{
lcd_send_byte(1,c);
/*
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2); break;
case '\n' : lcd_gotoxy(0,1); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}*/

}

void lcd_clear(void)          // xoa man hinh hien thi
{
lcd_send_byte(0,1); _delay_ms(10);
}
     


//xxxxxxxxxxxxxxx



void lcd_putsf(char* str, unsigned char len) // ham hien thi 1 chuoi
{
unsigned char i;
for(i=0;i<len;i++)
if(str[i]>0)lcd_putc(str[i]);


}
chương trình chính
Mã:
#define F_CPU 8000000
#include <util/delay.h>
#include <avr/io.h>
#include "textlcd.h" // gọi thu vien textlcd.h


int main(void)
{
DDRB=0xFF;
lcd_init();
while(1)
{
lcd_gotoxy(3,0);
lcd_putsf("LCD 16x2",8);
lcd_gotoxy(0,1);
lcd_putsf("CODIENTU.ORG",12);

}
}
mình gửi 2 project 1 sử dụng thư viên như bên trên 2 là file lcd hocavr.rar cái này giống như trên web hocavr.com
 

Đính kèm

nam_9x

Học sinh trung cấp
#5
anh mta_cdt có thể chạy chữ & Hiển thị tiếng việt bằng codevision không ạ.em đang nghiên cứu nhưng chưa được...
 

mta_cdt

Super Moderator
Thành viên BQT
#6
anh mta_cdt có thể chạy chữ & Hiển thị tiếng việt bằng codevision không ạ.em đang nghiên cứu nhưng chưa được...
chạy chữ thì không khó, hiển thị tiếng việt mình chưa làm bao giờ mà tự tạo trong CGRAM chỉ chứa được 8 ký tự
 

nam_9x

Học sinh trung cấp
#7
thế ạ.em nghĩ viết tiếng việt bằng Codevision hơi khó vì nó chỉ truyền 4 bit.Nhưng chắc vẫn làm được thì phải.còn viết chữ thông thường thì nó hỗ trợ hết.anh thử xem sao, em cổ vũ ạ =D>
 

ngocbk90

Học sinh phổ thông
#10
cho em hỏi cái bác mta_cdt
em muốn hiển thị số 13 em dùng như sau :
lcd_putsf("13");
em thấy vẫn hiển thị được mà?
thế dùng hàm lcd_putchar(); có cái ưu điểm nào hơn mong bác chỉ giáo
 

Quảng cáo Google