giao tiếp lcd16x2 bằng 3 dây
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");
};
}
|