1602液晶显示模块驱动

/*      本驱动主要提供1602液晶显示模块的读写操作,可以完成1602显示模块的绝大多数操作,如有特殊的操作请适当更改函数的调用
        提供以下几个函数可供调用
********************************************************************************************************
* 1.  lcd_init()    用于lcd初始化                                                                                                                       *
* 2.    comm_send(unsigned char a)用于控制命令发送                                                                                          *
* 3.  data_send(unsigned char a)   用于数据发送                                                                                              *
* 4.    lcd_pos(unsigned char a)用于lcd显示定位  第一行为00H开始,第二行为40H开始                                                                      *
* 5.   lcd_disp(unsigned char *a)用于lcd显示字符串                                                                                                                    *
* 6.    lcd_clear()用于清除屏                                                                                                                                                    *
* 7.    lcd_disp_long(unsigned long x,unsigned char y)用于显示数字,不能大于8位 第一个参数为要显示的数 第二个参数为要显示的位数      *
********************************************************************************************************

 使用时请将下面三个位连线重新设置为硬件实际连接
 使用时请修改lcd_Delay_ms函数中的lcd_Base_1ms()调用参数为实际的时钟频率,单位为MHZ
*/
sbit lcd_rs= P2^6;    //此处定义lcd的rs端与P2.6连接
sbit lcd_rw= P2^5;    //此处定义lcd的rw端与P2.5连接
sbit lcd_en= P2^7;    //此处定义lcd的EN端与P2.7连接
nop(void)      //此处定义空操作
{
}
//以下定义一个基本的延时函数,用于产生1MS的延时
//入口参数为单片机的时时钟频率
void lcd_Base_1ms(unsigned time)
{
 unsigned char i,j;
 for(i=0;i<8;i++)
  for(j=0;j<4*time/10;j++);
}
//以下定义一个延时函数,用于MS级延时
//入口参数为延时多少个MS,不得大于250
 void lcd_Delay_ms(unsigned time)
 {
   unsigned a;
 for (a=0;a<=time;a++)
 {
  lcd_Base_1ms(12);
 }
 }
lcd_read() //此处定义lcd状态读取函数
{
 bit sta;
 lcd_rs=0;
 lcd_rw=1;
 lcd_en=1;
 sta=(bit)(P0&0x80);
 lcd_en=0;
 return sta;
}
comm_send(unsigned char a)//此处定义命令发送函数
{
 while(lcd_read())
    nop();
 nop();
 lcd_rs=0;
 lcd_rw=0;
 lcd_en=0;
 P0=a;
 nop();
 nop();
 lcd_en=1;
 nop();
 nop();
 nop();
 lcd_en=0;
        lcd_Delay_ms(15);
}
data_send(unsigned char a)   //此处定义数据发送函数
{
  while(lcd_read());
    nop();
 nop();
 nop();
 nop();
 nop();
 nop();
 lcd_rs=1;
 lcd_rw=0;
 lcd_en=0;
 P0=a;
 nop();
 nop();
 lcd_en=1;
 nop();
 nop();
 nop();
 lcd_en=0;
}
lcd_init()    //此处定义lcd初始化函数
{
  comm_send(56); //设置为16X2显示,5X7点阵,8位数据接口
  lcd_Delay_ms(15);
  comm_send(15);//设置为打开显示,显示光标,光标闪烁.
  lcd_Delay_ms(15);
  comm_send(6);//设置显示一个字符后地址为加1;
  lcd_Delay_ms(15);
  comm_send(1);//清屏
  lcd_Delay_ms(15);
}
lcd_pos(unsigned char a)//此处定义lcd显示定位函数  第一行为00H开始,第二行为40H开始
{        
  comm_send(128+a);
}
lcd_disp(unsigned char *a)  //此处定义lcd显示字符串函数
{
 while(*a!='\0')
 {
  data_send(*a++);
 }
}
lcd_clear()//此处定义清除屏幕函数
{
 comm_send(1);
}
lcd_disp_long(unsigned long x,unsigned char y)  //此处定义lcd显示字符串函数
{
 unsigned char d[8]={0,0,0,0,0,0,0,0};
 char b;
 unsigned char c;
 for(b=0;b<8;b++)
 {
  c=x/10*10;
  d[b]=(x-c)+48;
  x=x/10;
 }
 for(b=y-1;b>=0;b--)
  {
 
  data_send(d[b]);
 
  }
 
}

posted @ 2011-12-26 06:40  刘静海  阅读(251)  评论(0)    收藏  举报