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;
}
执行后如下图:
|
|