×
单片机 > 单片机程序设计 > 详情

1602LCD模块的C51驱动程序

发布时间:2020-06-08 发布时间:
|

手上有一片1602的LCD,ks0066的驱动芯片,带LED背光.参考网站上的一些资料,写了个驱动程序,写完了才发现,跟网上流传的代码基本上差不多

/*=======================================

                          1602lcd模块驱动程序

==========================================

说明:1.晶体:11.0592MHz

      2.1602驱动:ks0066

    

******************************************/

#i nclude

#i nclude

#define lcm_rs P2_7             //寄存器选择

#define lcm_rw P2_6         //读/写控制

#define lcm_e P2_5             //读/写使能

#define lcm_blk P2_4         //背光led    1.off 0.on

#define lcm_data P0

//函数声明

void delay5ms(void);

void delay400ms(void);

void lcm_write_command(unsigned char wc_lcm,busy_c);

/***********************************

//函数名称:     void lcm_ini(void)

//传递参数:     无

//返 回 值:     无

//函数功能:     LCM初始化

//函数说明:

***********************************/

void lcm_ini(void)

{

     lcm_data = 0;

     lcm_write_command(0x38,0);         //16*2显示,5*7点阵,8位数据接口,不检测忙

     delay5ms();

     lcm_write_command(0x38,0);

     delay5ms();

     lcm_write_command(0x38,0);         //三次显示模式, 不检测忙

     delay5ms();

     lcm_write_command(0x38,1);         //16*2显示,5*7点阵,8位数据接口,需要检测忙

     lcm_write_command(0x80,1);         //关闭显示

     lcm_write_command(0x01,1);         //clear显示    

     lcm_write_command(0x06,1);         //指针和光标+1,不滚屏

     lcm_write_command(0x0c,1);         //开显示,不显示光标

}

/***********************************

//函数名称:     unsigned char lcm_read_status(void)

//传递参数:     无

//返 回 值:     unsigned char

//函数功能:     读lcm状态,等待lcm空闲

//函数说明:     DB7=1,忙

***********************************/

unsigned char lcm_read_status(void)

{

     lcm_data=0xff;

     lcm_rs=0;

     lcm_rw=1;

     lcm_e=0;

     lcm_e=0;

     lcm_e=1;

     while(lcm_data & 0x80);

     return lcm_data;

}

/***********************************

//函数名称:     void lcm_write_data(unsigned char wd_lcm)

//传递参数:     unsigned char   wd_lcm

//返 回 值:     无

//函数功能:     lcm写数据

//函数说明:    

***********************************/

void lcm_write_data(unsigned char wd_lcm)

{

     lcm_read_status();             //判断lcm忙标志

     lcm_data = wd_lcm;

     lcm_rs = 1;

     lcm_rw = 0;

     lcm_e = 0;

     lcm_e = 0;

     lcm_e = 1;

}

/***********************************

//函数名称:     void lcm_write_command(unsigned char wc_lcm, busy_c)

//传递参数:     unsigned char wc_lcm, busy_c

//返 回 值:     无

//函数功能:     lcm写命令

//函数说明:     busy_c=0是,不用检测忙信号

***********************************/

void lcm_write_command(unsigned char wc_lcm, busy_c)

{

     if (busy_c)

         lcm_read_status();

     lcm_data = wc_lcm;

     lcm_rs=0;

     lcm_rw = 0;

     lcm_e = 0;

     lcm_e = 0;

     lcm_e = 1;

}

/***********************************

//函数名称:     void disp_one_char(unsigned char x, unsigned char y,unsigned char disp_data)

//传递参数:     unsigned char x, unsigned char y,unsigned char disp_data

//返 回 值:     无

//函数功能:     指定位置显示一个字符

//函数说明:    

***********************************/

void disp_one_char(unsigned char x,unsigned char y,unsigned disp_data)

{

     y = y&0x01;

     x = x&0x0f;                   //限制2行,没行15个字

     if (y)

         x =x + 0x40;           //算RAM地址

     x = x + 0x80;

     lcm_write_command(x,0);

     lcm_write_data(disp_data);

}

/***********************************

//函数名称:     void disp_one_char(unsigned char x, unsigned char y,unsigned char *disp_data)

//传递参数:     unsigned char x, unsigned char y,unsigned char *disp_data

//返 回 值:     无

//函数功能:     指定位置显示一串字符

//函数说明:    

***********************************/    

