⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd1602.h

📁 单片机开发的一个完整性
💻 H
字号:
/*--------------------------------------------------------------------------
LCD1602.H

The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __LCD1602_H__
#define __LCD1602_H__

/*连接线图: 
---------------------------------------------------
| LCM-----51  | LCM-----51  | LCM------51     |
| ----------------------------------------------- |
| DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0     |
| DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1     |
| DB2-----P0.2 | DB6-----P0.6 | E--------P2.2     |
| DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |
---------------------------------------------------

//*********** 引脚定义引脚********************************/
#define LCM_RS   P2_0        // 数据/命令选择信号 
#define LCM_RW   P2_1        // 读/写选择信号
#define LCM_E    P2_2        // 使能信号

#define LCM_Data P0          // 显示数据端口
#define Busy     0x80        // 用于检测LCM状态字中的Busy标识

#define uchar unsigned char
#define uint unsigned int

//================================ LCM1602控制部分 =========================================================

/***************************************************** 
 函 数 名:void Delay_LCD(void)
 功    能:5ms延时
 说    明:LCD显示延时
 入口参数:无
 返 回 值:无  
 *****************************************************/
void Delay_LCD(void)
{
  uint TempCyc = 5552; // 放入延时数据
  while(TempCyc--);
}

/***************************************************** 
 函 数 名:uchar ReadStatusLCM()
 功    能:读忙状态
 说    明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替
 入口参数:无 
 返 回 值:LCM_Data  
 *****************************************************/
//读状态
uchar ReadStatusLCM(void)
{
  LCM_Data = 0xFF;         // LCM数据口先置1
  LCM_RS = 0;
  LCM_RW = 1;
  LCM_E = 0;
  LCM_E = 0;
  LCM_E = 1;
  while (LCM_Data & Busy); // 检测忙信号.如果忙,则不执行
  return(LCM_Data);        // 不忙返回读取数据
}

/***************************************************** 
 函 数 名:void WriteDataLCM()
 功    能:向LCM1602中写入数据
 说    明:将形参WDLCM中的数据写入LCM中
 入口参数:WDLCM 
 返 回 值:无  
 *****************************************************/
//写数据
void WriteDataLCM(uchar WDLCM)
{
  ReadStatusLCM();  // 检测忙
  LCM_Data = WDLCM; // 写入数据到LCM
  LCM_RS = 1;
  LCM_RW = 0;
  LCM_E = 0;        // 若晶振速度太高可以在这后加小的延时
  LCM_E = 0;        // 延时
  LCM_E = 1;
}

/***************************************************** 
 函 数 名:void WriteCommandLCM()
 功    能:向LCM1602中写入指令
 说    明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测
 入口参数:WCLCM,BuysC 
 返 回 值:无  
 *****************************************************/
//写指令
void WriteCommandLCM(uchar WCLCM,BuysC) // BuysC为0时忽略忙检测
{
  if (BuysC) ReadStatusLCM();           // 根据需要检测忙
  LCM_Data = WCLCM;                     // 写入指令
  LCM_RS = 0;
  LCM_RW = 0; 
  LCM_E = 0;
  LCM_E = 0;
  LCM_E = 1; 
}

/***************************************************** 
 函 数 名:void LCMInit() 
 功    能:初始化LCM1602
 说    明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作
 入口参数:无 
 返 回 值:无  
 *****************************************************/
//LCM初始化
void LCMInit(void) 
{
  LCM_Data = 0;
  WriteCommandLCM(0x38,0); // 三次显示模式设置,不检测忙信号
  Delay_LCD(); 
  WriteCommandLCM(0x38,0); // 0x38指令表示:8位数据显示模式,俩行多显示
  Delay_LCD(); 
  WriteCommandLCM(0x38,0);
  Delay_LCD(); 
  WriteCommandLCM(0x38,1); // 显示模式设置,开始要求每次检测忙信号
  WriteCommandLCM(0x08,1); // 关闭显示
  WriteCommandLCM(0x01,1); // 显示清屏
  WriteCommandLCM(0x06,1); // 显示光标移动设置
  WriteCommandLCM(0x0C,1); // 显示开及光标设置
}

/***************************************************** 
 函 数 名:void DisplayOneChar()
 功    能:按指定坐标中写入数据
 说    明:X-横坐标,Y-纵坐标,DData为ASCII值
 入口参数:X,Y,DData
 返 回 值:无  
 *****************************************************/
