小白跟做江科大51单片机之LCD1602滚动显示效果

本文详细介绍了如何使用LCD1602液晶显示器与STC单片机的接口,包括接口配置、时序分析、命令和数据编写以及初始化和显示字符、字符串、数字和二进制/十六进制数的方法。通过示例代码展示了LCD1602的滚动显示功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.查看原理图

图1 LCD1602接口

图2 LCD1602与STC的接口

2.编写代码

图3 时序结构

根据时序结构编写命令和写入数据代码

#include <REGX52.H>
#include "Delay.h"

sbit LCD1602_EN=P2^7;
sbit LCD1602_RS=P2^6;
sbit LCD1602_WR=P2^5;

#define LCD1602_lCD0  P0  //因为是并口通信,一个就行

void LCD1602_WriteCommand(unsigned char command)
{
    LCD1602_RS=0;           //RS为低电平时表示发送指令
    LCD1602_WR=0;           //表示开始写,写命令和写数据都是WR=0
    LCD1602_lCD0=command;
    LCD1602_EN=1;
    Delay();
    LCD1602_EN=0;
    Delay();
}

void LCD1602_WriteData(unsigned char Data)
{
    LCD1602_RS=1;           //RS为高电平时表示发送的是数据
    LCD1602_WR=0;           //表示开始写
    LCD1602_lCD0=Data;
    LCD1602_EN=1;
    Delay();
    LCD1602_EN=0;
    Delay();
}

根据操作流程进行初始化和显示数据代码函数的编写

void LCD1602_Init()
{
    LCD1602_WriteCommand(0x38);
    LCD1602_WriteCommand(0x0C);
    LCD1602_WriteCommand(0x06);
    LCD1602_WriteCommand(0x01);
}

void LCD1602_showChar(unsigned char line,unsigned char column,unsigned char C)
{
    
    if(line==1)
    {
        LCD1602_WriteCommand(0x80|column-1);
    }
    else
    {
        LCD1602_WriteCommand(0x80|(column-1)+0x40);
    }
    LCD1602_WriteData(C);
}

LCD1602.C代码汇总

#include <REGX52.H>
#include "Delay.h"

sbit LCD1602_EN=P2^7;
sbit LCD1602_RS=P2^6;
sbit LCD1602_WR=P2^5;

#define LCD1602_lCD0  P0  //因为是并口通信,一个就行

void LCD1602_WriteCommand(unsigned char command)
{
    LCD1602_RS=0;           //RS为低电平时表示发送指令
    LCD1602_WR=0;           //表示开始写,写命令和写数据都是WR=0
    LCD1602_lCD0=command;
    LCD1602_EN=1;
    Delay();
    LCD1602_EN=0;
    Delay();
}

void LCD1602_WriteData(unsigned char Data)
{
    LCD1602_RS=1;           //RS为高电平时表示发送的是数据
    LCD1602_WR=0;           //表示开始写
    LCD1602_lCD0=Data;
    LCD1602_EN=1;
    Delay();
    LCD1602_EN=0;
    Delay();
}

void LCD1602_Init()
{
    LCD1602_WriteCommand(0x38);
    LCD1602_WriteCommand(0x0C);
    LCD1602_WriteCommand(0x06);
    LCD1602_WriteCommand(0x01);
}

第1行和第二行要注意按图修改

void LCD1602_showChar(unsigned char line,unsigned char column,unsigned char C)
{
    
    if(line==1)
    {
        LCD1602_WriteCommand(0x80|column-1);
    }
    else
    {
        LCD1602_WriteCommand(0x80|(column-1)+0x40);
    }
    LCD1602_WriteData(C);
}

void LCD_ShowString(unsigned char line,unsigned char Column,char *String)
{
    unsigned char i;
    if(line==1)
    {
        LCD1602_WriteCommand(0x80|Column-1);
    }
    else
    {
        LCD1602_WriteCommand(0x80|(Column-1)+0x40);
    }
    for(i=0;String[i];i++)
    LCD1602_WriteData(String[i]);
}


