PDA

View Full Version : giao tiếp lcd16x2 bằng 3 dây


lionking
27-09-2011, 09:16 PM
mình vừa làm giao tiếp với lcd16x2 chỉ điều khiển bằng 3 dây, chia cho mọi người cùng sài

code:

#include <16F877A.h>
#fuses HS, NOWDT ,PROTECT ,NOBROWNOUT ,NOPUT
#use delay(clock=20000000)
#include <define_pic16f877a.h>

#define data74595 RD1
#define clock74595 RD0
#define latch74595 RD2


int8 buffer_data_lcd = 0;
void OutPut74595(int8 data);


void LCD_STROBE()
{
bit_set(buffer_data_lcd,2);
OutPut74595(buffer_data_lcd);

bit_clear(buffer_data_lcd,2);
OutPut74595(buffer_data_lcd);
}

/* write a byte to the LCD in 4 bit mode */
void LCD_DATA(unsigned char c)
{
buffer_data_lcd = buffer_data_lcd & 0x0F;
buffer_data_lcd = buffer_data_lcd | (c << 4);
OutPut74595(buffer_data_lcd);
}

void lcd_write(unsigned char c)
{
delay_us(40);
LCD_DATA(c>>4);
LCD_STROBE();
LCD_DATA( c );
LCD_STROBE();
}

