基于51单片机之LCD1602实验例程

发布者:快乐的成长最新更新时间:2014-12-30 来源: 51hei关键字:51单片机  LCD1602  实验例程 手机看文章 扫描二维码
随时随地手机看文章

**************************  Copyright(C)CaKe  *****************************************

=======================================================
==============**文件名    : main.c              ==============
==============**作者      : CaKen              ==============
==============**版本号    : V1.0               ==============
==============**时间      : 2014.08.12               ==============
==============**功能描述  : 1602液晶屏实验测试          ==============
====================================================
*********************************************************
 
#include
#include
#define uchar unsigned char     //宏定义
#define uint unsigned int     //宏定义
 
 
uchar code Table1[]="CaKen-2245286160";
uchar code Table2[]="                ";
 
 
sbit  LCD1602_RS=P2^4;      //数据命令端口
sbit  LCD1602_RW=P2^5;      //读写端口.我们在这里只写
sbit  LCD1602_EN=P2^6;      //使能端口
 
*********************************************************
函数名:延时函数
调  用:delayms();
参  数:
返回值:
结  果:
备  注:
******************************************************
 
void delayms(unsigned int ms)  
{
      unsigned int i , j;         
    for(i = 0; i < ms; i++)
         for(j = 0; j < 110; j++);
}
 
 
**********************************************************
函数名:写指令
调  用:Write_com();
参  数:
返回值:
结  果:
备  注:
*********************************************************
void Write_com(uchar com)
 {
   LCD1602_RS=0;               //写指令时RS=L
   LCD1602_EN=0;             
   P0=com;              //给端口送指令
   delayms(5);                
   LCD1602_EN=1;               //使能端高电平有效 
   delayms(5);     
   LCD1602_EN=0;    
 }
 
**********************************************************
函数名:写数据
调  用:Write_Date();
参  数:
返回值:
结  果:
备  注:
************************************************************
 void Write_Date(uchar Date)
 {
   LCD1602_RS=1;                //写数据时RS=L
   LCD1602_EN=0;               
   P0=Date;            //给端口送数据
   delayms(5);                  
   LCD1602_EN=1;                //使能端高电平有效 
   delayms(5);
   LCD1602_EN=0;   
 }
 
**********************************************************
函数名:LCD1602初始化
调  用:LCD1602_Init();
参  数:
返回值:
结  果:
备  注:
************************************************************
void LCD1602_Init()
 {
   unsigned char num;
   LCD1602_RW=0;                 //写信号拉低
   LCD1602_EN=0;                 //使能端拉低
   Write_com(0x38);           //开显示
   Write_com(0x0c);              //开显示不显示光标
   Write_com(0x06);              //每写一个地址和光标加一
   Write_com(0x01);           //显示清零
 
   Write_com(0x80);              //第一行的初始地址为0x80
   for(num=0;num<16;num++)       //循环的数字要看上面的占多少个字符
     {
       Write_Date(Table1[num]);  //多了和少了都不会对的。
    delayms(5);
     }
 
     Write_com(0x80+0x40);       //第二行初始地址为0x80+0x40
     for(num=0;num<16;num++)
      {
         Write_Date(Table2[num]);
      delayms(5);
      }
 }
*********************************************************
函数名:主函数
调  用:
参  数:
返回值:
结  果:
备  注:
********************************************************
void main(void)

     unsigned char n;
     LCD1602_Init();
 
   while(1)
 {
      Write_com (0x80+0x40+6);   //第二行第六个格开始显示
   Write_Date(0x30+n/100);    delayms(5);
   Write_Date(0x30+n0/10); delayms(5);
   Write_Date(0x30+n);     delayms(5);
     delayms(100);
 }     
}
 
 
///////////////////////////////////////////////////////////////////////////////////////////////
下面是一个提高版的程序:
 
**************************  Copyright(C) CaKe  ****************************************
===================================================
==============**文件名    : main.c              ==============
==============**作者      : CaKen              ==============
==============**版本号    : V1.0               ==============
==============**时间      : 2014.08.17               ==============
==============**功能描述  : LCD1602实验测试          ==============
===================================================
************************************************************


#include      //包含单片机寄存器的头文件
#include    //包含_nop_()函数定义的头文件


