51单片机——LCD1602液晶屏 C语言入门编程

发布者:自在自由最新更新时间:2022-09-16 来源: csdn关键字:51单片机  LCD1602  液晶屏  C语言 手机看文章 扫描二维码
随时随地手机看文章

LCD1602

1602液晶也叫1602字符型液晶,它能显示2行字符信息,每行又能显示16个字符。它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若 干个5x7的点阵字符位组成,每个点阵字符位都可以用显示一个字符, 每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。


字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。写入显示地址时要求最高位D7恒定为高电平1。

数据指令: 

//初始化

0X38 //八位数据接口,两行显示,5*7点阵

0X0C //显示开,光标关,闪烁关

0X06 //数据读、写操作后,AC自动加一,画面不动

0X01 //清除DDRAM和AC值,光标复位(清屏)

//显示位置

发送指令(0x80|(lie-1)); //设置光标位置80~8F

发送指令(0x80|(lie-1)+0x40); //设置光标位置C0~CF

字节写入时序:

不是所有的地址都可以直接用来显示字符数据,只有第一行中的00-0F,第二行中的40-4F才能显示,其他地址只能用于存储。要使用LCD1602,首先需要对其初始化,即通过写入一些特定的指令实现。 然后选择要在LCD1602的哪个位置显示并将所要显示的数据发送到LCD的DDRAM。


①当要写指令字,设置LCD1602的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入(下降沿即可)。


②当要写入数据字,在1602上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入(下降沿即可)。 写指令和写数据,差别仅仅在于RS的电平不一样而已。


当要写命令字节的时候,时间由左往右,RS变为低电平,R/W变为低电平, 注意看是RS的状态先变化完成。然后这时,DB0~DB7上数据进入有效阶段,接着E引脚有一个整脉冲的跳变,接着要维持时间最小值为tpw=400ns的E脉冲宽 度。然后E引脚负跳变,RS电平变化,R/W电平变化。这样便是一个完整的LCD1602写命令的时序。

1. LCD1602:LCD1602液晶上显示字符信息

LCD1602函数


#include

#include "intrins.h"

 

sbit LCD_RS=P2^6;

sbit LCD_WR=P2^5;

sbit LCD_EN=P2^7;

#define LCD_DB P0

 

void LCD_Delay1ms()//LCD1602延时1ms函数@11.0592MHz

{

    unsigned char i, j;

    _nop_();

    i = 2;

    j = 199;

    do

    {

        while (--j);

    } while (--i);

}

 

void LCD1602_WriteCommand(unsigned char Command)//写指令

{

    LCD_RS=0;

    LCD_WR=0;

    LCD_DB=Command;

    LCD_EN=1;

    LCD_Delay1ms();//延时 速度太快可能读不过来

    LCD_EN=0;

    LCD_Delay1ms();//延时 速度太快可能读不过来

}

 

void LCD1602_WriteData(unsigned char Data)//写数据

{

    LCD_RS=1;

    LCD_WR=0;

    LCD_DB=Data;

    LCD_EN=1;

    LCD_Delay1ms();//延时 速度太快可能读不过来

    LCD_EN=0;

    LCD_Delay1ms();//延时 速度太快可能读不过来

}

 

void LCD1602_Init(void)//初始化

{

    LCD1602_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵

    LCD1602_WriteCommand(0x0c);//显示开,光标关,闪烁关

    LCD1602_WriteCommand(0x06);//数据读、写操作后,AC自动加一,画面不动

    LCD1602_WriteCommand(0x01);//清除DDRAM和AC值,光标复位(清屏)

}

 

void LCD1602_SetCursor(unsigned char hang,lie)//设置光标位置 1~2行,1~16列

{

    if(hang==1)

    {

        LCD1602_WriteCommand(0x80|(lie-1));//第一行设置光标位置80~8F

    }

    else if(hang==2)

    {

    LCD1602_WriteCommand(0x80|(lie-1)+0x40);//第二行设置光标位置C0~CF

    }

}

 

void LCD1602_zifu(unsigned char hang,lie,Data)//显示字符 1~2行,1~16列,字符'*'

{

    LCD1602_SetCursor(hang,lie);

    LCD1602_WriteData(Data);

}

 

void LCD1602_zifuchuan(unsigned char hang,lie,char *Datas)//显示字符串 1~2行,1~16列,字符串"**"

{

    unsigned char i;

    LCD1602_SetCursor(hang,lie);

    for(i=0;Datas[i]!='';i++) 

    {

        LCD1602_WriteData(Datas[i]);

    }

}

 

int LCD_Pow(int X,int Y)//返回值=X的Y次方

{

    unsigned char i;

    int Result=1;

    for(i=0;i    {

        Result*=X;

    }

    return Result;

}

 

void lCD1602_shuzi(unsigned char hang,lie,unsigned int Num,unsigned char wei)//显示十进制数字 1~2行,1~16列,数字0~65535,范围1~5

{

    unsigned char i;

    LCD1602_SetCursor(hang,lie);

    for(i=wei;i>0;i--)

    {

        LCD1602_WriteData(Num/LCD_Pow(10,i-1)%10+'0');

    }

}

 

void LCD1602_zfshuzi(unsigned char hang,lie,int zfNum,unsigned char wei)//显示有符号十进制数字 1~2行,1~16列,数字-32768~32767,范围1~5

{

    unsigned char i;

    unsigned int zfNumber;

    LCD1602_SetCursor(hang,lie);

    if(zfNum>=0)

    {

        LCD1602_WriteData('+');

        zfNumber=zfNum;

    }

    else

    {

        LCD1602_WriteData('-');

        zfNumber=-zfNum;

    }

    for(i=wei;i>0;i--)

    {

        LCD1602_WriteData(zfNumber/LCD_Pow(10,i-1)%10+'0');

    }

}

 

void LCD1602_hex(unsigned char hang,lie,unsigned int hex,unsigned char wei)//显示十六进制数字 1~2行,1~16列,数字0~0xFFFF,范围1~4

{

    unsigned char i,hexnum;

    LCD1602_SetCursor(hang,lie);

    for(i=wei;i>0;i--)

    {

        hexnum=hex/LCD_Pow(16,i-1)%16;

        if(hexnum<10)

        {

            LCD1602_WriteData(hexnum+'0');

        }

        else

        {

            LCD1602_WriteData(hexnum-10+'A');

        }

    }

}

 

void LCD1602_bin(unsigned char hang,lie,unsigned int bin,unsigned char wei)//显示二进制数字 1~2行,1~16列,数字0~1111 1111 1111 1111,范围1~16

{

    unsigned char i;

    LCD1602_SetCursor(hang,lie);

    for(i=wei;i>0;i--)

    {

        LCD1602_WriteData(bin/LCD_Pow(2,i-1)%2+'0');

    }

}


主函数


#include

#include "LCD1602.h"

 

void main()

{

    LCD1602_Init();

    LCD1602_zifu(1,1,'a');

    LCD1602_zifuchuan(1,3,"Hello");

    lCD1602_shuzi(1,9,12,5);

    LCD1602_hex(1,15,0xae,2);

    LCD1602_bin(2,1,0xaa,8);

    LCD1602_zfshuzi(2,10,-36,2);

    while(1)

    {

    }

}

关键字:51单片机  LCD1602  液晶屏  C语言 引用地址:51单片机——LCD1602液晶屏 C语言入门编程

上一篇:#C51串口通讯1-#一串数据#接收与发送(基础概念)
下一篇:51单片机——ADC模数转换、DAC数模转换PWM C语言入门编程

小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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