void lcd_clear(void)
{
bit_clear(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
lcd_write(0x1);
delay_ms(2);
}


/* write one character to the LCD */

void lcd_putchar(char c)
{
bit_set(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
lcd_write( c );
}

void lcd_gotoxy(unsigned char row,unsigned char col)
{
bit_clear(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
switch(row)
{
case 0 : lcd_write( 0x80 + col ) ;
break ;
case 1 : lcd_write( 0xC0 + col ) ;
break ;
case 2 : lcd_write( 0x94 + col ) ;
break ;
case 3 : lcd_write( 0xD4 + col ) ;
break ;
};

}

/* initialise the LCD - put into 4 bit mode */
void lcd_init()
{

buffer_data_lcd = 0;
OutPut74595(buffer_data_lcd);

delay_ms(15); // wait 15mSec after power applied,
LCD_DATA(0x03);
LCD_STROBE();
delay_ms(5);
LCD_STROBE();
delay_us(200);
LCD_STROBE();
delay_us(200);
LCD_DATA(2); // Four bit mode
LCD_STROBE();

lcd_write(0x28); // Set interface length
lcd_write(0x0C); // Display On, Cursor On, Cursor Blink
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
}

//------------------------------------------------
void OutPut74595(int8 data)
{
int8 i ;

for(i=0;i<8;i++)
{
if( bit_test(data,7) )
{
data74595=1 ;
}
else
{
data74595=0 ;
};
clock74595=0;
clock74595=1;

data = data<<1 ;
};
//-----------------------------
latch74595 = 1;
latch74595 = 0;
}
//-------------------------------------------------------------
void main(void)
{
TRISA=0xFF;
TRISB=0x00;
TRISC=0xFF;
TRISD=0xF0 ;

PORTB = 0x00;

lcd_init();


while( true )
{
lcd_gotoxy(0,0);
printf(lcd_putchar," Hello");
lcd_gotoxy(1,0);
printf(lcd_putchar," Hoang Cute");

};
}

lionking
27-09-2011, 09:23 PM
mình định thêm 1 con IC số nữa để bỏ bớt đi 1 dây giao tiếp nữa, khi nào thành công up tiếp

tdm
27-09-2011, 10:19 PM
mình vừa làm giao tiếp với lcd16x2 chỉ điều khiển bằng 3 dây, chia cho mọi người cùng sài

code:

#include <16F877A.h>
#fuses HS, NOWDT ,PROTECT ,NOBROWNOUT ,NOPUT
#use delay(clock=20000000)
#include <define_pic16f877a.h>

#define data74595 RD1
#define clock74595 RD0
#define latch74595 RD2


int8 buffer_data_lcd = 0;
void OutPut74595(int8 data);


void LCD_STROBE()
{
bit_set(buffer_data_lcd,2);
OutPut74595(buffer_data_lcd);

bit_clear(buffer_data_lcd,2);
OutPut74595(buffer_data_lcd);
}

/* write a byte to the LCD in 4 bit mode */
void LCD_DATA(unsigned char c)
{
buffer_data_lcd = buffer_data_lcd & 0x0F;
buffer_data_lcd = buffer_data_lcd | (c << 4);
OutPut74595(buffer_data_lcd);
}

void lcd_write(unsigned char c)
{
delay_us(40);
LCD_DATA(c>>4);
LCD_STROBE();
LCD_DATA( c );
LCD_STROBE();
}

void lcd_clear(void)
{
bit_clear(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
lcd_write(0x1);
delay_ms(2);
}


/* write one character to the LCD */

void lcd_putchar(char c)
{
bit_set(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
lcd_write( c );
}

void lcd_gotoxy(unsigned char row,unsigned char col)
{
bit_clear(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
switch(row)
{
case 0 : lcd_write( 0x80 + col ) ;
break ;
case 1 : lcd_write( 0xC0 + col ) ;
break ;
case 2 : lcd_write( 0x94 + col ) ;
break ;
case 3 : lcd_write( 0xD4 + col ) ;
break ;
};

}

/* initialise the LCD - put into 4 bit mode */
void lcd_init()
{

buffer_data_lcd = 0;
OutPut74595(buffer_data_lcd);

delay_ms(15); // wait 15mSec after power applied,
LCD_DATA(0x03);
LCD_STROBE();
delay_ms(5);
LCD_STROBE();
delay_us(200);
LCD_STROBE();
delay_us(200);
LCD_DATA(2); // Four bit mode
LCD_STROBE();

lcd_write(0x28); // Set interface length
lcd_write(0x0C); // Display On, Cursor On, Cursor Blink
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
}

//------------------------------------------------
void OutPut74595(int8 data)
{
int8 i ;

for(i=0;i<8;i++)
{
if( bit_test(data,7) )
{
data74595=1 ;
}
else
{
data74595=0 ;
};
clock74595=0;
clock74595=1;

data = data<<1 ;
};
//-----------------------------
latch74595 = 1;
latch74595 = 0;
}
//-------------------------------------------------------------
void main(void)
{
TRISA=0xFF;
TRISB=0x00;
TRISC=0xFF;
TRISD=0xF0 ;

PORTB = 0x00;

lcd_init();


while( true )
{
lcd_gotoxy(0,0);
printf(lcd_putchar," Hello");
lcd_gotoxy(1,0);
printf(lcd_putchar," Hoang Cute");

};
}
cái này hay ở chỗ tiết kiệm được chân VDK,nhưng có nhược điểm chỉ được một chiều từ VDK tới LCD.
còn đọc dữ liệu từ LCD về VDK thì không được.

lionking
27-09-2011, 10:37 PM
sơ đồ giao tiếp lcd chỉ có 2 dây đây . Con IC thêm vào là 74HC164

ronnynguyen
27-09-2011, 11:14 PM
Mình cần LCD hiển thị chữ quang báo nhưng viết mãi không được. Có ai giúp mình với !!!

DINH THANH SANG
27-09-2011, 11:28 PM
sơ đồ giao tiếp lcd chỉ có 2 dây đây . Con IC thêm vào là 74HC164

bạn có thể viết thêm ngôn ngữ HTPIC c nữa được không bạn

lionking
27-09-2011, 11:51 PM
bạn có thể viết thêm ngôn ngữ HTPIC c nữa được không bạn

Ngày xưa mình cũng dùng HTPIC nhưng thấy hỗ trợ ít hơn CSS nên mình không dùng HTPIC nữa. để viết chương trình trên cho HTPIC bạn viết thêm hàm bit_set,bit_clear rồi ghép vào chương trình của mình là được

binhngo
29-09-2011, 10:46 AM
mình vừa làm giao tiếp với lcd16x2 chỉ điều khiển bằng 3 dây, chia cho mọi người cùng sài

code:

#include <16F877A.h>
#fuses HS, NOWDT ,PROTECT ,NOBROWNOUT ,NOPUT
#use delay(clock=20000000)
#include <define_pic16f877a.h>

#define data74595 RD1
#define clock74595 RD0
#define latch74595 RD2


int8 buffer_data_lcd = 0;
void OutPut74595(int8 data);


void LCD_STROBE()
{
bit_set(buffer_data_lcd,2);
OutPut74595(buffer_data_lcd);

bit_clear(buffer_data_lcd,2);
OutPut74595(buffer_data_lcd);
}

/* write a byte to the LCD in 4 bit mode */
void LCD_DATA(unsigned char c)
{
buffer_data_lcd = buffer_data_lcd & 0x0F;
buffer_data_lcd = buffer_data_lcd | (c << 4);
OutPut74595(buffer_data_lcd);
}

void lcd_write(unsigned char c)
{
delay_us(40);
LCD_DATA(c>>4);
LCD_STROBE();
LCD_DATA( c );
LCD_STROBE();
}

void lcd_clear(void)
{
bit_clear(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
lcd_write(0x1);
delay_ms(2);
}


/* write one character to the LCD */

void lcd_putchar(char c)
{
bit_set(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
lcd_write( c );
}

void lcd_gotoxy(unsigned char row,unsigned char col)
{
bit_clear(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
switch(row)
{
case 0 : lcd_write( 0x80 + col ) ;
break ;
case 1 : lcd_write( 0xC0 + col ) ;
break ;
case 2 : lcd_write( 0x94 + col ) ;
break ;
case 3 : lcd_write( 0xD4 + col ) ;
break ;
};

}

/* initialise the LCD - put into 4 bit mode */
void lcd_init()
{

buffer_data_lcd = 0;
OutPut74595(buffer_data_lcd);

delay_ms(15); // wait 15mSec after power applied,
LCD_DATA(0x03);
LCD_STROBE();
delay_ms(5);
LCD_STROBE();
delay_us(200);
LCD_STROBE();
delay_us(200);
LCD_DATA(2); // Four bit mode
LCD_STROBE();

lcd_write(0x28); // Set interface length
lcd_write(0x0C); // Display On, Cursor On, Cursor Blink
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
}

//------------------------------------------------
void OutPut74595(int8 data)
{
int8 i ;

for(i=0;i<8;i++)
{
if( bit_test(data,7) )
{
data74595=1 ;
}
else
{
data74595=0 ;
};
clock74595=0;
clock74595=1;

data = data<<1 ;
};
//-----------------------------
latch74595 = 1;
latch74595 = 0;
}
//-------------------------------------------------------------
void main(void)
{
TRISA=0xFF;
TRISB=0x00;
TRISC=0xFF;
TRISD=0xF0 ;

PORTB = 0x00;

lcd_init();


while( true )
{
lcd_gotoxy(0,0);
printf(lcd_putchar," Hello");
lcd_gotoxy(1,0);
printf(lcd_putchar," Hoang Cute");

};
}

Tôi đã chuyển mã nguồn này sang htpic, tuy nhiên báo lỗi không chạy, bac nào tìm hộ tôi xem lỗi ở đâu với


#include <htc.h>
#include "stdio.h"
__CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );
#define _XTAL_FREQ 20000000

#define data74595 RD1
#define clock74595 RD0
#define latch74595 RD2
#define uchar unsigned char
#define bit_set(var,bitno) ((var) |= 1 << (bitno))
#define bit_clear(var,bitno) ((var) &= ~(1 << (bitno)))
#define bit_test(data,bitno) ((data>>bitno)&0x01)

uchar buffer_data_lcd = 0;
void OutPut74595(unsigned char data);


void LCD_STROBE()
{
bit_set(buffer_data_lcd,2);
OutPut74595(buffer_data_lcd);

bit_clear(buffer_data_lcd,2);
OutPut74595(buffer_data_lcd);
}

/* write a byte to the LCD in 4 bit mode */
void LCD_DATA(unsigned char c)
{
buffer_data_lcd = buffer_data_lcd & 0x0F;
buffer_data_lcd = buffer_data_lcd | (c << 4);
OutPut74595(buffer_data_lcd);
}

void lcd_write(unsigned char c)
{
__delay_us(40);
LCD_DATA(c>>4);
LCD_STROBE();
LCD_DATA( c );
LCD_STROBE();
}

void lcd_clear(void)
{
bit_clear(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
lcd_write(0x1);
__delay_ms(2);
}


/* write one character to the LCD */

void lcd_putchar(char c)
{
bit_set(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
lcd_write( c );
}

void lcd_gotoxy(unsigned char row,unsigned char col)
{
bit_clear(buffer_data_lcd,0);
OutPut74595(buffer_data_lcd);
switch(row)
{
case 0 : lcd_write( 0x80 + col ) ;
break ;
case 1 : lcd_write( 0xC0 + col ) ;
break ;
case 2 : lcd_write( 0x94 + col ) ;
break ;
case 3 : lcd_write( 0xD4 + col ) ;
break ;
};

}

/* initialise the LCD - put into 4 bit mode */
void lcd_init()
{

buffer_data_lcd = 0;
OutPut74595(buffer_data_lcd);

__delay_ms(15); // wait 15mSec after power applied,
LCD_DATA(0x03);
LCD_STROBE();
__delay_ms(5);
LCD_STROBE();
__delay_us(200);
LCD_STROBE();
__delay_us(200);
LCD_DATA(2); // Four bit mode
LCD_STROBE();

lcd_write(0x28); // Set interface length
lcd_write(0x0C); // Display On, Cursor On, Cursor Blink
lcd_clear(); // Clear screen
lcd_write(0x6); // Set entry Mode
}

//------------------------------------------------
void OutPut74595(uchar data)
{
uchar i ;

for(i=0;i<8;i++)
{
if( bit_test(data,7) )
{
data74595=1 ;

}
else
{
data74595=0 ;
};
clock74595=0;
clock74595=1;

data = data<<1 ;
};
//-----------------------------
latch74595=1 ;
latch74595=0 ;
}
//-------------------------------------------------------------
void main(void)
{
TRISA=0xFF;
TRISB=0x00;
TRISC=0xFF;
TRISD=0xF0 ;
PORTB=0x00;

lcd_init();

lcd_gotoxy(1,0);
printf(" Hoang Cute");

while( 1 )
{

};
}