sbit RS=P2^0;            //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1;            //读写选择位,将RW位定义为P2.1引脚
sbit EN=P2^2;            //使能信号位,将E位定义为P2.2引脚


sbit BF=P0^7;            //忙碌标志位,,将BF位定义为P0.7引脚


unsigned char code string[ ]= {"abcdefghihklabc"};
unsigned char code string1[ ]={"QUICK STUDY MCU"};
unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃
 


void delay1ms()
{
     unsigned char i,j;
   for(i=0;i<10;i++)
    for(j=0;j<33;j++); 
 }


 void delay(unsigned int n)
 {
    unsigned int i;
 for(i=0;i
 delay1ms();
 }


 bit BusyTest(void)
  {
     bit result;
  RS=0;         //根据规定,RS为低电平,RW为高电平时,可以读状态
     RW=1;
     EN=1;          //E=1,才允许读写
     _nop_();      //空操作
     _nop_();
     _nop_();
     _nop_();      //空操作四个机器周期,给硬件反应时间
     result=BF;    //将忙碌标志电平赋给result
  EN=0;
     return result;
  }


void Write_com (unsigned char dictate)

    while(BusyTest()==1);    //如果忙就等待
  RS=0;                   //根据规定,RS和R/W同时为低电平时,可以写入指令
  RW=0; 
  EN=0;                    //E置低电平(写指令时,
                             // 就是让E从0到1发生正跳变,所以应先置"0"
  _nop_();
  _nop_();                //空操作两个机器周期,给硬件反应时间
  P0=dictate;             //将数据送入P0口,即写入指令或地址
  _nop_();
  _nop_();
  _nop_();
  _nop_();                //空操作四个机器周期,给硬件反应时间
  EN=1;                    //E置高电平
  _nop_();
  _nop_();
  _nop_();
  _nop_();                //空操作四个机器周期,给硬件反应时间
  EN=0;                   //当E由高电平跳变成低电平时,液晶模块开始执行命令
 }


 void WriteAddress(unsigned char x)
 {
     Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
 }


 void WriteData(unsigned char y)
 {
    while(BusyTest()==1);
   RS=1;              //RS为高电平,RW为低电平时,可以写入数据
   RW=0;
   EN=0;               //E置低电平(写指令时,,
                         // 就是让E从0到1发生正跳变,所以应先置"0"
   P0=y;              //将数据送入P0口,即将数据写入液晶模块
   _nop_();
   _nop_();
    _nop_();
      _nop_();           //空操作四个机器周期,给硬件反应时间
   EN=1;               //E置高电平
   _nop_();
   _nop_();
   _nop_();
   _nop_();           //空操作四个机器周期,给硬件反应时间
   EN=0;               //当E由高电平跳变成低电平时,液晶模块开始执行命令
 }


void LCD1602_Init(void)
{
    delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间
    Write_com(0x38);       //显示模式设置:16×2显示,5×7点阵,8位数据接口
 delay(5);
 Write_com(0x38);
 delay(5);      //延时5ms
 Write_com(0x38);       //3次写 设置模式
 delay(5);
 Write_com(0x0F);       //显示模式设置:显示开,有光标,光标闪烁
 delay(5);
 Write_com(0x06);       //显示模式设置:光标右移,字符不移
 delay(5);           
 Write_com(0x01);       //清屏幕指令,将以前的显示内容清除
 delay(5);
 }

 


