自制51单片机常用头文件(LCD1602)

发布者:温柔心情最新更新时间:2016-07-15 来源: eefocus关键字:51单片机  头文件  LCD1602 手机看文章 扫描二维码
随时随地手机看文章
/*--------------------------------------------------------------------------

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 |
---------------------------------------------------*/

/******************  LCD1602指令  ***********************************/
//输入方式设置
#define LCD_AC_AUTO_INCREMENT     0x06   // 数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE      0x04   // 数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE           0x05   // 数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE        0x04   // 数据读、写操作,画面不动
#define LCD_GO_HOME               0x02   // AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON            0x0C   // 显示开
#define LCD_DISPLAY_OFF           0x08   // 显示关
#define LCD_CURSOR_ON             0x0A   // 光标显示
#define LCD_CURSOR_OFF            0x08   // 光标不显示
#define LCD_CURSOR_BLINK_ON       0x09   // 光标闪烁
#define LCD_CURSOR_BLINK_OFF      0x08   // 光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE             0x18   // LCD显示左移一位
#define LCD_RIGHT_MOVE            0x1C   // LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE      0x10   // 光标左移一位
#define LCD_CURSOR_RIGHT_MOVE     0x14   // 光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE   0x38   // 两行显示
#define LCD_DISPLAY_SINGLE_LINE   0x30   // 单行显示
#define LCD_CLEAR_SCREEN          0x01   // 清屏

/***********************LCD1602地址相关******************************/
#define LINE1_HEAD                0x80   // 第一行DDRAM起始地址 
#define LINE2_HEAD                0xc0   // 第二行DDRAM起始地址
#define LINE1                     0      // 第一行
#define LINE2                     1      // 第二行
#define LINE_LENGTH               8      // 每行的最大字符长度

/***********************LCD1602接线引脚定义**************************/

#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(LCD_DISPLAY_DOUBLE_LINE,0); // 三次显示模式设置,不检测忙信号
 Delay_LCD(); 
 WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 0x38指令表示:8位数据显示模式,俩行多显示
 Delay_LCD(); 
 WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0);
 Delay_LCD();

 WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,1); // 显示模式设置,开始要求每次检测忙信号
 WriteCommandLCM(LCD_DISPLAY_OFF,1);         // 关闭显示
 WriteCommandLCM(LCD_CLEAR_SCREEN,1);        // 显示清屏
 WriteCommandLCM(LCD_AC_AUTO_INCREMENT,1);   // 显示光标移动设置
 WriteCommandLCM(LCD_DISPLAY_ON,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 |= LINE2_HEAD;  // 当要显示第二行时地址码:0xc0
  }

 X |= LINE1_HEAD;        // 第一行的地址码:0x80
 WriteCommandLCM(X, 0);  // 这里不检测忙信号,发送地址码
 WriteDataLCM(DData);
}
/*在LCD1602中使用此函数,在DIPS082中使用下面的函数
/***************************************************** 
 函 数 名:void DisplayListChar(uchar x,uchar y,uchar *DData)
 功    能:向指定坐标中写入字符串(在LCD1602中使用此函数)
 说    明:X-横坐标,Y-纵坐标
 入口参数:X,Y,*DData 
 返 回 值:无  
 *****************************************************
//按指定位置显示字符串
void DisplayListChar(uchar x,uchar y,uchar *DData)
{
 if (y == LINE1)                                      // 判断是否写入第1行
    {
      if (x < LINE_LENGTH)                             // 写入位数
      {  
         WriteCommandLCM(LINE1_HEAD+x,0);             // 写入第1行地址

         for (; x          {
           WriteDataLCM(*(DData++));                // 写入数据
         }

         if(*DData != '\0')                           // 判断数据是否写完
         {
        x = 0;                                   // 没写完写入第2行
     y = LINE2; 
      }
      }
    }

    if (y == LINE2)                                      // 判断是否写入第2行
    {
     WriteCommandLCM(LINE2_HEAD+x,0);                 // 写入第2行地址

      for (; x       {
         WriteDataLCM(*(DData++));                    // 写入数据
      }
    }
}*/

