Đánh giá chủ đề:
  • 46 Vote(s) - Trung bình 2.91
  • 1
  • 2
  • 3
  • 4
  • 5
Khó khăn trong việc giao tiếp với LCD...?
Bài viết: #1
Như các pác đã biết thì việc giao tiếp với LCD cũng khá dễ..., nhưng khi việc đó được thực hiện trên cùng một PORT và các chân dư ra bỏ trống hoàn toàn, có nghĩa là không xài cho mục đích khác...!


Tuy nhiên do tôi đang thực hiện việc giao tiếp LCD này trên các chân còn dư ra của KIT ez430 - RF2500 nên vấn đề là rất khó khăn...???
Vì trên KIT này còn dư ra 18 chân trong đó có PORT 2 là dư nhiều chân nhất, cụ thể là P2.0 - P2.1 - P2.2 - P2.3 - P2.4 - P2.6 - P2.7 ...trớ trên thay P2.5 đã xài cho KIT này...nên khi viết hàm cho LCD tôi không thể "đụng" đến nó...! Hey vậy là các thao tác mặt nạ, giữ 4 bit cao, che 4 bit thấp, ghi các bit cao, đọc các bit thấp, ghép bit ..... gì gì đó dường như là vô nghĩa...!


Hi vọng các Pro có thể hướng dẫn tôi viết hàm giao tiếp LCD trong trường hợp này...???
Thanks các pác....!

Trả lời
Bài viết: #2
Chúng chỉ cần 6 chân là đủ, bất kỳ chân nào là có thể giao tiếp với LCD! 2 chân điều khiển RS và EN và 4 chân DATA. chúng ta sẽ định nghĩa chân mà chúng ta muốn xuất dữ liệu:
Bạn tham khảo code này nhé!


#include "string.h"
#include "msp430g2452.h"
#include

union reg {
struct bit {
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
}_BIT;
unsigned char _BYTE;
};
union reg* _P2_DIRECT = (union reg*)0x2A ;
union reg* _P2_OUT = (union reg*)0x29 ;
union reg* _P2_IN = (union reg*)0x28 ;
union reg* _P1_DIRECT = (union reg*)0x22 ;
union reg* _P1_IN = (union reg*)0x20 ;
union reg* _P1_OUT = (union reg*)0x21 ;
union reg* _P2_SEL = (union reg*)0x2E ;

#define LCDdata (P2OUT)


#define RS _P2_OUT->_BIT.b6
#define EN _P2_OUT->_BIT.b4

#define DATA_4 _P2_OUT->_BIT.b3
#define DATA_5 _P2_OUT->_BIT.b2
#define DATA_6 _P2_OUT->_BIT.b1
#define DATA_7 _P2_OUT->_BIT.b0


void LCD_out(unsigned char data) //ham gui byte data cao
{
unsigned char convert=0;

convert=data&0x10;
if(convert==0x10)DATA_4=1;
else DATA_4=0;
convert=data&0x20;
if(convert==0x20)DATA_5=1;
else DATA_5=0;
convert=data&0x40;
if(convert==0x40)DATA_6=1;
else DATA_6=0;
convert=data&0x80;
if(convert==0x80)DATA_7=1;
else DATA_7=0;
}

//****************************************************
void lcd_delay(int time)
{
while(--time);
}

void lcd_wait_busy(void)
{
lcd_delay(1000);
}
//********************LCD Funtion***********************
//Ghi 4 bit
void lcd_write_4bits(unsigned char dat)
{
EN=1;
LCD_out(dat);
lcd_delay(10);
EN=0;
lcd_delay(10);
}
void lcd_write_cmd(unsigned char cmd)//gui lenh
{
EN=1;
lcd_wait_busy();
RS=0;
lcd_write_4bits(cmd);
lcd_write_4bits(cmd << 4);
}
void lcd_write_data(unsigned char data)//gui du lieu
{
lcd_wait_busy();
RS=1;
lcd_write_4bits(data);
lcd_write_4bits(data << 4);
}



void init_lcd()
{
lcd_delay(15000);
RS=0;
lcd_write_4bits(0x03 << 4);
lcd_delay(4100);
lcd_write_4bits(0x03 << 4);
lcd_delay(100);
lcd_write_4bits(0x03 << 4);
lcd_write_4bits(0x02 << 4);
lcd_write_cmd(0x28) ;
lcd_write_cmd(0x0C);
lcd_write_cmd(0x06);
lcd_write_cmd(0x01);

}
//***************************************************************
void LCDputs(char *s,unsigned char row)
{
unsigned char len;
if(row==1) lcd_write_cmd(0x80);// Ep con tro ve dau dong 1
else lcd_write_cmd(0xC0);// Ep con tro ve dau dong 2
len=strlen(s);// Lay do dai bien duoc tro boi con tro
while(len!=0)// Khi do dai van con
{
lcd_write_data(*s);// Ghi ra LCD gia tri duoc tro boi con tro
s++;// Tang con tro
len--;// Tru do dai
}
main()................

Ở đây chúng ta giao tiếp với LCD bằng 4 bit, chúng ta ghi 4 bit cao trước sau đó dịch và ghi tiếp 4 bit thấp> nên chỉ cần 4 đường data thôi. còn việc bạn nói khó khăn gì đó không cần thiết. vì chúng ta muốn xuất chân nào cũng được, chỉ cần bạn định nghĩa lại thôi!
website: www.eplusi.net
Phone: 0907 042 549
Mail: info@eplusi.net
Trả lời


Đi tới chuyên mục:


Thành viên đang xem chủ đề: 1 Khách