51单片机lcd1602显示(模块)

假期自己学习了51单片机,今天刚好学到了LCD602,我也开始在csdn中开始了自己的第一篇文章,因为是刚开始学所以难免不会有错误,但是呢,还是希望能和大家一起学习交流一下。

简介:

作为各类单片机实物设计的常用显示屏,LCD1602是一种专门用于显示字母、数字、符号等点阵式LCD,其1602是指LCD显示的内容为16X2,即可以显示两行,每行16个字符(1个汉字占用2个字符)。这里需要要注意的是lcd1602是不能显示汉字的,它只能显示字母字符。

硬件参数:

1602使用三条控制线:EN、RW、RS。

 他们当中EN的作用其实就是中线的功能,RW和RS指示了读、它写的是写的方向和内容。在读数据(或者Busy标志)期间,EN线必须保持高电平;而在写指令(或者数

据)过程中,EN线上必须送出一个正脉冲。RW、RS的组合一共有四种情况,分别对应四种操作:

RS=0、RW=0——表示向LCD写入指令。

RS=0、RW=1——表示读取Busy标志。

RS=1、RW=0——表示向LCD写入数据。

RS=1、RW=1——表示从LCD读取数据。LCD1602引脚定义如表3.2。
1. 读状态:输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。
2. 读数据:输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。
3. 写命令:输入RS=0,RW=0,E=低脉冲。输出:无。(写完置E=高脉冲)
4. 写数据:输入RS=1,RW=0,E=低脉冲。输出:无。

1602引脚信号说明
字符型LCD1602通常分为14条引脚和16引脚两种,16引脚多出来的是背光电源线VCC(15引脚)和地线(16引脚),其控制原理与14引脚LCD完全一样,引脚定义如下表:

引脚号    引脚名    电平    输入/输出    作用
1    Vss            电源地
2    Vcc            电源(+5V)
3    Vee            对比调整电压
4    RS    0/1    输入    0=输入指令;1=输出数据
5    R/W    0/1    输入    0=向LCD写入指令或数据; 1=从LCD读取信息
6    E    1,1->0    输入    使能信号,1时读取信息,1->0(下降沿)执行指令
7    DB0    0/1    输入/输出    数据总线line0(最低位)
8    DB1    0/1    输入/输出    数据总线line1
9    DB2    0/1    输入/输出    数据总线line2
10    DB3    0/1    输入/输出    数据总线line3
11    DB4    0/1    输入/输出    数据总线line4
12    DB5    0/1    输入/输出    数据总线line5
13    DB6    0/1    输入/输出    数据总线line6
14    DB7    0/1    输入/输出    数据总线line7
15    A    +Vcc        LCD背光灯源正极
16    K    接地        LCD背光灯源负极
控制器接口介绍
1、基本操作时许
1.1读状态:输入:RS=L,RW=H,E=H
----输出:D0~D7=状态字
1.2写指令:输入:RS=L,RW=L,D0~D7=指令码
----输出:无
1.3读数据:输入:RS=H,RW=H,E=H
----输出:D0~D7=数据
1.4写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲
----输出:无
2、状态字说明
STA7 D7    STA6 D6    STA5 D5    STA4 D4    STA3 D3    STA2 D2    STA1 D1    STA0 D0
STA0-6    当前数据地址指针的数值    
STA7    读写操作使能    1:禁止 0:允许
对控制器每次进行读写操作前,都必须进行读写检测,确保STA7为0

3、指令说明
初始化设置
显示模式设置


显示开/关光标设置


数据控制
控制器内部没有一个数据地址指针,可以通过他们来访问内部的全部80字节RAM。
其他设置

指令码    功能
01H    显示清屏:1.数据指针清零 2.所有显示清零
02H    显示回车:1.数据指针清零

理论知识应该这么多下面我们直接上代码吧

源代码:

 lcd1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__
#include<reg52.h>    //包含头文件
#include"intrins.h"
#define uint unsigned int  //预定义
#define uchar unsigned char 

void delay(uint n);
void Busy(void);
void Lcd_WriteCom(uchar com);
void Lcd_WriteData(uchar dat);
void lcd_init();
#endif

 lcd1602.c

#include"lcd1602.h"

sbit rs=P2^6;    //1602的数据/指令选择控制线 
sbit rw=P2^5;        //1602的读写控制线 
sbit en=P2^7;        //1602的使能控制线

void delay(uint n)       //延时函数                       
{ 
    uint x,y;  
    for(x=n;x>0;x--) 
        for(y=110;y>0;y--); 
} 

void Busy(void)
{
	uchar temp=0;
	do
	{
		rw=1;
		rs=0;
		en=0;
		_nop_();
		en=1;
		delay(1);
		en=0;
		temp=P0;
	}while(temp&0x80);
}

void Lcd_WriteCom(uchar com)  //1602写命令函数
{ 
	P0=com;  //把命令字送入P2
	en=0; 
	rs=0;            //选择指令寄存器
    rw=0;            //选择写
    _nop_();//一个机械周期       
    en=1;           //使能线电平变化,命令送入1602的8位数据口 
    delay(1);
	en=0; 
} 