/***************************************************** 
 函 数 名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
 功    能:向指定坐标中写入字符串(在DIPS082中使用此的函数)
 说    明: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 <= 0x0F)                             // X坐标应小于0xF
    { 
  for(j=0; j   {
            DisplayOneChar(X, Y, DData[j]);    // 显示单个字符
            X++;                               // 横坐标加1,纵坐标不变
        }
 }
}

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

关键字:51单片机  头文件  LCD1602 引用地址:自制51单片机常用头文件(LCD1602)

上一篇:自制51单片机常用头文件(T6963C)
下一篇:自制51单片机常用头文件(DS18B20)

推荐阅读最新更新时间:2024-03-16 15:00

单片机学习笔记51单片机基础
1980年因特尔退出MCS-51单片机 现在扩展告诉IO口 AD转换器 PWM WDT(看门狗) IIC等 MCS-51停产 与MCS-51兼容的有 Atmel公司 AT89C5X 停产 不支持ISP下载 已经被AT89S5X取代 这个可以ISP下载 SST公司 SST89E5X 带监控程序 可以简单仿真 宏晶STC(大陆的) STC89C5X 支持串口下载 STC89C52 AT表示 Atmel公司的芯片 9表示flash存储器 S表示可以下载的flash LV表示低电压 3.3V 52是型号 2表示8K的ROM 24表示最高使用晶振24M P表示双列直插封装的 D陶瓷封装
[单片机]
单片机学习笔记<font color='red'>51单片机</font>基础
利用单片机实现对激光器电流的精度控制
引 言 近年来,随着光电技术的迅猛发展,激光器已广泛应用于医疗、国防、测量等各个领域。而环境温度变化会直接影响激光器的波长。把关键元件(如高性能晶振、SAW 滤波器、光放大器、激光二极管) 的本机温度限制在窄范围内,可以提高电子系统的精度。一般需要将温度控制在0. 1 ℃内,激光器的工作精度才能很好地保持在0. 1nm 内 。文中的设计方案能为大功率半导体激光器提供有效支持,最大电流可达2. 5A。 1  半导体激光控制器的设计 激光控制器由受控恒流源,温度监视及控制电路,主控制器及显示器构成。整体结构原理见图1。 1. 1  受控恒流源: 为了使激光器输出稳定的激光,对流过激光器的电流要求
[单片机]
利用单片机实现对激光器电流的精度控制
8051单片机中DPTR的扩展设计
   摘要 首先对比分析在执行大规模数据转移时,传统805l单片机和进行DPTR扩展后的805l单片机在数据转移执行效率上的差别。通过详细分析DPTR操作所涉及的因素,具体实现对DPTR的扩展,并进行实际仿真测试。   单片机的出现是计算机技术发展史上的一个里程碑,它使计算机从海量数值计算进入到控制领域。在单片机中,以8051系列最为经典,至今仍是最普及、广泛使用的8位MUC架构。北界许多技术人员在其基础上不断进行性能扩展,使得805l系列芯片不断完善,从而形成一个庞大的体系。在传统的8051系列单片机中,设置了一组双字节寄存器(数据指针DPTR),用于访问外接的64 KB数据存储器和I/O接口电路;但在现今的8051单片机应用
[应用]
51单片机-程序点灯
1.头文件 在 #include reg52.h 头文件中,把单片机中的寄存器地址封装起来定义成宏供我们调用,寄存器这个概念我们初学先不用太深刻的去理解它,在《手把手教你学51单片机》文档中2.4.1节有讲解,大家熟读几遍,如果还是无法理解后面我们再用程序配合硬件来领悟它们的作用。 2.单片机端口 首先我们知道STC89C52RC这个芯片有4*8=32个IO端口是可以被我们用程序控制输出高电平或低电平的。拿P0表示它可以一次性控制8个引脚端口输出每个引脚想输出的电平状态,P0是一个寄存器,它的功能是控制所对应的8个单片机IO端口(P0.0~P0.7)输出我们想要输出的电平,比如我们控制P0.0单个IO端口输出低电平,P0.1~
[单片机]
<font color='red'>51单片机</font>-程序点灯
51单片机控制四相步进电机
  接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。这几天给自己的任务就是搞定步进电机的单片机控制。以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。今天从淘宝网买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相,接线共有六根,外形如下图所示: 拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4 5)=18度。地线与
[单片机]
<font color='red'>51单片机</font>控制四相步进电机
51单片机C语言教程(七) 表达式1
上课到这一课相隔了好长一段时间,这些日子里收到不少网友的来信支持和鼓励,要求尽快完成余下的部分。出门在外的人不得不先为吃饭而努力,似乎这也成为我的借口,以后每晚抽空打一些吧这样大家也就可以不用隔太久就能看到一些新东西。或许我的笔记并不是很正确,但我尽量的保证每课的实验都会亲自做一次,包括硬件的部分,已求不会误人子弟。 随着访问量不断的增加,网站已启用了www.cdle.net的国际域名,在这里我感谢各位一直支持磁动力工作室的朋友,更要感激身在远方一直默默支持我的女友。                     明浩 2003-7-14 晚   呵,费话少说了。上两课说了常量和变量,先来补充一个用以重新定义数据类型的的语句吧。这个语句
[单片机]
<font color='red'>51单片机</font>C语言教程(七) 表达式1
单片机LM75温度报警LCD1602显示实验
一个由lm75构成的温度报警器例程 LM75数字温度传感器报警测试程序 1、程序说明: 该例程演示了接在单片机端口上的数字温度传感器LM75测试实验。 并在1602液晶上显示当前温度。同时判断是否超过了温度上限和下限, 如果超过,液晶屏将有提示闪烁。 2、实验操作 1、将跳线插座J4的跳线帽调至1602端 2、将LCD1602液晶屏插入J3插座中,注液管脚方向。 3、通过调节电位器VR1可以改变显示的对比度。 单片机源程序如下: /************************************************ * 文件描述 : LM75数字温度传感器报警测试程序 * 程序文件 : main.
[单片机]
基于51单片机按键控制喇叭发出多种声音
具体实现功能: 51单片机按键控制喇叭发出多种声音。 设计介绍 51单片机简介 51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 51系列单片机具有以下标准功能: 8k字节Flash,512字节RAM, 32位I/O口线,看门狗定时器, 内置4KB EEPROM, MAX810复位电路, 三个16位定时器/计数器, 一个6向量2级中断结构, 全双工串行口。 另外, 51系列在空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机停止工作,直到下一个中
[单片机]
基于<font color='red'>51单片机</font>按键控制喇叭发出多种声音
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved