独闷闷网

 找回密码
 立即注册
搜索
查看: 3204|回复: 1
打印 上一主题 下一主题
收起左侧

[原创] 点阵液晶模块2004的C语言驱动程序

[复制链接]
跳转到指定楼层
楼主
发表于 2013-12-21 01:03:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
//来自电子开发者论坛
#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>


#ifndef LCD1602_HEADER_FILE
#define LCD1602_HEADER_FILE
//=======================================
//LCD16B20引脚图
// 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16
// |  |  |  |  |  |  |__|__|__|__|__|__|__|  |  |
//GND |  VO RS |  E              |           +  -
//   VCC      R/W              DATA PORT      LED
//定义数据接口位数
#define LCD_DL      8


//晶振频率设定(MHZ)
#define Fosc      12
//是否有自定义的字符(CustomChar为自定义字符的个数)
#define CustomCharCount     8
//函数允许编译声明
#define LCD_EN_readBFAC   1 //只有使用LCD1620该声明必须是1
#define LCD_EN_waitForReady  1 //只有使用LCD1620该声明必须是1
#define LCD_EN_SendCommand  1 //只有使用LCD1620该声明必须是1

#define LCD_EN_reset      1 //调用LCDSetFunction()、LCDSetDisplayModel()、LCDSetInPutModel()、LCDClear()、delaynms()模块
#define LCD_EN_delaynms   1 //如果LCD_EN_reset=1,则LCD_EN_delaynms必须=1
#define LCD_EN_setFunction      1 //如果LCD_EN_reset=1,则LCD_EN_setFunction必须=1
#define LCD_EN_setDisplayModel 1 //如果LCD_EN_reset=1,则LCD_EN_setDisplayModel必须=1
#define LCD_EN_setInputModel    1 //如果LCD_EN_reset=1,则LCD_EN_setInputModel必须=1
#define LCD_EN_clear      1 //如果LCD_EN_reset=1,则LCD_EN_clear必须=1
//可选函数,需要就设置为1,如果不需要设置为0,这样可以节省ROM
#define LCD_EN_light   1
#define LCD_EN_goHome   0
#define LCD_EN_shiftRight  1
#define LCD_EN_shiftLeft  1
#define LCD_EN_cursorRight  0
#define LCD_EN_cursorLeft  0
#define LCD_EN_readData   0
//来自电子开发者论坛
#define LCD_EN_writeData  1  
#define LCD_EN_setXY   1
#define LCD_EN_putChar   1 //如果LCD_EN_putChar=1,则LCD_EN_setXY,LCD_EN_writeData必须=1
#define LCD_EN_printf   1 //如果LCD_EN_printf=1,则LCD_EN_setXY,LCD_EN_writeData必须=1
#define LCD_EN_displayStr  0 //如果LCD_EN_displayStr=1,则LCD_EN_writeData必须=1
#define LCD_EN_clearLine  0 //如果LCD_EN_clearLine=1,则LCD_EN_setXY,LCD_EN_writeData必须=1

#define LCD_Data_Port      P1  //数据端口(AT89S521_01_7=LCD:pin7:pin14) LCD_Data_Port(pin14~pin7,D7~D0)
sbit LCD_RS=P2^0;  //寄存器选择,0表示选择指令寄存器;1表示选择数据寄存器 LCD_RS(pin:4)
sbit LCD_RW=P2^1;  //读写控制,1表示读取;0表示写入 LCD_RW(pin:5)
sbit LCD_EN=P2^2;  //当R/W=0,LCD_EN低电平有效;当R/W=1,LCD_EN高电平有效 LCD_EN(pin:6)
sbit LCD_LED=P2^3;     //背光灯控制

