Giao tiếp LCD bằng 3 dây
Như các bạn đã biết LCD là linh kiện ko thể thiếu trong quá trình học tập và làm việc với vi điều khiển. Có rất nhiều cách để giao tiếp VĐK vs LCD. Sau đây mình xin giới thiệu một cách giao tiếp VĐK với LCD16x2 thông qua ic hc595. Cách này có thể tiết kiệm chân cho VĐK hơn so với cách truyền thống chúng ta vẫn hay làm. :)
Sơ đồ kết nối như hình trên .
Sau đây là phần code giao tiếp của mình. Để hiện thị 1 chuỗi ta chỉ cần dùng lệnh :
lcd_gotoxy(a,b);//để chọn vị trí chữ cái đầu tiên trong chuỗi
lcd_putschar(s);//để hiển thị chuỗi s
lcd_gotoxy(a,b);//để chọn vị trí chữ cái đầu tiên trong chuỗi
lcd_putschar(s);//để hiển thị chuỗi s
//__________Phan giao tiep LCD_______________//
//___________Cac chan khai bao_____________//
//data--->>>RC0
//scl---->>>RC1
//sck---->>>RC2
#define data RC0
#define SCL RC1
#define SCK RC2
unsigned char byt=0 ;
#bit LCD_E=byt.4
#bit LCD_RW=byt.5
#bit LCD_RS=byt.6
#bit LCD_4=byt.3
#bit LCD_5=byt.2
#bit LCD_6=byt.1
#bit LCD_7=byt.0
///Khai bao cac ham con
void LCD_enable();
void LCD_Send_4bit();
void LCD_SendCommand();
void LCD_Putchar();
void LCD_Putschar();
void LCD_gotoxy();
void clear();
void LCD_inits();
//===========Truyen du lieu 595=======//
void Send_data_595(unsigned char dat)
{
unsigned char i,temp;
for(i=0;i<8 i="" p=""> {
temp=dat;
temp=temp&0x80;
if(temp==0x80){data=1;}
else {data=0;}
dat=dat<<1 bit="" dich="" p="" phai="" sang=""> SCK=0;
SCK=1;//xung chuyen 1 bit
}
SCL=0;
SCL=1;
}
//===========Tao xung enable==========//
void LCD_Enable(void)
{
LCD_E=1;
Send_data_595(byt);
delay_ms(1);
LCD_E=0;
Send_data_595(byt);
delay_ms(1);
}
//=====Ham gui 4bit=====//
void LCD_Send_4bit(unsigned char data)
{
LCD_4=data & 0x01; //lcd4
Send_data_595(byt);
LCD_5=(data>>1) & 0x01; //dich sang trai 1 bit va so sanh lcd5
Send_data_595(byt);
LCD_6=(data>>2) & 0x01;//lcd6
Send_data_595(byt);
LCD_7=(data>>3) & 0x01;//lcd7
Send_data_595(byt);
}
//========Ham gui lenh========//
void LCD_Sendcommand(unsigned char command)
{
LCD_RS=0; //chon thanh ghi lenh
Send_data_595(byt);
LCD_RW=0; //cho phep ghi
Send_data_595(byt);
LCD_Send_4bit(command>>4); //gui 4 bit cao
LCD_enable();
LCD_Send_4bit(command); //gui 4 bit thap
LCD_enable();
}
void LCD_Senddata(unsigned char data)
{
LCD_RS=1; //chon thanh ghi data
Send_data_595(byt);
LCD_RW=0; //cho phep ghi
Send_data_595(byt);
LCD_Send_4bit(data>>4); //gui 4 bit cao
LCD_enable();
LCD_Send_4bit(data); //gui 4 bit thap
LCD_enable();
}
//========Ham khoi tao LCD============//
void LCD_inits(void)
{
LCD_Send_4bit(0x00);
delay_ms(20); //cho cho LCD hoat dong
LCD_Sendcommand(0x03);//
LCD_Sendcommand(0x02); //tro ve dau dong
LCD_SendCommand( 0x28 ); // giao thuc 4 bit, hien thi 2 hang, ki tu 5x8
LCD_SendCommand( 0x0c); // cho phep hien thi man hinh
LCD_SendCommand( 0x06 ); // tang ID, khong dich khung hinh
Clear();
}
//=========void thiet lap vi tri======//
void LCD_gotoxy(unsigned char x , unsigned char y)
{
unsigned char address;
if(y==1)
address = (0x80+x);
else
address = (0xC0+x);
delay_us(1000);
LCD_SendCommand(address);
delay_us(50);
}
//===Ham xoa man hinh===//
void clear(void)
{
LCD_SendCommand(0x01); //xoa man hinh
delay_ms(10);
}
//=======Ham gui 1 ky tu len LCD==//
void LCD_Putchar(unsigned char text)
{
LCD_senddata(text);
}
//=======Ham gui 1 chuoi ky tu=====//
void LCD_PutsChar(char *s)
{
while(*s)
{
LCD_Putchar(*s);
s++;
}
}
void main()
{
int8 s[16];
Set_tris_C(0); //thiet lap dau ra PORTC
lcd_inits();//ham khoi tao lcd
lcd_gotoxy(1,1);//chon vi tri hien chuoi
sprintf(s,"DONG NGOC NHAT");
lcd_putschar(s);
lcd_gotoxy(2,2);
sprintf(s,"DAI HOC BKHN");
lcd_putschar(s);
while(1)
{}
}
1>8>
Không có nhận xét nào:
Đăng nhận xét