void main(void)          
 {
  unsigned char i=0,j;
  LCD1602_Init();                       //调用LCD初始化函数
  delay(10);
  while(1)
    {

 


   Write_com(0x01);                   //清显示:清屏幕指令
   delay(5);
   WriteAddress(0x00);                // 设置显示位置为第一行的第1个字
   delay(5);


   while(string[i] != '\0')           //'\0'是数组结束标志
   {                 // 显示字符 abcdefghihklabc
    WriteData(string[i]);
    i++;
    delay(100);
   }


    WriteAddress(0x40);         // 设置显示位置为第二行的第1个字
         i = 0;
    while(string[i] != '\0')          //'\0'是数组结束标志
     {               // 显示字符 QUICK STUDY MCU
   WriteData(string1[i]);
   i++;
   delay(100);
  }
     //while(1);


 


  delay(1000);
                        //右侧移位进来
  Write_com(0x01);               //清显示:清屏幕指令
  delay(5);
  WriteAddress(0x10);            // 设置显示位置为第一行的第1个字
  delay(5);
    i = 0;
  while(string[i] != '\0')       //'\0'是数组结束标志
   {             // 显示字符  abcdefghihklabc
   WriteData(string[i]);
   i++;
   }
  
   WriteAddress(0x50);        // 设置显示位置为第二行的第1个字
         i = 0;
  while(string[i] != '\0')       //'\0'是数组结束标志
    {             // 显示字符 QUICK STUDY MCU
   WriteData(string1[i]);
   i++;
    }
  
  for(j=0;j<16;j++ )
    {
    Write_com(0x18);         //左移指令
    for(i=0;i<10;i++)
          delay(30);  
    }   
   //while(1);


 


         delay(1000);
   Write_com(0x08);          //关闭显示
   //while(1);   
         delay(3000);           //延时  维持显示一段时间
   Write_com(0x0c);          //开显示  
       //while(1);
         delay(3000);              //延时  维持显示一段时间

 


   Write_com(0x0f);       //开光标
   // while(1);
         delay(1000);           //延时  维持显示一段时间


   for(j=0;j<16;j++ )
   {
    Write_com(0x1c);      //右移 移出
    for(i=0;i<10;i++)
          delay(30);     
   }
   //while(1);

 


       Write_com(0x40);          //设定CGRAM地址
   delay(5);
   for(j=0;j<8;j++ )
   {
    WriteData(User[j]);  //写入自定义图形 ℃
   }
      WriteAddress(0x05);      //设定屏幕上的显示位置
    delay(5);
      WriteData(0x00);      //从CGRAM里取出自定义图形显示
      while(1);
  }   
}

关键字:51单片机  LCD1602  实验例程 引用地址:基于51单片机之LCD1602实验例程

上一篇:51单片机串口T1加看门狗程序
下一篇:51单片机单LED灯右移电路图+程序

推荐阅读最新更新时间:2024-03-16 13:50