void Delay(unsigned int MS);
//函数接口声明
/********************************************
*  函数说明:LCD复位                        *
*********************************************/
/*
1.延时15ms
2.写入指令:0x38(不检测忙信号)
3.延时5ms
4.写入指令:0x38(不检测忙信号)
5.延时5ms
6.写入指令:0x38(不检测忙信号)
以后读写都要检测忙信号
7.如果定义8位数据接口设置8位数据线,两行显示,字体格式:5*8
(7).如果定义是4为数据接口设置8位数据线,两行显示,字体格式:5*8
8.设置显示画面、光标、光标是否闪烁开关
9.设置输入模式,默认增量方式,画面不动,光标移动
10.清屏
*/
void LCDreset(void);
/*************************************************
*  函数说明:清除指定的一行显示,然后光标回到行首 *
*  输入参数:bit line: 如果line=0,表示是第一行   *
*                      如果line=1,表示是第二行   *
**************************************************/
void LCDclearLine(bit line);
/************************************************************
* 从指定位置开始显示字符串,如果是从第一行开始显示的,但是
* 无法显示完,自动从第二行开始显示,如果还没有显示完,就将余下的
*抛弃;如果是从第二行开始显示的,但是无法显示完,
*就抛弃没有显示的内容.
**************************************************************/
void LCDprintf(unsigned char X,unsigned char Y,char *String);
/********************************************************
*  函数说明:指定XY坐标显示一个字符                     *
*  输入参数:unsigned char X:   X坐标     *
*            unsigned cahr Y:   Y坐标     *
*            char          ch:  被显示的字符   *
********************************************************/
void LCDputChar(unsigned char X,unsigned char Y,char ch);
/********************************************************
*  函数说明:LCD字符串显示函数                          *
********************************************************/
void LCDdisplayStr(char *String);
/**************************************
*  函数说明:背光灯控制               *
*  输入参数: bit onoff                *
***************************************/
void LCDlight(bit onoff);

//光标往左边移动n个字符位置
void LCDcursorLeft(unsigned char n);
//光标往右边移动n个字符位置
void LCDcursorRight(unsigned char n);
//画面和光标一起左边移动n个字符位置
void LCDshiftLeft(unsigned char n);
//画面和光标一起右边移动n个字符位置
void LCDshiftRight(unsigned char n);
//来自电子开发者论坛
/*******************************************************************
*  函数说明:设置数据接口位数是4为还是8位,显示行数是一行还是二行,  *
             字体格式是5*7还是5*10                                 *
*  输入参数: bit DL:  表示数据接口长度,DL=1,表示8位;DL=0,表示4为   *
*            bit N:   表示显示行数,N=1,表示两行;N=0,表示一行       *
*            bit F:   表示字体格式,F=1,表示5*10;F=0,表示5*7        *
********************************************************************/
void LCDsetFunction(bit DL,bit N,bit F);
/***************************************************************
*  函数说明:显示模式设置,设置画面、光标以及光标是否闪烁开关   *
*  输入参数: bit D:  表示画面是否显示                          *
*            bit C:  表示光标是否显示                          *
*            bit B:  表示光标是否闪烁                          *
****************************************************************/
void LCDsetDisplayModel(bit D,bit C,bit B);
/********************************************************
*  函数说明:输入方式设置,设置光标、画面移动方式       *
*  输入参数: bit I_D:表示读写之后AC情况,I_D=1           *
*                              表示AC+1;I_D=0表示AC-1; *
*            bit S:  表示画面是否移动,S=1表示           *
*                              画面平移;S=0表示画面不动 *
********************************************************/
/*
当S=1且数据写入DD RAM中时候,显示将全部左边移动(I_D=1),或者全部右边移动(I_D=0),即光标不移动
当S=0,画面不动,光标移动(左边移动:I_D=0,右边移动:I_D=1)
*/
void LCDsetInputModel(bit I_D,bit S);
/*******************************************************************************
*  函数说明:LCD软复位,DD RAM的内容不变,但光标和光标所在的字符回到左上角原点  *
********************************************************************************/
void LCDgoHome(void);
//=======================================

