日志档案

发表于 2007-11-15 16:30:53

1

标签: 8051  LCD1602  4线模式  

LCD1602 4线并口通信源程序

 

终于搞定了这个程序,哈哈

/****************************************************************/                                                                            
/*  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);         
  }
}

系统分类: 单片机   |   用户分类: 51单片机   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(852)    回复(1)  

投一票您将和博主都有获奖机会!