单片机lcd字母移动_keil单片机lcd - CSDN
  • 51单片机1602液晶显示移动显示

    千次阅读 2014-01-26 17:31:39
    #include #include #define uchar unsigned char #define uint unsigned int sbit RS=P2^0;//寄存器选择位 sbit RW=P2^1;//读写选择位 sbit E=P2^2; //使能信号位 sbit BF=P0^7;...uchar table1[]={" HELLOW WORLD"};...
    #include <reg52.h>
    #include <intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit RS=P2^0;//寄存器选择位
    sbit RW=P2^1;//读写选择位
    sbit E=P2^2; //使能信号位
    sbit BF=P0^7;//忙碌标志位
    uchar table1[]={"  HELLOW WORLD"};
    /**************
    函数功能:延时函数1秒
    *******************/
    void delaylms()
    {
     uchar i,j;
     for(i=0;i<10;i++)
      for(j=0;j<33;j++);
    }
    /*********
    函数功能:延时若干秒***
    *******入口参数:n
    *****************/
    void delay(uchar n)
    {
     uchar 	i;
     for(i=0;i<n;i++)
      delaylms();
    }
    /******
    函数功能;判断液晶模块的忙碌状态
    返回值:result。result=1,忙碌;result=0,不忙碌**********/
    uchar busytest(void)
    {
     bit result;
     RS=0;	//RS为低电平RW为高电平,可以读状态
     RW=1;
     E=1;	//E=1允许写
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     result=BF;
     E=0;
     return result;
    }
    /*********
    函数功能:将模式设置指令或显示地址写入液晶模块
    入口参数:dictate******************/
    void writeinstruction(uchar dictate)
    {
     while(busytest()==1);
     RS=0; //RS,RW同时为0时,可以写入指令
     RW=0;
     E=0; //写指令时E为高脉冲,写指令就是让脉冲从0到1发生跳变
     _nop_();
     _nop_();
     P0=dictate;//将数据写入P0口,即写入指令或地址
     _nop_();
     _nop_();
     _nop_();
     _nop_();//四个空周期,给机器足够的反应时间
     E=1;
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     E=0; //当E由1到0时液晶模块开始执行命令
    }
    /********函数功能:指定字符显示的实际地址
    入口参数:x**************/
    void writeaddress(uchar x)
    {
      writeinstruction(x|0x80);
    }
    /********函数功能:将数据(字符的ASCII码)写入字符模块
    入口函数:y*******************/
    void writedate(uchar y)
    {
     while(busytest()==1);
     RS=1;//RS为高电平,RW为低电平可以写入数据
     RW=0;
     E=0;  
     P0=y;//将数据写入液晶模块
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     E=1;
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     E=0;
    
    }
    /********函数的功能:对液晶的显示功能进行初始化设置**************/
    void lcdinitate()
    {
     delay(15);//延时15秒
     writeinstruction(0x38);//设置显示模式16*2显示,5*7点阵,8位数据接口
     delay(5);
     writeinstruction(0x38);//设置显示模式16*2显示,5*7点阵,8位数据接口
     delay(5);
     writeinstruction(0x38);//设置显示模式16*2显示,5*7点阵,8位数据接口
     delay(5);
     writeinstruction(0x0f);//设置显示模式:显示开有光标光标闪烁
     writeinstruction(0x06);//设置显示模式:光标右移字符不移
     delay(5);
     writeinstruction(0x01);//清屏指令
     delay(5);
    }
    void main(void)
    {
     uchar i;
     lcdinitate();
     delay(10);
     while(1)
     {
      writeinstruction(0x01);
      writeaddress(0x00);//设置显示位置为第一行的第五个字
      i=0;
      while(table1[i]!='\0')
      {
       writedate(table1[i]);
       
       i++;
       delay(150);
      }
      for(i=0;i<4;i++)
       delay(250);
      
     }
    }
    								

    展开全文
  • 51单片机控制LCD1602模块

    万次阅读 多人点赞 2018-04-07 23:52:56
    51单片机控制LCD1602模块视频播放:LCD1602视频(1)LCD1602概述先来看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶显示,1602 表示一行可以显示16个字符,一共有两行。现在我们来看看如何使用简单的IO...

    51单片机控制LCD1602模块

    视频播放:LCD1602视频

    (1)LCD1602概述

    先来看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶显示,1602 表示一行可以显示16个字符,一共有两行。

    现在我们来看看如何使用简单的IO控制和延时来实现操作LCD1602液晶模块。既然是用单片机控制LCD1602,那么根据前面的分析,首先要搞清楚谁是控制对象,谁是被控制对象。很显然,LCD1602是被控制对象,那么我们就先从LCD1602开始分析。所谓控制也可以理解为沟通,比如你与室友沟通,希望他帮你买瓶绿茶,那么就表示至少你的室友能听懂你的“指令”,能知道绿茶是什么,如何去买等等信息。好了,那么如何与LCD1602沟通呢?可以想一想,平时人与人是如何沟通的?沟通之前先要打个招呼吧,比如“你好”之类的,电话里面要先讲个“喂?”,确定通迅正常了之后才进入沟通正题了,很少有人打电话一上来就开始“哇哇”的说,万一说了半天发现信号还没连上呢,那不是白讲了。其实单片机与LCD1602的沟通方式也一样,电话中使用的“喂?”在我们这里其实就叫初始化。后面也会经常碰到这个“初始化”的概念。其实器件也是人设计的,所以他的工作方式从某种程度上讲,也是人的沟通方式。打完招呼后,就开始进入真正主题了。什么主题呢?LCD1602是显示模块,主要作用当然是显示了。既然是显示,我们可以想一想,无非就是两个内容:

    (1)你想要显示什么内容?

    (2)你打算在哪里显示?

    很明显,这两个内容都是来自于单片机的控制,单片机让它显示什么它就显示什么(叁议电子)。这个‘显示什么’就是传送的数据。那么怎么往LCD1602模块传送数据呢?前面讲了,LCD1602表示2行16个字符,也就是有不同的显示地点,那么单片机如何告诉LCD1602的显示地点呢?因此前面的分析可以总结为三个问题,如何初始化;如何传送显示的内容(显示什么);在哪里显示。这三个问题如何解答呢?当然要去看LCD1602说明手册了。

    为了解决这三个问题,我们还是先来看看人与人之间是如何沟通的,如果当面沟通,你的信号(声音)能够直接传到对方,而且能让对方听懂。如果相距比较远,那么就使用电话等通信工具。前者信号传递载体是空气,后者是电话线。那么我们来看看MCU与LCD1602的信号传递载体是什么样的,这就需要去查看原理图了。

    如图3-1所示,LCD1602一共16个引脚,其中引脚1,2,15,16是与电源相关的,我们不去理它。另外引脚3连接到了可调电阻Rv1,用于液晶模块背光调节的,这里也暂且不管。我们现在关心的是与信号传输相关的引脚,很明显与引脚4到引脚14有关。从图中我们看到,单片机通过P4.1,P4.4,P4.5分别与RS,RW,EN连接,P2端口与D0到D7连接,一共10根线。那么也就是说,单片机的所有指令,数据等都是通过这10根线来完成的。怎么样去控制LCD呢,当然是阅读LCD的说明手册。这里来个比喻,房间内一个人规定,敲三下门,屋内的人才把门打开。如果你要进入屋内,就必须敲三下,如果你不知道这个规则,敲了四下,或者大喊大叫,门也开不了。这里要说明什么意思?当你要与某个器件沟通的时候,你必须严格按照这个器件的规则来操作。比如一个德国人只会讲德语,如果你想与他沟通那么你就只能和他讲德语了。如果你讲汉语,他讲德语,这就乱套了,信息无法传递(www.ppptalk.com)。这个时候,你可以选择会讲汉语的德国人沟通,也就是换一个沟通对象。同样的,如果你觉得某个器件操作起来太麻烦,那么你可以更换另外一个具有同样功能能满足你使用要求的器件来代替。但是,一旦你选定了某个器件后,你必须100%的按照“这个器件的使用规则”来操作。不同的外围器件的规则是不一样,也就是说这些规则是多样化的。回到前面讲的开门的例子,也可以这样设计,比如一共敲两下,第一下要敲重一点,第二下要敲轻一点。或者重敲三下,轻敲一下,等等。但是对于我们而言,不需要问为什么,照着做就行了。规则如何设计,那是设计这个器件或者模块的工程师应该思考的工作,我相信这些规则的设计一定有他们的理由。但我们只是从应用层面来思考问题,不管你怎么规定的,我照做就行了。这些规则在哪里呢?查看芯片手册或者官方说明书。罗嗦这么多,其实就为了强调学习这门技术一定要以芯片手册(官方说明资料)为本,而且后面还会继续强调。其实LCD1602包括后面会讲到的其他模块同样如此,你要与它沟通,当然必须按照它的规则来。下面我们就来解读它的规则,来解决前面提到的三个问题,初始化,内容显示,显示地址。

    (2)LCD1602初始化

    关于这一点,LCD1602说明手册上已经明确告诉我们了,想都不要去想,管你这些什么意思,照做即可。

    延时15ms

    写指令38H

    延时5ms

    写指令38H

    写指令08H

    写指令01H

    写指令06H

    写指令0CH

    以上为初始化过程,延时部分好解决,前面讲过了。这里就看如何“写指令”了。问题来了,液晶模块怎么知道单片机给我的是命令还是数据。(叁议电子www.ppptalk.com)LCD1602看到RS为高时,就明白了,哦,你要给我传送数据了;看到RS为低时,就知道你要给我指令了。这个只是选择“命令”还是“数据”,还有一个问题,我们的目的是“写指令”,那么液晶模块怎么知道是“写”还是“读”呢?再来看RW信号,当RW为低的时候,液晶模块就知道了,单片机要给我“写”了;当RW为高的时候,液晶模块也知道了,单片机要“读”了。很明显,我们这里要把RW设置为低。“写/读”和“指令/数据”都知道如何告诉液晶模块了,那么这个指令从怎么传过去呢?通过D0-D7这8根线(也就是P2端口)来传输,比如我要传送的指令为x033,那么就把这个数据0x33放到P2端口,当LCD1602看到“写”和“指令”的时候,就知道把P2端口上的0x33这个指令拿过来了。这样就达到了“写”“指令”“0x33”的目的。

    但是不是这样就能让LCD1602正常执行了。不是的。回到我们前面讲的那个例子,这里加个条件,屋内人听到敲门三下后,判断暗号正确了,但是没有直接开门,而是通知了他的上级,得到上级的授权后,才开门。也就是两个条件,暗号正确和上级授权。LCD1602也一样,收到指令没有立即执行,还要等另外一个信号,就是EN使能信号。此时EN给个一定宽度的脉冲,LCD1602才开始执行。

    这样根据前面的分析很容易的写出写指令的代码:

    void Lcd_Write_Cmd(unsigned char Cmd) {  

        delayMs(5);//注意这里需要延时5ms比较保险 代替判断忙信号  

        RW = 0; 

        P2 = Cmd;        //准备好指令  

        RS=0;         //告诉LCD1602,P0中放的是指令不是数据  

        EN=1;  

        delayUs(5); //根据时序图,脉冲要有一定宽度  

        EN=0;           //使指令有效,开始执行

    同样的道理,以上代码中,只需改一下RS信号为1,就是写数据的代码了

    voidLcd_Write_Data(unsignedcharmData{

        RW = 0;

        delayMs(5);//注意这里需要延时5ms比较保险代替判断忙信号

        P2=mData;//准备好指令

        RS=1;//告诉LCD1602,P0中放的是数据不是指令

        EN=1;

        delayUs(5);//根据时序图,脉冲要有一定宽度

        EN=0;//使指令有效,开始执行

    }

    讲到这里,LCD1602初始化代码应该能写出了。同时我们也已经写出了传递指令的代码,那么现在我们只要知道指令内容就可以了。

    指令1:清显示,指令码01H,光标复位到地址00H位置。

    指令2:光标复位,光标返回到地址00H。

    指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。

    指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

    指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。

    指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

    指令7:字符发生器RAM地址设置。

    指令8:DDRAM地址设置。

    指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

    指令10:写数据。

    指令11:读数据。

    这样你需要给LCD1602什么指令,只需要传递给void write_com(unsigned char Cmd)函数中的Cmd参数就行了。


    (3)LCD1602确定显示位置


    现在我们就来解决前面提到的第二个问题:“在哪里显示?”也就是液晶模块的这32个空格是如何确定的。

    从以上这个图可以看到,一共两行,00到0F和40到4F刚好与LCD1602的32个空格对应。可见,液晶模块的显示位置是通过这个表格对应的码值来确定的。例如第二行第一个字符的地址是40H,那么是不是它的地址就是40H了。注意表3-2中第8条数据存储地址,D7已经被写死了。最终的显示地址应该是40H+10000000B(40H+80H),因此我们只要把这个值传给Cmd,这样LCD1602就知道在第二行第一个位置显示了。

    (4)LCD1602确定显示内容

    前面讲了,如果传送数据就是要显示的内容。比如我要显示字母A,怎么操作呢?

    以上图中可以知道,如果你要显示A,那么数据的高位为0100,低位为0001,因此为01000001。把这个数据传送给LCD1602,它就知道要显示A了。

    这样三个问题都解决了,“初始化”,“写指令”,“写数据”。

    现在回过头来看看,我们在使用单片机控制LCD1602这个过程中用到了单片机的哪些知识。回去看看图1,10根连接线,P4.1,P4.4和P4.5,再加上P2端口,主要是通过P4.1,P4.4和P4.5高低变化来发出指令或数据,P2端口的变化反映指令或数据的内容。可见,这个过程中我们只用到了IO口控制和延时。其他很长的部分我们用在理解1602的使用规则了。注意这里是使用规则,谈不上原理。比如你给LCD1602发送清屏指令时,你明白LCD1602收到这个指令是如何操作清屏的吗?不知道,也没有必要知道。液晶模块说明书也不告诉你。好比你使用手机时,你点击一下某个应用程序就打开了,然后按照它的规则去使用就行了,比如听歌,上网等等,你不用关心它们是怎么实现的。其实手机也是个模块,我们只要学会操作就行了,不管它里面发生了什么事情。

    (5)小结

    现在对以上分析内容小结一下。LCD1602液晶模块的作用就是显示,既然是“显示”,无非就是显示什么内容,在哪里显示。那么如何确定显示的内容呢?通过ASCII码表来确定。如何确定显示的位置呢?通过表格3-3来确定。在单片机控制LCD1602液晶模块时,也就是这两个对象沟通时,一定要先“打招呼”,也就是初始化。如何初始化呢?说明手册中已经给出了具体步骤,照搬即可。理清了这个思路,剩下的就是去实现各个步骤了。里面涉及到如何写指令,写数据以及如何读忙信号。具体查看时序图即可。



    展开全文
  • 51单片机LCD1602液晶显示

    万次阅读 2018-08-18 14:48:32
    LCD1602.noteLCD1602是一种工业字符型液晶,能够同时显示16*02即32个字符。LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示图形。   简介: 它由若干个5*7或者5*10等点阵...

    LCD1602.noteLCD1602是一种工业字符型液晶,能够同时显示16*02即32个字符。LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示图形。

     

    简介:

    它由若干个5*7或者5*10等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到字符间距和行间距的作用,正因为如此所以他不能很好的显示图形(用自定义CGRAM,显示效果也不好)。

    CGRAM(Custom Glyph RAM) 代表图像定义(自定义字形)功能,这个在1602液晶显示器上有用

    到。

     

     

    1602采用标准的引脚,其中:

    第1引脚:GND为电源地

    第2引脚:VCC接5V电源正极

    第3引脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

    第4引脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0 时选择指令寄存器。

    第5引脚:RW为读写信号线,高电平1时进行读操作,低电平0时进行写操作。

    第6引脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳

    变时执行指令。

    第7~14引脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电

    源。第15引脚背光正极,第16引脚背光负极。

    特性

    3.3V或5V工作电压,对比度可调

    内含复位电路

    提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能

    有80字节显示数据存储器DDRAM

    内建有192个5X7点阵的字型的字符发生器CGROM

    8个可由用户自定义的5X7的字符发生器CGRAM

    特征应用

    微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。

    操作控制

    注:关于E=H脉冲--开始时初始化E为0,然后置E为1。

    字符集

    1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母"A"的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母"A"。

    单片机编程中还可以用字符型常量或变量赋值,如'A'。因为CGROM储存的字符代码与我们PC中的字符代码是基本一致的,因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1='A'这样的方法。PC在编译时就把'A'先转换为41H代码了。

     

    字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。

    0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。

    以下是1602的16进制ASCII码表地址:读的时候,先读上面那行,再读左边那列,如:感叹号!的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)

     

    指令集

    指令码

    功能令:

     

    RS

    R/W

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    说明

    清显示

    0

    0

    0

    0

    0

    0

    0

    0

    0

    1

    将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"

    归位

    0

    0

    0

    0

    0

    0

    0

    0

    1

    *

    设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容

    进入模式设置指令

    0

    0

    0

    0

    0

    0

    0

    1

    I/D

    S

    I/D=1,光标或闪烁向右移动,AC增加1。I/D=0,光标或闪烁向左移动,AC减少1,S整个显示移动

    显示开关控制指令

    0

    0

    0

    0

    0

    0

    1

    D

    C

    B

    [D=1: 整体显示 ON],[C=1: 游标ON],[B=1:游标位置反白允许]

    光标或显示移位指令

    0

    0

    0

    0

    0

    1

    S/C

    R/L

    *

    *

    光标或显示移位指令可使光标或显示在没有读写数据的情况下,向左或向右移动,指令不改变DDRAM 的内容

    功能设定

    0

    0

    0

    0

    1

    DL

    N

    F

    *

    *

    [DL=0/1:4/8位数据],[N=0/1,单行/双行显示],[F=0/1,5*8/5*10点阵显示模式]

    设置CGRAM地址

    0

    0

    0

    1

    AC5

    AC4

    AC3

    AC2

    AC1

    AC0

    CGRAM地址设置指令设置CGRAM地址指针,

    设定DDRAM地址

    0

    0

    1

    0

    AC5

    AC4

    AC3

    AC2

    AC1

    AC0

    DDRAM地址设置指令设置DDRAM地址。一行地址范围00H~4FH,两行DDRAM地址第一行00H~27H,第二行40H~67H,加上高2位,[一行:80H-A7H],[二行:C0H-E7H]

    读忙标志和地址

    0

    1

    BF

    AC6

    AC5

    AC4

    AC3

    AC2

    AC1

    AC0

    BF:忙标志位,BF=1,模块正在进行内部操作,此时模块不接受任何外部指令和数据。BF=0,模块可以接受外部的指令和数据;同时可以读出地址计数器(AC)的值。

    写RAM指令

    1

    0

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    将数据D7-D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM),将用户自定义的字符写入CGRAM中,D7~D5为000,D4~D0为5点的字模数据

    读RAM指令

    1

    1

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    从内部RAM读取数据D7--D0(DDRAM/CGRAM/IRAM/GRAM)

    单片机与LCD模块之间有四种基本操作:

    写命令

    读状态

    写显示数据

    读显示数据

    #define DataPort P0

    sbit RS = P2^4;

    sbit RW = P2^5;

    sbit EN = P2^6;

     

    #define RS_CLR RS = 0

    #define RS_SET RS = 1

    #define RW_CLR RW = 0

    #define RW_SET RW = 1

    #define EN_CLR EN = 0

    #define EN_SET EN = 1

    RS

    R/W

    操作

    0

    0

    写命令操作(初始化、光标定位等)

    0

    1

    读状态操作(读忙标志)

    1

    0

    写数据操作(要显示的内容)

    1

    1

    读数据操作(可以把显示存储区中的数据反读出来)

    LCD上电时,都必须按照一定的时序对LCD进行初始化操作,主要任务是设置LCD的工作方式、显示状态、清屏、输入方式、光标位置等。

     

     

      •  

     

     

      • bit LCD_Check_Busy()
      • {
      • DataPort = 0xff;
      • RS_CLR;
      • RW_SET;
      • EN_CLR;
      • _nop_();
      • EN_SET;
      • return (bit)(DataPort & 0x80);
      • }
      • /*------------------------------*/
      •  
      • /*------------WR-CMD------------*/
      • void LCD_Write_Com(unsigned char com)
      • {
      • while(LCD_Check_Busy());
      • RS_CLR;
      • RW_CLR;
      • EN_SET;
      • DataPort = com;
      • _nop_();
      • EN_CLR;
      • }
      • /*------------------------------*/
      •  
      • /*-----------*/
      • void LCD_Write_Data(unsigned char Data)
      • {
      • while(LCD_Check_Busy());
      • RS_SET;
      • RW_CLR;
      • EN_SET;
      • DataPort = Data;
      • _nop_();
      • EN_CLR;
      • }

     

     

     

     

     

     

     

     

     

     

     

     

     

    LCD中CGRAM的用法:

     

     

       要让LCD1602显示自定义字符,就得用到CGRAM指令,CGROM字码表中最左边16字节是自定义CGRAM,实际只有8个字节可用.它的字符码是00H---07H这8个地址,从指令表看可以看到RS=0;RW=0;DB7与DB6分别为01,只有DB0--DB6 六位为地址为,DB6 DB5 DB4都为0代表这8个自定义字符,后3位是8个字模数据的地址;     

                 CGRAM地址:  01000000 0x40   首地址,代表字模数据从第一行开放入

                               01000001 0x41 从第二行开始,上一行空出来                

                               01000010 0x42                 

                               01000011    0x43                   

                               01000100 0x44                 

                                  01000101   0x45                

                               01000110 0x46               

                               01000111 0x47          

    举例说明:我们向这8个字节写入字模数据,显示个"日"字;

    如果CGRAM地址设置为0x40:则"日"字的第一行就是从8行最上面开始写,即0x1f就是放到了最上面

     

    如果开始设置CGRAM地址写入0x41:这样的话"日"字的第一行就放在了8行的第二行

     

     

    //LCD1602显示自定义字符测试程序

    //STC89C52RC 12MHz

    #include <reg52.h>

    #define uint unsigned int

    #define uchar unsigned char

    sbit rs=P3^5;//1602数据命令选择线

    //sbit rw=P3^6;rw=0;rw直接接GND 一直写不读

    sbit en=P3^4;//1602使能控制线

    /*P0口接1602的D0-D7********************/

    uchar code table[]={

        0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,            //℃,代码 0x00

        0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,             //一,代码 0x01

        0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,            //二,代码 0x02

        0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,             //三,代码 0x03

        0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,               //四,代码 0x04

        0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,            //五,代码 0x05

        0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,        //六,代码 0x06

        0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,        //日,代码 0x07

    };

    void delay(uint t) //延时函数 用延时函数代替忙检测

    {

     uint x,y;

     for(x=t;x>0;x--)

      for(y=110;y>0;y--);

    }

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

    void lcd_wcom(uchar com) //1602写命令函数

    {

     rs=0;

      //rw=0;

     P0=com;

     delay(5);

     en=1;

     en=0;

    }

    void lcd_wdat(uchar dat)//1602写数据函数

    {

     rs=1;

     //rw=0;

     P0=dat;

     delay(5);

     en=1;

     en=0;

    }

    void lcd_init()

    {

     lcd_wcom(0x38);//8位数据,5*8字形

     lcd_wcom(0x0c);//开启显示屏,关光标,光标不闪烁

     lcd_wcom(0x06);//显示地址递增,即写一个数据后,显示位置右移一位

     lcd_wcom(0x01);//清屏

    }

    void main()

    {

     uchar i;

     lcd_init();

     lcd_wcom(0x40);//设置CGRAM地址,设置为00处,从8行中第一行开始  ①第一步设置CGRAM地址

     for(i=0;i<64;i++)//写入数组中数据                                                     ②装入数组里要显示的数据

     {

      lcd_wdat(table[i]);

     }  

     lcd_wcom(0x80);    //设置字符显示位置 第一行第一个位置                ③设置显示地址,然后发送数据

     lcd_wdat(0x00);     //给1602发送字符数据  显示℃

     delay(5);

     lcd_wcom(0x81);   

     lcd_wdat(0x01);     // 显示"一"

     delay(5);

     lcd_wcom(0x82);   

     lcd_wdat(0x02);     //显示"二"

     delay(5);

     lcd_wcom(0x83);

     lcd_wdat(0x03);    //显示"三"

     delay(5);

     lcd_wcom(0x84);

     lcd_wdat(0x04);    //显示"四"

     delay(5);

     lcd_wcom(0x85);

     lcd_wdat(0x05);   //显示"五"

     delay(5);

     lcd_wcom(0x86);

     lcd_wdat(0x06);   //显示"六"

     delay(5);  

     lcd_wcom(0x87);

     lcd_wdat(0x07);   //显示"日"

     delay(5);

     while(1);

    }

     

    展开全文
  • 51单片机简单的驱动LCD1602

    千次阅读 多人点赞 2019-02-26 13:57:34
    LCD1602】 什么是LCD1602 LCD1602管脚 状态字 RAM地址映射 控制器接口时序 基本操作时序 指令介绍 电路图 【程序】 CSDN始于python,终究还是要回到自己老本行,学一学py只是一时兴起,为了自己兴趣,...

    目录

    【LCD1602】

    什么是LCD1602

    LCD1602管脚

    状态字

    RAM地址映射

    控制器接口时序

    基本操作时序

    指令介绍

    电路图

    【程序】


    CSDN始于python,终究还是要回到自己老本行,学一学py只是一时兴起,为了自己兴趣,电信才是自己的真爱。

    【LCD1602】

    什么是LCD1602

    LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符。LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示出图形。

    1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

    1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

    市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

    注意:LCD1602仅能显示字母、符号或数字,无法显示汉字。

    LCD1602管脚

    状态字

    RAM地址映射

    控制器接口时序

    1、读操作时序

    2、写操作时序

    3、时序参数

    基本操作时序

    1602的基本操作时序一共有4个,下面一一介绍。

    写程序前我们先将用到的总线接口做一个同意声明:

    #define LCD1602_DB P2			//并行输入口
    sbit LCD1602_RS = P0^5;			//数据/命令选择端
    sbit LCD1602_RW = P0^6;			//读写选择端
    sbit LCD1602_EN = P0^7;			//使能端	

    <1>读状态:RS = L,R/W = H,EN = H

    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    LCD1602_EN = 1;
    sta = LCD1602_DB;

    这样就把当前液晶的状态字读到了sta这个变量中,可以通过判断sta最高位的值来了解当前液晶是否处于“忙”状态,也可以得知当前数据的指针位置。

    <2>读数据:RS = H,R/W = H,EN = H

    在实际使用时,读数据很少使用,大家可以仅了解就行。

    <3>写指令:RS = L,R/W = L,D0~D7 = 指令码,EN = 高脉冲

    在这里就E = 高脉冲需要了解一下。因为这一句很关键,当前状态是写数据,根据时序图,首先保证EN引脚是低电平状态,不管前三句之前怎么设置,1602这里EN引脚没有使能控制,就不会读总线上的信号。当前三句准备好之后,让EN引脚从低电平到高电平变化,然后EN引脚再从高电平到低电平出现一个下降沿,1602检测到这个下降沿之后,并且检测到RS = L,R/W = L,就会马上读取D0~D7的数据,完成单片机写1602指令的过程。

    归纳:EN使能引脚先低拉高,再从高拉低,形成一个高脉冲。

    <4>写数据:RS = H,R/W = L,D0~D7 = 数据,EN = 高脉冲

    写数据与写指令类似,就是把RS改成H,把总线改成数据而已。

    指令介绍

    1、显示模式设置

    写指令0x38:设置16×2显示,5×7点阵,8位数据接口。(这条指令是固定的,必须写0x38)

    2、显示开/关以及光标设置指令

    如下图所示:

    第一条指令:一个字节中8位,前5位是固定的0B0001,低3位分别用DCB从高到低表示

    第二条指令:高6位是固定的0B000001,低2位使用NS从高到低表示

    3、清屏指令

    写入0x01表示显示清屏(固定的),其中包含了数据指针清零,所有的显示清零。

    写入0x02仅仅是数据指针清零,显示不清零。

    4、RAM地址设置指令

    该指令的最高位为1,低7位为RAM地址,RAM地址与液晶上字符的关系如上图所示。通常在读写数据之前都要先设置好地址,然后再进行数据的读写操作。

    5、初始化过程

    延时15ms

    写指令38H(不检测忙信号)

    延时5ms

    写指令38H(不检测忙信号)

    延时5ms

    写指令38H(不检测忙信号)

    (以后每次写指令、读/写数据操作前,都要检测忙信号)

    写指令38H:显示模式设置

    写指令08H:显示关闭

    写指令01H:显示清屏

    写指令06H:显示光标移动设置

    写指令0CH:显示开及光标设置

    电路图

    或者可以参考下图

    【程序】

    关于LCD1602的参考程序,我在这里放两个,一个是自己最开始做51小车时写的关于LCD1602的程序,以下程序仅供参考

    /*写命令*/
    void Write_Cmd(uchar cmd)
    {
    	LCD1602_RS = 0;			//写入命令
    	LCD1602_RW = 0;
    	LCD1602_DB = cmd;			
    	Delay_10us(10);
    	LCD1602_EN = 1;			//使能端高电平
    	Delay_10us(10);
    	LCD1602_EN = 0;
    }
    
    /*写数据*/
    void Write_Dat(uchar dat)
    {
    	LCD1602_RS = 1;
    	LCD1602_RW = 0;
    	LCD1602_DB = dat;
    	Delay_10us(10);
    	LCD1602_EN = 1;			//使能端高电平
    	Delay_10us(10);
    	LCD1602_EN = 0;
    }
    
    /*LCD1602初始化*/
    void LCD_INIT()
    {
    	Write_Cmd(0x38);		//设置显示模式
    	Write_Cmd(0x0c);		//开显示不显示光标,光标不闪烁
    	Write_Cmd(0x06);		//写一个指针+1
    	Write_Cmd(0x01);		//清屏
    	Write_Cmd(0x80);		//设置数据指针起点
    }
    
    /*延时函数*/
    void Delay_10us(uint n)
    {
    	while(n--)
    	{		
    		_nop_();
    		_nop_();
    		_nop_();
    		_nop_();
    		_nop_();
    	}
    }
    
    /*LCD1602显示*/
    void Print_LCD1602()
    {
    	uint i,j;
    	Write_Cmd(0x80);				//写第1行
    	for(i = 0;i < 6;i++)
    		Write_Dat(str1[i]);
    	for(i = 0;i < 4;i++)
    		Write_Dat(disdata[i]);
    	for(i = 0;i < 4;i++)
    		Write_Dat(str2[i]);
    	
    	Write_Dat(0x20);
    	
    	if(HAA == 1)
    		Write_Dat('B');
    	else if(HAA == 0)
    		Write_Dat('T');
    	
    	Write_Cmd(0x80 + 0x40);	//写第2行
    	for(j = 0;j < 9;j++)
    		Write_Dat(str3[j]);
    	for(j = 0;j < 4;j++)
    		Write_Dat(distance[j]);
    	for(j = 0;j < 2;j++)
    		Write_Dat(str4[j]);
    }

    另一个是自己后来多了解之后看的

    #define LCD1602_DB P2			//并行输入口
    sbit LCD1602_RS = P0^5;			//数据/命令选择端
    sbit LCD1602_RW = P0^6;			//读写选择端
    sbit LCD1602_EN = P0^7;			//使能端	
    
    void main()
    {
        LCD1602_Init();
        LCD1602_Show(2,0,"Xiaomo_HAA");
        LCD1602_Show(0,11,"HAppy!");
    }
    
    //等待液晶准备好
    void LCD1602_wait()
    {
        unsigned char sta;
        LCD1602_DB = 0xff;
        LCD1602_RS = 0;
        LCD1602_RW = 1;
    
        do{
            LCD1602_EN = 1;
            sta = LCD1602_DB;    //读取状态字
            LCD1602_EN = 0;      
        }while(sta & 0x80);      //bit7等于1表示液晶正忙,重复检测直到其为0为止
    }
    
    //写命令
    void LCD1602_cmd(unsigned char cmd)
    {
        LCD1602_wait();
        LCD1602_RS = 0;
        LCD1602_RW = 0;
        LCD1602_DB = cmd;
        LCD1602_EN = 1;
        LCD1602_EN = 0;
    }
    
    //写数据
    void LCD1602_Data(unsigned char dat)
    {
        LCD1602_wait();
        LCD1602_RS = 1;
        LCD1602_RW = 0;
        LCD1602_DB = dat;
        LCD1602_EN = 1;
        LCD1602_EN = 0;
    }
    
    //设置显示RAM起始地址(x,y对应屏幕上字符坐标)
    void LCD1602_SetRAM(unsigned char x,unsigned char y)
    {
        unsigned char addr;
        if(y == 0)
            addr = 0x00 + x;
        else
            addr = 0x40 + x;
        LCD1602_cmd(addr | 0x80);
    }
    
    //显示字符串
    void LCD1602_Show(unsigned char x,unsigned y,unsigned char *str)
    {
        LCD1602_SetRAM(x,y);
        while(*str != '\0')
        {
            LCD1602_Data(*str++);
        }
    }
    
    //初始化LCD1602
    void LCD1602_Init()
    {
    	LCD1602_cmd(0x38);		//设置显示模式
    	LCD1602_cmd(0x0c);		//开显示不显示光标,光标不闪烁
    	LCD1602_cmd(0x06);		//写一个指针+1
    	LCD1602_cmd(0x01);		//清屏
    }

     

     

    展开全文
  • LCD1602简介: 602字符型液晶也叫1602液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。字符型液晶,能够同时显示16x02即32个字符。 它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都...
  • LCD1602和LCD12864是典型的单片机显示电路中常用的模块,两种该模块都属于点阵式液晶显示模块。 1、LCD1602模块 1602液晶也叫160字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。1602LCD是...
  • C51单片机LCD1602驱动程序LCD1602简介1602的引脚操作时序写操作时序时序参数LCD1602关键性操作一、初始化二、清屏指令二、进入模式设置指令三、显示开关控制指令四、功能设定指令RAM地址映射图 LCD1602简介 LCD1602...
  • 单片机外设LCD1602液晶屏的介绍

    万次阅读 多人点赞 2017-06-04 22:09:59
    LCD(Liquid CrystalDisplay):液晶显示器的缩写,一种被动式的显示器,即液晶本身并不发光,而是经液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或黑底白字显示的目的。   液晶显示器具有功耗低、...
  • 关注【电子开发圈】微信公众号,一起学习吧!...电子DIY、Arduino、51单片机、STM32单片机、FPGA…… 电子百科、开发技术、职业经验、趣味知识、科技头条、设备拆机…… 点击链接,免费下载100G+电子设计学习资料! ...
  • 基于51单片机DS18B20测温LCD1602显示可调时间和温度的项目一、前言1、基于51单片机DS18B20测温LCD1602显示可调时间和温度的项目包括用Keil软件编写单片机C语言程序和用Proteus软件仿真单片机外围电路2、基于51单片机...
  • 【51单片机】(手把手教你)1602液晶屏-基础篇

    万次阅读 多人点赞 2016-02-04 20:22:39
    1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔...
  • 单片机控制LCD1602液晶屏模块化编程

    千次阅读 2017-01-05 23:55:00
    这里将我编写的STC12C5A60S2单片机控制1602液晶屏的程序共享一下,希望前辈们给予斧正 。
  • 51单片机:proteus仿真1602LCD的显示

    千次阅读 2020-08-17 00:24:08
    基于keilC51和proteus实现1602LCD的显示 这是我自己用proteus仿真学习了1602的中英文显示后自己的一些感悟和经验总结,欢迎讨论交流 1602lcd的介绍 1.引脚定义 主要要注意RS、RW、E的作用 2.CGRAM,CGROM和DDRAM ...
  • 51单片机1602液晶显示(汇编语言)

    千次阅读 2019-12-29 21:30:53
    其他资料参考上传的文件 51单片机1602液晶操作(汇编版本) 二、连接原理图 单片机引脚 1602引脚 P0 D0-D7 P2.0 RS P2.1 R/W P2.2 E 无 VSS(GND) 无 V...
  • 单片机:矩阵键盘和LCD1602

    千次阅读 2018-02-08 14:58:28
    一、矩阵键盘 1、检测按键的方法:(1)先使1-4全部赋低电平,5-8赋高电平。当有按键按下时,5-8中会有某个点平被拉低。(2)然后依次将1-4中的某一位置0,其他位置1,观察对应返回值,即可确定哪个按键被按下。...
  • 3分钟了解LCD1602液晶显示屏的使用

    千次阅读 2020-02-17 11:42:19
    作为各类单片机实物设计的常用显示屏,LCD1602是一种专门用于显示字母、数字、符号等点阵式LCD,其1602是指LCD显示的内容为16X2,即可以显示两行,每行16个字符(1个汉字占用2个字符)。 2.硬件参数 (1)LCD...
  • 详解LCD1602液晶显示屏的使用

    万次阅读 2019-10-27 12:05:19
    作为各类单片机实物设计的常用显示屏,LCD1602是一种专门用于显示字母、数字、符号等点阵式LCD,其1602是指LCD显示的内容为16X2,即可以显示两行,每行16个字符(1个汉字占用2个字符)。 2.硬件参数 (1) LCD1602主要...
  • 单片机LCD1602

    2020-02-20 19:48:45
    index
  • 代码随笔——点阵汉字在LCD上的显示 注:本文约在半年到一年前写的。 其实我以前从没想过写Framebuffer的代码,网上流传较多的是LCD的移植(主要改参数),之后没下文了。不过,曾经兴致冲冲地想搞Qtopia移植,在...
  • LCD1602液晶屏使用(51单片机七夕特别版)LCD1602简介实现过程操作时序指令码如何改变文本的样式代码效果图 今天是七夕节,周围的朋友啊小姐妹(伪)啊都跟对象出去玩了 囧rz,而我·又是一个有理想有追求的男人,...
1 2 3 4 5 ... 11
收藏数 206
精华内容 82
关键字:

单片机lcd字母移动