//按指定位置显示一个字符
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
  Y &= 0x01;
  X &= 0x0F;              // 限制X不能大于15,Y不能大于1
  if (Y) X |= 0x40;       // 当要显示第二行时地址码+0x40;
  X |= 0x80;              // 算出指令码
  WriteCommandLCM(X, 0);  // 这里不检测忙信号,发送地址码
  WriteDataLCM(DData);
}

/***************************************************** 
 函 数 名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
 功    能:向指定坐标中写入字符串
 说    明:X-横坐标,Y-纵坐标
 入口参数:X,Y,*DData 
 返 回 值:无  
 *****************************************************/
//按指定位置显示一串字符  ***原来的遇到空格0x20就不显示***
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
  uchar ListLength,j;
  ListLength = strlen(DData);                // strlen:读取字符串的长度
  Y &= 0x1;
  X &= 0xF;                                  // 限制X不能大于15,Y不能大于1
      if (X <= 0xF)                          // X坐标应小于0xF
        { 
		    for(j=0;j<ListLength;j++)
		      {
             DisplayOneChar(X, Y, DData[j]); // 显示单个字符
             X++;                            // 横坐标加1,纵坐标不变
            }
        }
}

/***************************************************** 
 函 数 名:void Mychar()
 功    能:自定义字符--CGRAM
 说    明:LCM1602字符库中没有温度符号,自定义温度符号
 入口参数:无 
 返 回 值:无
/*****************************************************/
void Mychar(void)
{
//---------自定义字符代码--00H------闹铃符号-------------
  WriteCommandLCM(0x40,0); //第1行   
  WriteDataLCM(0x01);//               
  WriteCommandLCM(0x41,0); //第2行   
  WriteDataLCM(0x1b);//               
  WriteCommandLCM(0x42,0); //第3行    
  WriteDataLCM(0x1d);//               
  WriteCommandLCM(0x43,0); //第4行    
  WriteDataLCM(0x19);//               
  WriteCommandLCM(0x44,0); //第5行    
  WriteDataLCM(0x1d);//               
  WriteCommandLCM(0x45,0); //第6行    
  WriteDataLCM(0x1b);//               
  WriteCommandLCM(0x46,0); //第7行   
  WriteDataLCM(0x01);//
  WriteCommandLCM(0x47,0); //第8行   
  WriteDataLCM(0x00);//
//---------自定义字符代码--01H-------温度符号------------
  WriteCommandLCM(0x48,0); //第1行   
  WriteDataLCM(0x02);//               
  WriteCommandLCM(0x49,0); //第2行   
  WriteDataLCM(0x05);//               
  WriteCommandLCM(0x4a,0); //第3行    1------**--
  WriteDataLCM(0x05);//               2----**--**
  WriteCommandLCM(0x4b,0); //第4行    3----**--**
  WriteDataLCM(0x02);//               4------**--
  WriteCommandLCM(0x4c,0); //第5行    5----------
  WriteDataLCM(0x00);//               6----------
  WriteCommandLCM(0x4d,0); //第6行    7----------
  WriteDataLCM(0x00);//               8----------
  WriteCommandLCM(0x4e,0); //第7行   
  WriteDataLCM(0x00);//
  WriteCommandLCM(0x4f,0); //第8行   
  WriteDataLCM(0x00);//
  //---------自定义字符代码--02H-------当前时间------------
  WriteCommandLCM(0x50,0); //第1行   
  WriteDataLCM(0x1f);//               
  WriteCommandLCM(0x51,0); //第2行   
  WriteDataLCM(0x11);//               
  WriteCommandLCM(0x52,0); //第3行  
  WriteDataLCM(0x15);//               
  WriteCommandLCM(0x53,0); //第4行  
  WriteDataLCM(0x11);//               
  WriteCommandLCM(0x54,0); //第5行    
  WriteDataLCM(0x1b);//               
  WriteCommandLCM(0x55,0); //第6行    
  WriteDataLCM(0x0a);//              
  WriteCommandLCM(0x56,0); //第7行   
  WriteDataLCM(0x1f);//
  WriteCommandLCM(0x57,0); //第8行   
  WriteDataLCM(0x00);//
//-----------------------------------------------
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -