欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 296|回复: 4

STC单片机LCD1602实验

[复制链接]
发表于 2022-12-11 12:07:57 | 显示全部楼层 |阅读模式
#include "lcd.h"

/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能           : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
    for (; c>0; c--)
    {
         for (b=199;b>0;b--)
         {
              for(a=1;a>0;a--);
         }      
    }
        
}

/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能           : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
#ifndef     LCD1602_4PINS     //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com)      //写入命令
{
    LCD1602_E = 0;     //使能
    LCD1602_RS = 0;       //选择发送命令
    LCD1602_RW = 0;       //选择写入
   
    LCD1602_DATAPINS = com;     //放入命令
    Lcd1602_Delay1ms(1);        //等待数据稳定

    LCD1602_E = 1;              //写入时序
    Lcd1602_Delay1ms(5);      //保持时间
    LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)      //写入命令
{
    LCD1602_E = 0;     //使能清零
    LCD1602_RS = 0;     //选择写入命令
    LCD1602_RW = 0;     //选择写入

    LCD1602_DATAPINS = com;    //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
    Lcd1602_Delay1ms(1);

    LCD1602_E = 1;     //写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;

    LCD1602_DATAPINS = com << 4; //发送低四位
    Lcd1602_Delay1ms(1);

    LCD1602_E = 1;     //写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能           : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/           
#ifndef     LCD1602_4PINS           
void LcdWriteData(uchar dat)            //写入数据
{
    LCD1602_E = 0;    //使能清零
    LCD1602_RS = 1;    //选择输入数据
    LCD1602_RW = 0;    //选择写入

    LCD1602_DATAPINS = dat; //写入数据
    Lcd1602_Delay1ms(1);

    LCD1602_E = 1;   //写入时序
    Lcd1602_Delay1ms(5);   //保持时间
    LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)            //写入数据
{
    LCD1602_E = 0;      //使能清零
    LCD1602_RS = 1;      //选择写入数据
    LCD1602_RW = 0;      //选择写入

    LCD1602_DATAPINS = dat;    //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
    Lcd1602_Delay1ms(1);

    LCD1602_E = 1;      //写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;

    LCD1602_DATAPINS = dat << 4; //写入低四位
    Lcd1602_Delay1ms(1);

    LCD1602_E = 1;      //写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能         : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/           
#ifndef        LCD1602_4PINS
void LcdInit()                          //LCD初始化子程序
{
     LcdWriteCom(0x38);  //开显示
    LcdWriteCom(0x0c);  //开显示不显示光标
    LcdWriteCom(0x06);  //写一个指针加1
    LcdWriteCom(0x01);  //清屏
    LcdWriteCom(0x80);  //设置数据指针起点
}
#else
void LcdInit()                          //LCD初始化子程序
{
    LcdWriteCom(0x32);     //将8位总线转为4位总线
    LcdWriteCom(0x28);     //在四位线下的初始化
    LcdWriteCom(0x0c);  //开显示不显示光标
    LcdWriteCom(0x06);  //写一个指针加1
    LcdWriteCom(0x01);  //清屏
    LcdWriteCom(0x80);  //设置数据指针起点
}
#endif


本帖子中包含更多资源

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

×
发表于 2022-12-21 08:32:22 | 显示全部楼层
3个文件整合下载

本帖子中包含更多资源

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

×
 楼主| 发表于 2022-12-21 10:13:12 | 显示全部楼层

发表于 2023-3-23 09:27:23 | 显示全部楼层
读状态:RS = L,R/W = H,EN = H

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

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

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

LCD1602指令(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

(X表示1or0都行,一般是0)

1.工作方式设置指令:

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

0 0 0 0 1 DL N F X X

DL:设置数据接口位数。

DL=1:8位数据接口(D7—D0);DL=0:4位数据接口(D7—D4)。

N=0:一行显示;N=1:两行显示。

F=0:5×8点阵字符;F=1:5×10点阵字符。

例如:8位数据接口,两行显示,5×8点阵,即0b00111000也就是0x38。

2.显示开关控制指令:0 0 0 0 0 0 1 D C B

(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

D=1:显示开,D=0:显示关。

C=1:光标显示,C=0:光标不显示。

B=1:光标闪烁,B=0:光标不闪烁。

3.进入模式设置指令:0 0 0 0 0 0 0 1 I/D S

(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

I/D=1:写入新数据后光标右移;I/D=0:写入新数据后光标左移。

S=1:显示移动;S=0:显示不移动。

4.光标或显示移动指令:0 0 0 0 0 1 S/C R/L X X

(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

在需要进行整屏移动时,这个指令非常有用,可以实现屏幕的滚动显示效果。初始化时不使用这个指令。

5.清屏指令:0 0 0 0 0 0 0 0 0 1

(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

清除屏幕显示内容。光标返回屏幕左上角。执行这个指令时需要一定时间。

6.光标归位指令:0 0 0 0 0 0 0 0 1 X

(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

光标返回屏幕左上角,它不改变屏幕显示内容。

7.设置CGRAM地址指令:0 0 0 1 a a a a a a

(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

8.设置DDRAM地址指令:0 0 1 a a a a a a a

(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

这个指令用于设置DDRAM地址。在对DDRAM进行读写之前,首先要设置DDRAM地址,然后才能进行读写。前面我们说过,DDRAM就是LCD1602的显示存储器。我们要在它上面进行显示,就要把要显示的字符写入DDRAM。同样,我们想知道DDRAM某个地址上有什么字符,也要先设置DDRAM地址,然后将它读出到单片机。

9.读忙信号和地址计数器AC:0 1 BF a a a a a a a

(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

对于单片机来说,LCD1602属于慢速设备。当单片机向其发送一个指令后,它将去执行这个指令。这时如果单片机再次发送下一条指令,由于LCD1602速度较慢,前一条指令还未执行完毕,它将不接受这新的指令,导致新的指令丢失。当BF=1,表示LCD1602正忙,不能接受单片机的指令;当BF=0,表示LCD1602空闲,可以接收单片机的指令。RS=0,表示是指令;RW=1,表示是读取。LCD1602维护了一个地址计数器AC,用来记录下一次读写CGRAM或DDRAM的位置。

10.写数据到CGRAM或DDRAM指令:1 0 d d d d d d d d

(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

RS=1,数据;RW=0,写。指令执行时,要在DB7—DB0上先设置好要写入的数据,然后执行写命令。

11.从CGRAM或DDRAM读数据指令:1 1 d d d d d d d d

(RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0)

RS=1,数据;RW=1,读。先设置好CGRAM或DDRAM的地址,然后执行读取命令。数据就被读入后DB7—DB0。
 楼主| 发表于 2023-3-27 11:11:27 | 显示全部楼层
BCWG 发表于 2023-3-23 09:27
读状态:RS = L,R/W = H,EN = H

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

高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2025-10-31 11:32

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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