main.c文件: 
 
/******************************** 
  LCM1602(KS0066U兼容)控制程序(4bit模式)  
  文件名:main.c 
  编译:WinAVR-20070122 
 
  硬件:CA-M8X   
      配置:内部1MHz 
      打开:全关 
   
  芯艺设计室 2004-2007  版权所有  
  转载请保留本注释在内的全部内容 
  WEB: http://www.chipart.cn 
  Email: changfutong@sina.com 
*******************************/ 
#include  
#include  
#include  
 
//三个控制口如下定义 
#define LCD_EN  PD6 
#define LCD_RS  PD4 
#define LCD_RW  PD5 
//数据口接单片机PB口 
 
//延时ms 
void DelayMs(uint16_t t) 
{ 
  uint16_t i; 
  for(i=0;i
   _delay_loop_2(250); 
} 
 
//总线延时 
void lcd_delay_bus(void) 
{ 
  asm("nop"); 
  asm("nop"); 
} 
 
//检测一次忙信号 
uint8_t lcd_get_busy_state(void) 
{ 
  uint8_t ret; 
  PORTD&=~_BV(LCD_RS); 
  PORTD|=_BV(LCD_RW); 
  PORTB=0x80;  //PB7上拉电阻开 
   
  //产生一EN脉冲,期间读数据口 
  PORTD|=_BV(LCD_EN); 
  lcd_delay_bus(); 
  ret=PINB&0X80; //返回最高位即数据最高位 
  PORTB=0;      //上拉电阻关闭 
  PORTD&=~_BV(LCD_EN); 
  lcd_delay_bus(); 
   
  return ret; 
} 
 
//写高4位 
void lcd_write_4bit(uint8_t dt) 
{ 
  DDRB=0XF0;//设置高4位为输出 
  PORTB=dt&0xf0;//将数据放到数据口 
  //产生一EN脉冲 
  PORTD|=_BV(LCD_EN); 
  lcd_delay_bus(); 
  PORTD&=~_BV(LCD_EN); 
  lcd_delay_bus(); 
  DDRB=0;  //数据口恢复为输入 
} 
 
//写命令 
void lcd_write_command(uint8_t cmd) 
{ 
  while(lcd_get_busy_state());//忙检测      
  PORTD&=~_BV(LCD_RS); 
  PORTD&=~_BV(LCD_RW); 
  lcd_write_4bit(cmd);//写高4位 
  lcd_write_4bit(cmd<<4);//写低4位 
} 
//写数据 
void lcd_write_data(uint8_t dat) 
{ 
  while(lcd_get_busy_state());   
  PORTD|=_BV(LCD_RS); 
  PORTD&=~_BV(LCD_RW); 
  lcd_write_4bit(dat);//写高4位 
  lcd_write_4bit(dat<<4);//写低4位 
} 
//液晶初始化 
void lcd_init(void) 
{  
  DDRB=0;//数据口设置为输入 
  DDRD=_BV(LCD_RS)|_BV(LCD_RW)|_BV(LCD_EN);//控制口设置为输出 
  DelayMs(100);  //上电后至少延时30ms 
   
  //先以命令方式发送 0010(4位) 
  PORTD&=~_BV(LCD_RS); 
  PORTD&=~_BV(LCD_RW); 
  lcd_write_4bit(0x20); 
   
  lcd_write_command(0x28);//功能设置 
  lcd_write_command(0x0c);//显示开,不显示光标 
  lcd_write_command(0x01);//清屏   
  DelayMs(2);//延时至少1.5ms 
  lcd_write_command(0x06);//增量模式 
} 
 
//设定显示位置,行x=0/1,列y=1~16的任意整数 
void lcd_print(uint8_t x,uint8_t y,char *str) 
{ 
  //设置当前位置   
  if(x==0) 
    lcd_write_command(0x80+y); 
  else 
    lcd_write_command(0xc0+y); 
   
  //字符串输出 
  while(*str!=0) 
    lcd_write_data(*str++); 
} 
 
//清屏功能函数 
void lcd_clear(void) 
{ 
  lcd_write_command(0x01); 
} 
 
int main(void) 
{ 
  lcd_init(); 
  lcd_print(0,3,"Welcome to");//打印到第一行(居中) 
  lcd_print(1,1,"www.chipart.cn");//打印到第二行(居中) 
 
  while(1); 
  return 0; 
} 
 
执行后如下图:
  
                    
                    	 
                     | 
				 
			  
             |