void Lcd_WriteData(uchar dat)        //1602写数据函数       
{ 
    P0=dat;        //把要显示的数据送入P0
	en=0; 
	rs=1;        //选择数据寄存器 
    rw=0;        //选择写 
    _nop_();//一个机械周期   
    en=1;        //使能线电平变化,数据送入1602的8位数据口 
	delay(1);
	en=0; 
} 

void lcd_init()              //1602初始化函数       
{ 
	delay(1);
    Lcd_WriteCom(0x38);       //8位数据,双列,5*7字形       
    Busy();
	Lcd_WriteCom(0x0c);      //开启显示屏,关光标,光标不闪烁 
    Busy();
	Lcd_WriteCom(0x06);    //显示地址递增,即写一个数据后,显示位置右移一位 
    Busy();
	Lcd_WriteCom(0x01);    //清屏 
	Busy();
	Lcd_WriteCom(0x80);   //设置数据指针起点
}

main.c


#include"lcd1602.h"

/*P0口接1602的D0~D7*/ 
uchar code table[]="i love you "; 
//uchar code aabb[]="'1','2','3','4','5','6'";            //要显示的内容放入数组table

void main()            //主函数 
{   
	int i=0;  
    uchar m=0; 
    lcd_init();       //液晶初始化 
    Lcd_WriteCom(0x80);   //显示地址设为80H(即00H,)上排第一位       
    for(m=0;m<10;m++)     //将table[]中的数据依次写入1602显示 
    { 
            Lcd_WriteData(table[m]);           
            //delay(200); 
		//	Lcd_WriteCom(0x40+0x80);

    } 
//	Lcd_WriteCom(0x40+0x80);
//	for(i=0;i<10;i++)
//	{
	// Lcd_WriteDtata('l') ;
	
	
	
//	}


    while(1);        //动态停机 
}

以上代码复制直接可以用,第一次写文章有点小紧张哈,今天写了篇文章希望可以帮助到更多的小伙伴。让我们一起进步吧!。

 

  • 6
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
51单片机上使用LCD1602显示汉字,需要先将汉字转换成对应的点阵数据,然后再通过LCD1602的指令将点阵数据写入到LCD1602的CGRAM中,最后在指定位置显示即可。 以下是一个简单的例子,演示如何显示汉字“你好”: ```c #include <reg51.h> #define LCD1602_DB P0 sbit LCD1602_RS = P2^6; sbit LCD1602_RW = P2^5; sbit LCD1602_EN = P2^7; void delay(unsigned int t) // 延时函数 { unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < 120; j++); } void LCD1602_WriteCommand(unsigned char Command) // 写入指令 { LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_EN = 0; LCD1602_DB = Command; delay(5); LCD1602_EN = 1; delay(5); LCD1602_EN = 0; } void LCD1602_WriteData(unsigned char Data) // 写入数据 { LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_EN = 0; LCD1602_DB = Data; delay(5); LCD1602_EN = 1; delay(5); LCD1602_EN = 0; } void LCD1602_Init() // LCD1602初始化函数 { LCD1602_WriteCommand(0x38); // 8位数据接口,2行显示,5x7点阵字符 LCD1602_WriteCommand(0x0c); // 显示开,光标关,光标位置不显示 LCD1602_WriteCommand(0x06); // 光标加1,写入字符后移 LCD1602_WriteCommand(0x01); // 显示清屏 } void LCD1602_WriteCGRAM(unsigned char Address, unsigned char *Data) // 写入CGRAM { unsigned char i; if(Address < 8) { LCD1602_WriteCommand(0x40 + Address * 8); for(i = 0; i < 8; i++) LCD1602_WriteData(Data[i]); } } void LCD1602_DisplayString(unsigned char x, unsigned char y, unsigned char *String) // 在指定位置显示字符串 { unsigned char i; if(x < 16) { if(y == 0) LCD1602_WriteCommand(0x80 + x); else if(y == 1) LCD1602_WriteCommand(0x80 + 0x40 + x); else return; } else return; for(i = 0; String[i] != '\0'; i++) LCD1602_WriteData(String[i]); } void main() { unsigned char NiHao[8] = {0x0e, 0x04, 0x0e, 0x04, 0x0e, 0x00, 0x0e, 0x00}; // 汉字“你”的点阵数据 unsigned char *NiHaoStr = "NiHao"; // 汉字“你”的拼音 LCD1602_Init(); // 初始化LCD1602 LCD1602_WriteCGRAM(0, NiHao); // 将汉字“你”的点阵数据写入CGRAM中,地址为0 LCD1602_DisplayString(0, 0, NiHaoStr); // 在第一行第一列显示汉字“你” while(1); } ``` 以上程序使用了一个数组存储了汉字“你”的点阵数据,先将点阵数据写入到CGRAM中,然后在指定位置显示汉字即可。如果需要显示其他汉字,可以根据对应的点阵数据进行修改。需要注意的是,LCD1602只能显示8位宽的字符,因此一个汉字需要占用2个字符位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值