//来自电子开发者论坛
void Interrupt1 (void) interrupt 2   
{
unsigned char p3_temp;
    P3=0xff;
    Delay(10);
    p3_temp=P3;
    Delay(10);
p3_temp=p3_temp&0x08;
while(p3_temp==0x00)  //P3.3作为暂停和启动按键
    {
    P3=0xff;
    Delay(10);
    p3_temp=P3;
    Delay(10);
p3_temp=p3_temp&0x08;
    }

     P3=0xff;
    Delay(10);
    p3_temp=P3;
    Delay(10);
p3_temp=p3_temp&0x08;
while(p3_temp==0x08)
    {
    P3=0xff;
    Delay(10);
    p3_temp=P3;
    Delay(10);
p3_temp=p3_temp&0x08;
    }

     P3=0xff;
    Delay(10);
    p3_temp=P3;
    Delay(10);
p3_temp=p3_temp&0x08;
while(p3_temp==0x00)
    {
    P3=0xff;
    Delay(10);
    p3_temp=P3;
    Delay(10);
p3_temp=p3_temp&0x08;

    }
}
void Delay(unsigned int MS)
{
        unsigned char us,usn;
        while(MS!=0)
        {
                usn = 2;        //for 12M
                while(usn!=0)
                {
                        us=0xf6;
                        while (us!=0){us--;};
                        usn--;
                }
                MS--;
        }
}
//来自电子开发者论坛
void main(void)  
{
unsigned int i,i_n;
LCDreset();
//外部中断1初始化
IT1 = 0;
EX1 = 1;
EA = 1;//打开中断
while(1)
{
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,0,4);  //清空
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,1,4);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,2,4);
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,3,4);  
// LCDprintf(0,0,"Yabin.CO.Ltd.");
// LCDprintf(0,1,"TEL:075529517345");
// LCDprintf(0,2,"E-ML:yblcm58@163.com");
// LCDprintf(0,3,"www.yab-lcm.com");
  LCDprintf(0,0,"Welcome to use 2004");
  LCDprintf(0,1,"Hello world!");
  LCDprintf(0,2,"1234567890987654321");
  LCDprintf(0,3,"abcdefgHIJKLMNOPQRS");
  
  for(i=0;i<40000;i++);
  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,0,0);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,1,0);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,2,0);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,3,0);  
  for(i=0;i<40000;i++);
  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,0,1);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,1,1);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,2,1);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,3,1);  
  for(i=0;i<40000;i++);
  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,0,2);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,1,2);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,2,2);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,3,2);   
  for(i=0;i<40000;i++);
  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,0,3);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,1,3);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,2,3);  
  for(i_n=0;i_n<20;i_n++)LCDputChar(i_n,3,3);   
  for(i=0;i<40000;i++);

  }
}

#define NOP() _nop_();_nop_();_nop_();_nop_();_nop_();
#if CustomCharCount
unsigned char code CustomChar[CustomCharCount][8]=
{
   {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},   //全选
   {0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A},   //显示点
   {0x1F,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x00},   //显示横
   {0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15},   //显示横竖
   {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},   //显示清空
   {0x00,0x00,0x1F,0x1F,0x0E,0x04,0x00,0x00},
   {0x00,0x00,0x04,0x0E,0x1F,0x1F,0x00,0x00},
   {0x18,0x1B,0x04,0x08,0x08,0x08,0x04,0x03}
};
#endif
/*************************************************
*  函数说明:读取AC地址                          *
*  输出参数: unsigned char AC:  表示AC地址
**************************************************/
#if LCD_EN_readBFAC
unsigned char LCDreadBFAC(void)
{
unsigned char redata;
#if LCD_DL<8
unsigned char temp;
#endif
LCD_RS=0;//选择指令寄存器
NOP();
LCD_RW=1;//读取指令寄存器
NOP();
#if LCD_DL>4
P0=0xff;
LCD_EN=1;
NOP();
redata=P0;
#else
P0=P0 | 0xf0;
LCD_EN=1;
NOP();
redata=P0;
LCD_EN=0;
redata=redata & 0xf0;
NOP();
LCD_EN=1;
NOP();
temp=P0;
LCD_EN=0;
temp=temp>>4;
temp=temp & 0xf;
redata=redata | temp;
#endif
return (redata);
}
#endif
/*************************************************
*  函数说明:等等LCD16B20空闲                    *
**************************************************/
#if LCD_EN_waitForReady
void LCDwaitForReady(void)
{
unsigned char i,re;
i=100;
do
   {
     re=LCDreadBFAC();
     if((re & 0x80)==0)
       break;  
   } while(i--!=0);
}
#endif

/********************************************************
*  函数说明:向LCD发送指令函数                          *
*  输入:    需要发送的指令                             *
********************************************************/
#if LCD_EN_SendCommand
void LCDSendCommand(unsigned char Command)
{
#if LCD_DL<8
unsigned char order;
#endif
LCDwaitForReady();
LCD_RS=0;//选择指令寄存器
NOP();
LCD_RW=0;//MCU向LCD写入命令数据
NOP();
#if LCD_DL>4
LCD_Data_Port=Command;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
#else
{
order=Command;
order=order & 0xf0;
LCD_Data_Port=LCD_Data_Port & 0xf;
LCD_Data_Port=LCD_Data_Port | order;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
order=Command;
order=order & 0xf;
order=order << 4;
LCD_Data_Port=LCD_Data_Port & 0xf;
LCD_Data_Port=LCD_Data_Port | order;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
}
#endif
}
#endif

