afei9527的笔记 https://bbs.21ic.com/?576826 [收藏] [复制] [RSS]

日志

驱动lcd602_4bit

已有 586 次阅读2011-12-28 04:43 |个人分类:51单片机|系统分类:单片机| 51单片机


#include "reg51.h"
#define uchar unsigned char
#define port P3
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********************************
  ***00000  5*7  -> 0xff
  *****0** /5*8     0x40
  *****0**    0x40  ----> I
  *****0**    0x40  ---->
  *****0**    0x40
  *****0**    0x40
  ***00000    0x1f
  添加自己的自定义字符
***********************************/
code uchar ziku[]=
{
0x04,0x05,0x06,0x07,0x13,0x16,0X15,0x0C,
0xff,0xff,0x55,0xff,0x55,0xff,0xff,0xff
};


/*************************************
      函数声明区
*************************************/
uchar lcd_readcom(void);
void  check_busy(void);
void  lcd_writecom(uchar dat);
uchar lcd_readdat(void);
void  lcd_writedat(uchar dat);
void  lcd_gets(char *dat);
void  lcd_xy(uchar x,uchar y);
void  lcd_init(void);



/*******************************
   读取lcd1602状态  
*******************************/
uchar lcd_readcom(void)
{
  uchar temp;
  e=0;
  port=0xff;
  rs=0;
  rw=1;
  e=1;
  temp=port;
  e=0;
  e=0;
  port=0xff;
  rs=0;
  rw=1;
  e=1;
  temp=port>>4;
  e=0;
  return temp;


}
/***************************************
   检测 lcd 是否忙碌   阿飞天天忙绿
***************************************/
void check_busy(void)
{
   uchar temp;
   do{
   temp=lcd_readcom();
     }while((temp&0x80)==0x80);
}
/*****************************************
      向lcd里写命令
*****************************************/
void lcd_writecom(uchar dat)
{
check_busy();
 e=0;
 rs=0;
 rw=0;
 e=1;
 port=dat;
 e=0;
 e=0;
 rs=0;
 rw=0;
 e=1;
 port=dat<<4;
 e=0;
}
/***************************************
   读取lcd对应地址数据
*****************************************/
uchar lcd_readdat(void)
{
  uchar temp;
  check_busy();
  e=0;
  port=0xff;
  rs=1;
  rw=1;
  e=1;
  temp=port;
  e=0;
  e=0;
  port=0xff;
  rs=1;
  rw=1;
  e=1;
  temp|=port>>4;
  e=0;
  return temp;
}
/****************************************
       向lcd里写数据
****************************************/
void lcd_writedat(uchar dat)
{
check_busy();
 e=0;
 rs=1;
 rw=0;
 e=1;
 port=dat;
 e=0;
 e=0;
 rs=1;
 rw=0;
 e=1;
 port=dat<<4;
 e=0;
}
/****************************************
     向lcd写字符串
*****************************************/
void lcd_gets(char *dat)
{
 while(*dat!=0)
 {
 
 lcd_writedat(*dat);
 dat++;
 }
}
/*****************************************
      确定要写的位子即x y 坐标
******************************************/
void lcd_xy(uchar x,uchar y)
{
 switch(y)
 {
  case 0:lcd_writecom(0x80+x);break;
  case 1:lcd_writecom(0xc0+x);break;
 
 }
}
/****************************************************
 单行显示才有5*10  其他5*8 MODE=1 5*8  MODE=0 5*10
****************************************************/
add_custom_word(uchar *dat,uchar len,uchar mode)
 {
  uchar n,m;
  for(n=0;n<len;n++)
    {
  if(mode)
  {
   lcd_writecom(0x40+8*n);
    for(m=0;m<8;m++)
       {
    lcd_writedat(*dat);
     dat++;
    }
   }
   else
    {
    lcd_writecom(0x40+10*n);
    for(m=0;m<10;m++)
       {
    lcd_writedat(*dat);
     dat++;
    }
   }


 }
 }
/********************************************
   初始化lcd
********************************************/
void lcd_init()
{
 lcd_writecom(0x02) ;
 lcd_writecom(0x2c) ;
 lcd_writecom(0x40) ;
 lcd_writecom(0x0c) ;
 add_custom_word(ziku,2,1); //初始化自定义字符


}
/**********************************************
   主程序 实现显示
***********************************************/
main()
{
 lcd_init();
 lcd_xy(0,0);
 lcd_gets("  I LOVE YOU");
 lcd_xy(0,1);
 lcd_gets("afei time:12:00");
 lcd_xy(0,0);
 lcd_writedat(0);
 lcd_xy(15,0);
 lcd_writedat(1);
  while(1);
}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)