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

dibongaodu94

Học sinh phổ thông
#43
Anh ơi cho em hỏi sao em viết chương trình giống của anh mà khi mô phỏng chữ .ORG bị cắt xuống dòng dưới là sao ạ
 

mta_cdt

Super Moderator
Thành viên BQT
#44
Anh ơi cho em hỏi sao em viết chương trình giống của anh mà khi mô phỏng chữ .ORG bị cắt xuống dòng dưới là sao ạ
Cho mình xin cái hình mạch với cái code
 

mta_cdt

Super Moderator
Thành viên BQT
#46

thuyvy3110

Học sinh phổ thông
#49
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.
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.​
anh ơi, anh có dùng LCD5110 với ATMEGA, avr studio chưa ạ?
 

thuyvy3110

Học sinh phổ thông
#50
Đâ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
Khi em F7 build solution , trong AVR studio, thì bị báo: "address may be uninitialized in this function" ạ?!!
 

Quảng cáo Google