/*********************************************************************
*  函数说明:LCD清屏,DD RAM的内容被清除,光标回到左上角原点,AC=0    *
**********************************************************************/
#if LCD_EN_clear
void LCDclear(void)
{
LCDSendCommand(0x1);
}
#endif

/*******************************************************************************
*  函数说明:LCD软复位,DD RAM的内容不变,但光标和光标所在的字符回到左上角原点  *
********************************************************************************/
#if LCD_EN_goHome
void LCDgoHome(void)
{
LCDSendCommand(0x2);
}
#endif
/********************************************************
*  函数说明:输入方式设置,设置光标、画面移动方式       *
*  输入参数: bit I_D:表示读写之后AC情况,I_D=1           *
*                              表示AC+1;I_D=0表示AC-1; *
*            bit S:  表示画面是否移动,S=1表示           *
*                              画面平移;S=0表示画面不动 *
********************************************************/
/*
当S=1且数据写入DD RAM中时候,显示将全部左边移动(I_D=1),或者全部右边移动(I_D=0),即光标不移动
当S=0,画面不动,光标移动(左边移动:I_D=0,右边移动:I_D=1)
*/
#if LCD_EN_setInputModel
void LCDsetInputModel(bit I_D,bit S)
{
unsigned char order;
order=0x4;
if(I_D)
   order=order+0x2;
if(S)
   order=order+0x1;
LCDSendCommand(order);
}
#endif

/***************************************************************
*  函数说明:显示模式设置,设置画面、光标以及光标是否闪烁开关   *
*  输入参数: bit D:  表示画面是否显示                          *
*            bit C:  表示光标是否显示                          *
*            bit B:  表示光标是否闪烁                          *
****************************************************************/
#if LCD_EN_setDisplayModel
void LCDsetDisplayModel(bit D,bit C,bit B)
{
unsigned char order;
order=0x8;
if(D)
  order=order+0x4;
if(C)
  order=order+0x2;
if(B)
  order=order+0x1;
LCDSendCommand(order);
}
#endif

//画面和光标一起右边移动n个字符位置
#if LCD_EN_shiftRight
void LCDshiftRight(unsigned char n) //shift by n characters Right
{
unsigned char i;
for(i=0;i<n;i++)
   LCDSendCommand(0x1e);   
}
#endif
//-----------------------------------------------------------------
//画面和光标一起左边移动n个字符位置
#if LCD_EN_shiftLeft
void LCDshiftLeft(unsigned char n) //shift by n characters Left
{
unsigned char i;
for(i=0;i<n;i++)
   LCDSendCommand(0x18);
}
#endif
//-----------------------------------------------------------------
//光标往右边移动n个字符位置
#if LCD_EN_cursorRight
void LCDcursorRight(unsigned char n) //shif cursor right by n
{
unsigned char i;
for(i=0;i<n;i++)
   LCDSendCommand(0x14);
}
#endif
//------------------------------------------------------------------
//光标往左边移动n个字符位置
#if LCD_EN_cursorLeft
void LCDcursorLeft(unsigned char n) //Shift cursor left by n
{
unsigned char i;
for(i=0;i<n;i++)
   LCDSendCommand(0x10);
}
#endif
//------------------------------------------------------------------

/*******************************************************************
*  函数说明:设置数据接口位数是4为还是8位,显示行数是一行还是二行,  *
             字体格式是5*7还是5*10                                 *
*  输入参数: bit DL:  表示数据接口长度,DL=1,表示8位;DL=0,表示4为   *
*            bit N:   表示显示行数,N=1,表示两行;N=0,表示一行       *
*            bit F:   表示字体格式,F=1,表示5*10;F=0,表示5*7        *
********************************************************************/
#if LCD_EN_setFunction
void LCDsetFunction(bit DL,bit N,bit F)
{
unsigned char order;
order=0x20;
if(DL)
  order=order+0x10;
if(N)
  order=order+0x8;
if(F)
  order=order+0x4;
LCDSendCommand(order);
}
#endif

/**************************************************
*  函数说明:设置CG RAM地址                       *
*  输入参数: unsigned char CG:  表示CG RAM地址    *
***************************************************/
#if CustomCharCount
void LCDsetCGRAMAddress(unsigned char CG)
{
unsigned char order;
order=0x40;
order=order+CG;
LCDSendCommand(order);
}
#endif