51单片机快速入门指南】6.4:DHT11、DHT22单总线温湿度传感器
STC89C52 Windows 10 20H2 Proteus 8 Frofessional v8.9 SP2 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《温湿度模块 DHT11产品手册》、《数字温湿度传感器 DHT22》 典型应用电路中建议连接线长度短于5m时用4.7K上拉电阻,大于5m时根据实际情况降低上拉电阻的阻值。 使用3.3V电压供电时连接线尽量短,接线过长会导致传感器供电不足,造成测量偏差。 每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取2次,但不建议连续多次读取传感器,每次读取传感器间隔大
[单片机]
【<font color='red'>51单片机</font>快速入门指南】6.4:DHT11、DHT22单总线温湿度传感器
51单片机 (5) C51实现单片机串口通信仿真
1、效果图 2、虚拟串口 通过VSPD虚拟串口工具虚拟出两个串口用于通信 VSPD虚拟串口工具下载: http://download.csdn.net/detail/leytton/7565589 3、串口调试 打开两份串口调试工具,第一个打开com1,第二个打开com2,这时在任一串口调试工具发送信息,另一个串口调试工具中能接收到信息 串口调试工具下载: http://download.csdn.net/detail/leytton/7565561 4、Proteus电路设计图 P1串口:属性原件值COMPIM,Physical port为com2,Physical Baud rate为960
[单片机]
<font color='red'>51单片机</font> (5)  C51实现单片机串口通信仿真
解读51单片机LED系统电路
LED 旋转显示器时基于视觉暂留原理,开发的一种旋转式LED 显示屏。其在具有一定转速地载体上安装16 个LED 发光器件,各LED 发光管等间距排位一条直线,随着旋转速度的加快,在计算机软件精确的时序控制下,不断扫描出预设的文字,图案等。使用一个光耦(U 型槽的红外对管)作为定位传感器,当旋转一周时,挡光板遮挡光源,光敏三极管的集电极输出高电平,当离开挡光板时,集电极再次输出低电平,从而给单片机一个下降沿的跳变型号,产生一个中断,从而更新显示。供电部分,因为整个装置是在不停的高速旋转当中,所以我们做了一个简单的电刷装置,把220V 的交流电通过变压器变成12V 的交流电,再由桥式整流电路,和滤波电路,变为平滑的直流电,最后通过7
[电源管理]
解读<font color='red'>51单片机</font>LED系统电路
基于51单片机和可编程逻辑器件实现LED显示屏的硬件设计
LED显示屏主要由电流驱动电路及LED点阵阵列、控制系统和PC端管理软件三部分构成(图1)。控制系统负责接收、转换和处理各种外部信号,并实现扫描控制,然后驱动LED点阵显示需要的文字或图案。控制系统作为LED显示屏的核心部分,直接决定了显示屏的显示效果和性能的优劣。本文详细分析采用Verilog HDL对ATF1508AS进行编程,实现双口RAM访问和产生LED点阵驱动电路所需的各种时序信号。 1 LED显示屏的基本结构及关键技术 本系统设计中,控制系统采用单片机+CPLD的方案来实现,整个控制系统可分为:信号接收及处理模块和CPLD的扫描控制模块和LED点阵驱动模块,如图1 所示。本系统的关键技术是使用双口RAM和CPLD芯
[电源管理]
基于<font color='red'>51单片机</font>和可编程逻辑器件实现LED显示屏的硬件设计
基于51单片机的多机并行通信系统应用
在一些复杂的系统中,系统与分系统、分系统与设备等之间存在数据的传递问题,往往采用通信的方式来解决。由于分系统、没备等通信波特率的不同,特别是一些特殊波特率设备的存在,使得系统中设备间的相互通信不易实现。例如,在一个系统中,上位机接收某一设备的数据,如图1所示,设备l和设备2采用的是172.8 kbps的波特率,而上位机用VB编程,其通信波特率为115.2 kbps、128 kbps或256 kbps,等,这样设备之间就不能相互通信,给设计带来困难。为了解决上述问题,采用双单片机电路,设计了波特率变换器,将接收波特率为172.8 kbps的数据,转换成波特率为115.2 kbps的输出,从而使不同波特率设备之间的通信成为可能。
[单片机]
基于<font color='red'>51单片机</font>的多机并行通信系统应用
51单片机之动态数码管显示
首先来看一下开发板上的电路原理图: 本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。 138译码器的真值表如下图G1,G2A,G2B都是选通脚,当G1,G2A,G2B为100的时候138译码器开始工作,A为最低位,B为中间位,C为最高位。CBA=000B时,Y0为1,其他口为0,CBA=001B时,Y1为1,其他口为0,CBA=010B时,Y2为1,其他口为0,CBA=011B时,Y3为1,其他口为0,CBA=100B时,Y4为1,其他口为0,CBA=101B时,Y5为1,其他口为0,CB
[单片机]
<font color='red'>51单片机</font>之动态数码管显示
51单片机寄存器详解
51单片机的特殊功能寄存器 定时器: 定时方式寄存器TMOD(地址89H); TMOD被分成两部份,每部份4位。分别用于控制T1和T0。 GATE C/T M1 M0 GATE C/T M1 M0 1. M1、M0:定时/计数器的工作方式 1. 工作方式0:13位定时/计数方式(8192)。 2. 工作方式1:16位定时/计数方式(65536)。 3. 工作方式2和工作方式3, 8位的定时/计数方式(256)。 2. 如果C/T为0就是用作定时器,如果C/T为1就是用作计数器。 3. 门控位GATE(GATE=0与INT0无关,GATE=1与INT0有关):
[单片机]
51单片机有哪些特性?
MCS-51单片机是美国INTE公司于1980年推出的产品,与MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MCS-51单片机可以算是相当成功的产品,一直到现在,MCS-51系列或其兼容的单片机仍是应用的主流产品,各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。我们也以这一代表性的机型进行系统的讲解。 MCS-51系列单片机主要包括8031、8051和8751等通用产品,其主要功能如下: ·8位CPU ·4kbytes 程序存储器(ROM) ·128bytes的数据存储器(RAM) ·32条I/O口线 ·111条指令,大部分为单字
[单片机]
热门资源推荐
热门放大器推荐
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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