void disp_list_char(unsigned char x,unsigned char y,unsigned char *disp_data)    

{

     unsigned char char_length,j;

     char_length = strlen(disp_data);

     y = y&0x1;

     x = x&0x0f;

     for (j=0;j

     {

         disp_one_char( x,y,disp_data[j]);         //显示一个字符

         x++;

     }

}

/***********************************

//函数名称:     void delay5ms(void)

//传递参数:     无

//返 回 值:     无

//函数功能:     延时5MS

//函数说明:

***********************************/

void delay5ms(void)

{

     unsigned int TempCyc = 5552;

     while(TempCyc--);

}

/***********************************

//函数名称:     void delay400ms(void)

//传递参数:     无

//返 回 值:     无

//函数功能:     L延时400MS

//函数说明:     LCM开机延时

***********************************/

void delay400ms(void)

{

     unsigned char TempCycA = 5;

     unsigned int TempCycB;

     while(TempCycA--)

     {

         TempCycB=7269;

         while(TempCycB--);

     };

}

/*****d******************************

//函数名称:     void main(void)

//传递参数:     无

//返 回 值:     无

//函数功能:     主函数

//函数说明:    

************************************/

void main(void)

{

     delay400ms();

     lcm_ini();

                 disp_list_char(1,0,"Welcome");

                 disp_list_char(1,0,"www.dzkjcn.com")

                 while(1);

}

以上的程序只是简单的显示两行字符,没有滚屏和背光

4线液晶1602的C51程序

----------------------------------

|     LCM-----51  |   LCM-----51 | 

----------------------------------

|RS-----P2.1       | DB4-----P1.4 |

|RW-----P2.0       | DB5-----P1.5 |

|E -----P2.2       | DB6-----P1.6 |

|VLCD接1K电阻到GND| DB7-----P1.7 |

---------------------------------------------------

[注:AT89S51使用12M晶振]

=============================================================*/

void writelcd(bit command,unsigned char ddata)

{

ReadStatusLCM(); //检测忙

LCM_Data = (ddata&0xf0)|(P1&0x0f);

LCM_RW = 0;

if(command==0) LCM_RS = 0; else LCM_RS=1;

LCM_E = 1;

LCM_E = 0;

LCM_E = 0;

LCM_Data = ((ddata<<4)&0xf0)|(P1&0x0f);

if(command==0) LCM_RS = 0; else LCM_RS=1;

LCM_E = 1;

LCM_E = 0;

LCM_E = 0;

}


//读状态

unsigned char ReadStatusLCM(void)

{

P1_7=1;

LCM_RS = 0;

LCM_RW = 1;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1;

while(P1_7&0x01);//检测忙信号

return(P1_7);

}

void LCMInit(void) //LCM初始化

{

LCM_Data=0xff;

writelcd(0,0x28); //三次显示模式设置,不检测忙信号

Delay5Ms();

writelcd(0,0x28);

Delay5Ms();

writelcd(0,0x28);

Delay5Ms();

writelcd(0,0x28); //显示模式设置,开始要求每次检测忙信号

writelcd(0,0x0c); // 显示开及光标设置

writelcd(0,0x01); //显示清屏

writelcd(0,0x06); // 显示光标移动设置

}

//按指定位置显示一个字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

{

Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1

if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;

X |= 0x80; //算出指令码

writelcd(0,X);

writelcd(1,DData);

}

//按指定位置显示一串字符   ***原来的遇到空格0x20就不显示***

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)

{

   unsigned char ListLength,j;

   ListLength = strlen(DData);

   Y &= 0x1;

   X &= 0xF; //限制X不能大于15,Y不能大于1

       if (X <= 0xF) //X坐标应小于0xF

         {

       for(j=0;j

         {

              DisplayOneChar(X, Y, DData[j]); //显示单个字符

              X++;

             }

         }

}

//5ms延时

void Delay5Ms(void)

{

unsigned int TempCyc = 5552;

while(TempCyc--);

}

//400ms延时

void Delay400Ms(void)

{

unsigned char TempCycA = 5;

unsigned int TempCycB;

while(TempCycA--)

{

   TempCycB=7269;

   while(TempCycB--);

};

}

/////LCM_end///////


关键字:1602LCD模块  C51  驱动程序 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的电子存包柜的软件设计