/*************************************************
*  函数说明:MCU向LCD16B20写入数据               *
*  输入参数: unsigned char DATA                  *
**************************************************/
#if LCD_EN_writeData
void LCDwriteData(unsigned char DATA)
{
#if LCD_DL<8
unsigned char d;
#endif
LCDwaitForReady();
LCD_RS=1;//选择数据寄存器
NOP();
LCD_RW=0;//MCU向LCD写入
NOP();
#if LCD_DL>4
LCD_Data_Port=DATA;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
#else
d=DATA & 0xf0;
LCD_Data_Port=LCD_Data_Port & 0xf;
LCD_Data_Port=LCD_Data_Port | d;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
d=DATA & 0xf;
d=d<<4;
d=d & 0xf0;
LCD_Data_Port=LCD_Data_Port & 0xf;
LCD_Data_Port=LCD_Data_Port | d;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
#endif
}
#endif

/*************************************************
*  函数说明:MCU向LCD16B20读取数据               *
*  输出参数: unsigned char DATA                  *
**************************************************/
#if LCD_EN_readData
unsigned char LCDreadData(void)
{
unsigned char redata;
#if LCD_DL<8
unsigned char temp;
#endif
LCDwaitForReady();
LCD_RS=1;//选择数据寄存器
NOP();
LCD_RW=1;//读取数据寄存器
NOP();
#if LCD_DL>4
LCD_Data_Port=0xff;
LCD_EN=1;
NOP();
redata=LCD_Data_Port;
LCD_EN=0;
#else
LCD_Data_Port=LCD_Data_Port | 0xf0;
LCD_EN=1;
NOP();
redata=LCD_Data_Port;
LCD_EN=0;
redata=redata & 0xf0;
NOP();
LCD_EN=1;
NOP();
temp=LCD_Data_Port;
LCD_EN=0;
temp=temp >>4;
temp=temp & 0xf;
redata=redata | temp;
#endif
return (redata);
}
#endif

/**************************************
*  函数说明:背光灯控制               *
*  输入参数: bit onoff                *
***************************************/
#if LCD_EN_light
void LCDlight(bit onoff)
{
LCD_LED=!onoff;
}
#endif

/***********************************************
*  函数说明:设置显示坐标函数                  *
************************************************/
//控制器内部带有80个*8位RAM(即80字节RAM),对于关系:
//第一行:00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10......27(40个)
//第二行:40,41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F,50......67(40个)
//第一行首个地址为:0x80+00;
//第二行首个地址为:0x80+0x0x40+00,即:0xc0+00
#if LCD_EN_setXY
void LCDsetXY(unsigned char X,unsigned char Y)
{
    unsigned char Address;
    if(X>39)
      X=39;
    if (Y == 0)
{
     Address =X;
}
    else if(Y == 1)
{
        Address = 64+ X;
}
    else if(Y == 2)
{
        Address = 20 + X;
}
    else if(Y == 3)
{
        Address = 84 + X;
}
      Address =Address + 128;
    LCDSendCommand(Address);
}
#endif

/********************************************************
*  函数说明:LCD字符串显示函数                          *
********************************************************/
#if LCD_EN_displayStr
void LCDdisplayStr(char *String)
{
while(*String)
{
  LCDwriteData(*String);
  String++;
}
}
#endif

/********************************************************
*  函数说明:指定XY坐标显示一个字符                     *
*  输入参数:unsigned char X:   X坐标     *
*            unsigned cahr Y:   Y坐标     *
*            char          ch:  被显示的字符   *
********************************************************/
#if LCD_EN_putChar
void LCDputChar(unsigned char X,unsigned char Y,char ch)
{
LCDsetXY(X,Y);
LCDwriteData((unsigned char)ch);
}
#endif