void LCD_ShowNum(unsigned char line,unsigned char Column,unsigned int Number,unsigned char Length)
{
    unsigned char i=0;
    if(line==1)
    {
        LCD1602_WriteCommand(0x80|Column-1);
    }
    else
    {
        LCD1602_WriteCommand(0x80|(Column-1)+0x40);
    }
    while(i<Length)
    {
        if(Number>10000)
        {
            LCD1602_WriteData('0'+(unsigned char)(Number/10000));
            Number=Number%10000;
        }
        else if(Number>1000)
        {
            LCD1602_WriteData('0'+(unsigned char)(Number/1000));
            Number=Number%1000;
        }
        else if(Number>100)
        {
            LCD1602_WriteData('0'+(unsigned char)(Number/100));
            Number=Number%100;
        }
        else if(Number>10)
        {
            LCD1602_WriteData('0'+(unsigned char)(Number/10));
            Number=Number%10;
        }
        else
        {
            LCD1602_WriteData('0'+(unsigned char)(Number%10));
            break;
        }
        i++;
    }
}


void LCD_ShowSignedNum(unsigned char line,unsigned char Column,int Number,unsigned char Length)
{
    unsigned char i=0;
    
    if(line==1)
    {
        LCD1602_WriteCommand(0x80|Column-1);
    }
    else
    {
        LCD1602_WriteCommand(0x80|(Column-1)+0x40);
    }
    if(Number<0)
    {
        LCD1602_showChar(line,Column,'-');
        Number=-Number;
    }
    else
    {
        LCD1602_showChar(line,Column,'+');
    }
    while(i<Length)
    {
        if(Number>10000)
        {
            LCD1602_WriteData('0'+(unsigned char)(Number/10000));
            Number=Number%10000;
        }
        else if(Number>1000)
        {
            LCD1602_WriteData('0'+(unsigned char)(Number/1000));
            Number=Number%1000;
        }
        else if(Number>100)
        {
            LCD1602_WriteData('0'+(unsigned char)(Number/100));
            Number=Number%100;
        }
        else if(Number>10)
        {
            LCD1602_WriteData('0'+(unsigned char)(Number/10));
            Number=Number%10;
        }
        else
        {
            LCD1602_WriteData('0'+(unsigned char)(Number%10));
            break;
        }
        i++;
    }
}

void LCD_ShowBinNum(unsigned char line,unsigned char Column,unsigned int Number,unsigned char Length)
{
     unsigned char Binarr[16]={'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
     unsigned char i=0;
    if(line==1)
    {
        LCD1602_WriteCommand(0x80|Column-1);
    }
    else
    {
        LCD1602_WriteCommand(0x80|(Column-1)+0x40);
    }
    while(Number)
    {
        Binarr[i]='0'+(unsigned char)Number%2;
        Number=Number/2;
        i++;
    }
    
    for(i=Length;i>0;i--)
    {
        LCD1602_WriteData(Binarr[i-1]);
    }
}


void LCD_ShowHexNum(unsigned char line,unsigned char Column,unsigned int Number,unsigned char Length)
{
    unsigned char Hexnum[4]={'0','0','0','0'};
    unsigned char temp,i;
    if(line==1)
    {
        LCD1602_WriteCommand(0x80|Column-1);
    }
    else
    {
        LCD1602_WriteCommand(0x80|(Column-1)+0x40);
    }
    while(Number)
    {
        temp=Number%16;
        if(temp<10)
        {
            Hexnum[i]='0'+temp;
        }
        else
        {
            Hexnum[i]='A'+(temp-10);
        }
        Number=Number/16;
        i++;
    }
    
    for(i=Length;i>0;i--)
    {
        LCD1602_WriteData(Hexnum[i-1]);
    }
    
}

LCD1602.h代码展示

#ifndef __LCD1602_H__
#define __LCD1602_H__

void LCD1602_WriteCommand(unsigned char command);
void LCD1602_Init();
void LCD1602_showChar(unsigned char line,unsigned char column,unsigned char C);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

#endif

3.编写main.c代码

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"

void main()
{
    LCD1602_Init();
    LCD1602_showChar(1,1,'+');
    LCD_ShowString(1,3,"Hello");
    LCD_ShowNum(1,9,212,4);
    LCD_ShowSignedNum(2,1,-212,4);
    LCD_ShowBinNum(1,13,32,16);
    LCD_ShowHexNum(2,5,15,2);
    while(1)    
    {
        unsigned char i,j,k;
        LCD1602_WriteCommand(0x18);   //移动屏幕命令0x18
        i = 10     ;
        j = 11;
        k = 45;
        do
        {
            do
            {
                while (--k);
            } while (--j);
        } while (--i);

    }
}

4.结果展示

LCD1602滚动显示

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值