文章
博客 网店

 LCM1602(KS0066U兼容)控制程序(4bit模式)


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;
}

执行后如下图:


芯艺工作室    蒙ICP备06005492号
Copyright© 2004-2023 ChipArt Studio All Rights Reserved