Thắc mắc trong bài lập trình với LCD

xe đạp

Trứng gà
Vô thẳng vấn đề chính. Trong bài lập trình với LCD 16x2 trong loạt bài học pic16F887 em có vài điều thắc mắc như sau:

* 1: Trong video trên diễn đàn nói để lập trình cho LCD ta sử dụng 6 hàm là
PHP:
	lcd_putc();
	lcd_puts();
	lcd_clear();
	lcd_init();
	lcd_gotoxy();
	lcd_busy();
Tuy nhiên khi xem trong file lcd.h và lcd.c thì em thấy có hàm
PHP:
lcd_put_byte();
lcd_get_byte();
vậy cho em hỏi công dụng của 2 hàm này dùng để làm gì?

* 2: em có viết 1 đoạn code như sau:

PHP:
	char  text[] = {‘h’,’e’,’l’,’l’,’o’};
	unsigned char i;
	lcd_clear();
	for(i=0;i<5;i++)
	{
		lcd_putc(text[i]);
		delay(500);
	}
Tuy nhiên khi chạy thử thì nó chỉ có thể hiển thị được chữ “h”, nhưng khi em sửa đoạn code thành:
PHP:
	const char  text[] = "hello";
	unsigned char i;
	lcd_clear();
	for(i=0;i<5,i++)
	{
		lcd_putc(text[i]);
		delay(500);
	}
Thì nó lại chạy được. vậy cho em hỏi vì sao có sự khác nhau đó.

* 3: em thấy có một số ví dụ mẫu có hiển thị các ký hiệu hình vẽ (vd như hình cái chuông, nốt nhạc hay tin nhắn,..) lên màn hình lcd, vậy cho em hỏi làm thế nào để có thể làm được như vậy, nếu được xin cho em hướng dẫn cụ thể luôn chứ đừng nói quá chung chung.

Cảm ơn mọi người đã đọc tin
 

Manhdd

Cố Vấn CLB
Staff member
Xin trả lời các câu hỏi của bạn.

1. *Hàm void lcd_put_byte(unsigned char rs, unsigned char b) dùng để truyền byte xuống LCD. Byte là lệnh cho LCD nếu rs=0, là kí tự hiển thị lên LCD nếu rs =1. Từ hàm này xây dựng nên hàm:
- void lcd_putc(char c) : dùng với rs =1, gửi kí tự hiển thị lên LCD. c là mã ASCII của kí tự cần hiển thị, trong bảng mã ASCII có nốt nhạc, mũi tên, mặt cười, ... gì đó.
- void lcd_puts(const char* s) : xây dựng từ hàm trên, hiển thị 1 chuỗi kí tự có pointer bắt đầu từ *s cho đến khi gặp null (0).
- void lcd_gotoxy(unsigned char col, unsigned char row): dùng với rs = 0, gửi lệnh điều khiển con trỏ LCD. Bạn có thể tự tìm hiểu thêm tập lệnh LCD để ứng dụng thêm hàm lcd_put_byte(0, b)

*Hàm unsigned char lcd_get_byte(unsigned char rs) dùng để nhận byte từ LCD. Byte là trạng thái LCD nếu rs=0 (mã trạng thái có qui ước riêng), là kí tự vừa hiển thị lên LCD nếu rs =1. Chúng ta chỉ cần hàm lcd_busy để biết hiện LCD đã xử lý xong lệnh chưa nên thực tế không cần sử dụng hàm lcd_get_byte.

2. Code bạn viết sai hết, chả cái nào chạy cả, phải viết là:
Code:
	lcd_init();
    char  text[] = {'h', 'e', 'l', 'l', 'o', 0}; // = "hello"  // notice the single quote
    char i;
    lcd_clear();
    for(i=0;i<5;i++) // notice that
    {
        lcd_putc(text[i]);
        __delay_ms(500); // notice that
    }
Vì đã có hàm lcd_puts nên ta có thể thay thế cụm lệnh for bằng:
lcd_puts (text) hay lcd_puts ("Hello") (trong cách viết đầu phải đảm bảo kí tự kết thúc chuỗi là null (0x00))
3.
- Sử dụng mã ASCII của kí hiệu có sẵn.
- Tự vẽ các kí tự vào vùng nhớ của LCD, sử dụng tập lệnh LCD (tự tìm hiểu, thực ra việc này chả cần thiết lắm, nếu làm được thì giới thiệu với mọi người cho vui :d)

Mình không có nhiều thời gian để làm ví dụ cụ thể cho bạn, và chắc cũng chẳng có ai rảnh rỗi để làm việc này đâu. Bạn tự tìm hiểu thêm vậy.
 

xe đạp

Trứng gà
ah, cả 2 code ko chạy do hồi nãy viết nhầm cái for nên sai ko chạy là phải rồi
 

tungbk

Cố Vấn CLB
Staff member
Đóng góp thêm vài code ví dụ cho các bạn khác dể theo dõi:
PHP:
	unsigned char c_get;
	lcd_init();
	lcd_put_byte(0,DCLEAR);      // gửi dữ liệu dạng command
	__delay_ms(10);
	lcd_puts("Hello");         
	lcd_put_byte(0,0x10);		//lùi con trỏ lại 1 vị trí
	c_get = lcd_get_byte(1);	//đọc kí tự 'o' từ vị trí này
	lcd_gotoxy(0,1);			//xuống hàng
	lcd_putc(c_get);			//xuất kí tự 'o' ra LCD
        while(1);
Note:
+Lệnh lcd_put_byte(1,data) tương đương với lcd_putc(data);

2) Code sửa lại để chạy được của bạn như sau:
PHP:
    char  text[] = {'a','b','c','d','e'};  
    unsigned char i;
    lcd_init();
    lcd_put_byte(0,DCLEAR);
    __delay_ms(10);
    for(i=0 ; i<5 ; i++)  //chú ý cú pháp C
    {
        lcd_putc(text[i]);
        __delay_ms(200);
    }
Hoặc dùng trực tiếp string như bạn Mạnh cho gọn.
3. Code ví dụ viết dữ liệu lên CGRAM tạo kí tự mong muốn(xem thêm datasheet)
PHP:
unsigned char char1[]={0x00,'h',' ','B',0x01,'c','h',' ','K','h','o','a'};
unsigned char data_cgram[]=
{0x0E,0X09,0X09,0X1D,0X09,0X09,0X0E,0X00,	//dia chi chua chu 'Ð' la 0x00
							0x01,0x02,0x07,0x11,0x11,0x11,0x0F,0x00	};	//dia chi chua chu 'á' la 0x01
	
void main()
{
	unsigned char i,j;
	lcd_init();
	lcd_put_byte(0,DCLEAR);			//0:CMD_WRT;1:DATA_WRT
	__delay_ms(2);
	j = 0x40;						//dia chi bat dau CGRAM
	for(i = 0; i < 16; i++)
	{
               //1 kí tự tạo ra tốn 8 byte liện tiếp trong CGRAM
		lcd_put_byte(0,j);			//ghi địa chỉ CMD_WRT
		lcd_put_byte(1,data_cgram[i]);	//ghi dữ liệu DATA_WRT		
		j++;
	}	
	
        //xuất chữ "Đh Bách Khoa	"
	lcd_put_byte(0,DCLEAR);			
	__delay_ms(2);
	lcd_gotoxy(0,0);
	for(i=0;i<13;i++)
	{
		lcd_put_byte(1,char1[i]);		
		__delay_ms(100);
	}
	while(1);
}
Chúc thành công !
 
Top