/************************************************************
* 从指定位置开始显示字符串,如果是从第一行开始显示的,但是
* 无法显示完,自动从第二行开始显示,如果还没有显示完,就将余下的
*抛弃;如果是从第二行开始显示的,但是无法显示完,
*就抛弃没有显示的内容.
**************************************************************/
#if LCD_EN_printf
void LCDprintf(unsigned char X,unsigned char Y,char *String)
{
if(Y==0)
  {
    if(X<20)
     {
       LCDsetXY(X,Y);
       for(;X<20 && *String!='\0';X++)
        {
          LCDwriteData((unsigned char)*String);
          String++;
        }
       if(*String!='\0')
        {
          X=0;
          Y=1;
        }
     }
  }
if(Y==1)
  {
   LCDsetXY(X,Y);
   for(;X<20 && *String!='\0';X++)
    {
     LCDwriteData((unsigned char)*String);
     String++;
    }
  if(*String!='\0')
    {
          X=0;
          Y=2;
    }
  }
  
if(Y==2)
  {
   LCDsetXY(X,Y);
   for(;X<20 && *String!='\0';X++)
    {
     LCDwriteData((unsigned char)*String);
     String++;
    }
  if(*String!='\0')
        {
          X=0;
          Y=3;
        }
  }
if(Y==3)
  {
   LCDsetXY(X,Y);
   for(;X<20 && *String!='\0';X++)
    {
     LCDwriteData((unsigned char)*String);
     String++;
    }
  if(*String!='\0')
        {
          X=0;
          Y=4;
        }
  }
}
#endif

/*************************************************
*  函数说明:清除指定的一行显示,然后光标回到行首 *
*  输入参数:bit line: 如果line=0,表示是第一行   *
*                      如果line=1,表示是第二行   *
**************************************************/
#if LCD_EN_clearLine
void LCDclearLine(bit line)
{
unsigned char i;
if(line) //第二行
  LCDsetXY(0,1);
else     //第一行
  LCDsetXY(0,0);  
for(i=0;i<16;i++)
  LCDwriteData(' '); //向LCD写入16个空格
if(line) //回到第二行的第一个位置
  LCDsetXY(0,1);
else     //回到第一行的第一个位置
  LCDsetXY(0,0);  
}
#endif
//--------------------------------------------------
//延时nms函数
#if LCD_EN_delaynms
void delaynms(unsigned char n)
{
  unsigned char i,j,k;
  i=1;
#if Fosc>6
  i=2;
#endif
  for(;i>0;i--)
   {
     for(j=0;j<n;j++)
      {
        for(k=0;k<166;k++);
        for(k=0;k<166;k++);
      }
   }
}
#endif
//将自定义字符写进CGRAM中
#if CustomCharCount
void LCDloadUserChar(unsigned char code *  p)
{
unsigned char i,j;
for(i=0;i<CustomCharCount;i++)
  {
   for(j=0;j<8;j++)
   {  
    LCDsetCGRAMAddress(8*i+j);
    LCDwriteData(*p);
    p++;
   }
  }
}
#endif

/********************************************
*  函数说明:LCD复位                        *
*********************************************/
/*
1.延时15ms
2.写入指令:0x38(不检测忙信号)
3.延时5ms
4.写入指令:0x38(不检测忙信号)
5.延时5ms
6.写入指令:0x38(不检测忙信号)
以后读写都要检测忙信号
7.如果定义8位数据接口设置8位数据线,两行显示,字体格式:5*8
(7).如果定义是4为数据接口设置8位数据线,两行显示,字体格式:5*8
8.设置显示画面、光标、光标是否闪烁开关
9.设置输入模式,默认增量方式,画面不动,光标移动
10.清屏
*/
#if LCD_EN_reset
void LCDreset(void)
{
delaynms(15); //延时15ms
LCD_EN=0;
LCD_RS=0;//选择指令寄存器
NOP();
LCD_RW=0;//MCU向LCD写入命令数据
NOP();
#if LCD_DL>4
LCD_Data_Port=0x38;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCDsetFunction(1,1,1); //设置8位数据线,两行显示,字体格式:5*8
#else
LCD_Data_Port=LCD_Data_Port & 0x3f;
LCD_Data_Port=LCD_Data_Port | 0x30;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCD_EN=1;
NOP();
LCD_EN=0;
delaynms(5);
LCDsetFunction(0,1,1); //设置4位数据线,两行显示,字体格式:5*7
#endif

LCDsetDisplayModel(1,0,0);//设置显示画面、光标、光标是否闪烁开
LCDsetInputModel(1,0);//设置输入模式,默认增量方式,画面不动,光标向右边移动
LCDclear();
#if CustomCharCount
LCDloadUserChar(CustomChar[0]);
#endif
}
#endif

乐于分享,勇于质疑!
沙发
发表于 2013-12-21 10:03:08 | 只看该作者
看看,顶一个
乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-4-24 21:12 , Processed in 0.168803 second(s), 17 queries .

快速回复 返回顶部 返回列表