终于搞定了这个程序,哈哈
/****************************************************************/
/* LCD1602 4线并口通信源程序 EDN51实验板实验成功
/* 显示内容 cat_li's blog
/* QQ 15942526
/* 连接方式: DB4-DB7接P0.4-P0.7;
/* RS:P1.0;
/* RW:P1.1;
/* EN:P1.2;
/* 作者: 好心情
/* Date: 2007-11-15
/****************************************************************/
#include <reg51.h>
#define unchar unsigned char //unchar 定义一下方便使用
/****************************************************************/
#define LCD_IO P0 //DB4-DB7接P0.4-P0.7
sbit LCD_RS=P1^0;
sbit LCD_RW=P1^1;
sbit LCD_EN=P1^2;
/****************************************************************/
void lcd_check_BF(void); //读状态,忙检测
void lcd_en_command(unchar command,bit bcheck); // 写指令
void lcd_en(void); //写使能,产生高脉冲,写入数据
void lcd_en_dat(unchar dat,bit bcheck); //写数据
void lcd_set_add( unchar x, unchar y ); //设定地址
void lcd_write_char( unchar x,unchar y,unchar dat); //写字符
void lcd_write_string(unchar X,unchar Y,unchar *s); //写字符串
void lcd_init(void); //初始化
void delay_nms(unsigned int n);
/*************************LCD PART*******************************/
/***********************读状态忙检测*****************************/
/* 忙检测,无返回值 RS选指令寄存器,RW置为读状态,EN高电平读指令 */
/****************************************************************/
void check_BF(void)
{
unchar read;
LCD_RS = 0;
LCD_RW = 1;
LCD_IO = 0xff; // 将LCD_IO置为读状态
LCD_EN = 1;
do
{
read = LCD_IO ;
}while(read & 0x80); //如果BF位为1则继续读,否则退出
LCD_EN = 0;
}
/****************************写使能******************************/
/* 写使能,在EN脚产生高脉冲
/****************************************************************/
void lcd_en(void)
{
LCD_EN=1;
LCD_EN=0;
}
/****************************写指令******************************/
/* 写指令,RS=0选指令寄存器,RW=0选写模式,bcheck判断是否忙检测
/****************************************************************/
void LCD_en_command(unchar command,bit bcheck)
{
if(bcheck) //根据bcheck判断是否忙检测
{
check_BF();
}
LCD_RS=0;
LCD_RW=0;
LCD_IO = (command & 0xf0); // 写指令的高4位
lcd_en();
LCD_IO = (command & 0x0f)<<4;//写指令的第四位
lcd_en();
}
/****************************写数据******************************/
/* 写数据,RS=1选数据寄存器,RW=0写模式
/****************************************************************/
void LCD_en_dat(unchar dat,bit bcheck)
{
if(bcheck)
{
check_BF();
}
LCD_RS=1; // 设置写模式和数据寄存器
LCD_RW=0;
LCD_IO = (dat & 0xf0); //高四位
lcd_en();
LCD_IO = (dat & 0x0f)<<4;//第四位
lcd_en();
}
/****************************地址设置****************************/
/* 地址设置 x="0" 第一行 x="1" 第二行;y 设置每行从首地址开始的偏移量
/****************************************************************/
void LCD_set_add( unchar x, unchar y )
{
unchar address;
if (x ==0)
{
address = 0x80 + y;
}
else
{
address = 0xC0 + y;
}
lcd_en_command(address,1);
}
/*****************************写字符*****************************/
/* 写字符 x y 为字符的位置地址,dat为要写入的字符
/****************************************************************/
void lcd_write_char( unchar x,unchar y,unchar dat)
{
lcd_set_add(x,y); // 设置地址
lcd_en_dat(dat,1); // 写数据
}
/****************************写字符串****************************/
/* 写字符串 x y 为字符的位置地址,*s为要写入的字符串的首地址
/****************************************************************/
void lcd_write_string(unchar X,unchar Y,unchar *s)
{
lcd_set_add( X,Y ); // 设置地址
/* 字符串最后一位为自动加入的"\n",对应的ASCII值为0,其他为非零
在这里利用s指向的内容值判断字符串是否结束*/
while (*s)
{
lcd_en_dat(*s,1);
s ++; //指向下一个字符地址
}
}
/*****************************初始化******************************/
void lcd_init(void)
{
delay_nms(15);
lcd_en_command(0x28,0);
delay_nms(5);
lcd_en_command(0x28,0);
delay_nms(5);
lcd_en_command(0x28,0);
delay_nms(5);
lcd_en_command(0x28,1);
lcd_en_command(0x08,1); //关显示
lcd_en_command(0x01,1); //清屏
lcd_en_command(0x0C,1); //开显示光标设置
}
/******************************延时*******************************/
void delay_nms(unsigned int n)
{
unsigned int i="0",j=0;
for (i=n;i>0;i--)
for (j=0;j<1140;j++);
}
/*****************************************************************/
/*****************************************************************/
/*****************************************************************/
void main(void)
{
lcd_init();
while(1 )
{
lcd_en_command(0x01,1);
delay_nms(120);
lcd_write_string(0,1,"cat_li's blog");
lcd_write_string(1,2,"QQ 15942526");
delay_nms(120);
}
}
用户523749 2010-6-27 13:12
lg05128018_230568758 2007-12-3 16:18
好啊