微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机·LCD1602

单片机·LCD1602

时间:11-24 来源:互联网 点击:
LCD1602 (能够同时显示16x02 ,32个字符)

一、管脚功能介绍


1.GND 地线

2.VCC 电源正极

3.VL 液晶显示偏压信号(对比度清晰一点)

4.RS 数据/命令选择端

5.R/W 读/写选择端

6.EN 使能信号

7.D0~D7 P0口数据传输

8.BL+ 背光源正极

9.BL- 背光源负极

二、字符集

这是LCD1602特别值得注意的一点,我开始学习的时候,以后可以使用通用的ascii码,但是实验了很久,得不到自己想要的结果,最后才发现LCD1602有自己的字符集

(最长使用的十六进制中的A-F,可以通过 A+7来确定)


三、LCD1602 的基本时序

1.读状态:输入:RS = 0, RW = 1, EN = 1 , 输出:D0-D7 = 状态字 ;

2.写指令:输入:RS = 0, RW = 1, EN = 0 , EN = 1 ,(高脉冲) 输出:D0-D7 = 指令码 ;

3.读数据:输入:RS = 0, RW = 1, EN = 1 , 输出:D0-D7 = 数据 ;

4.写数据:输入:RS = 0, RW = 1, EN = 0 ,EN = 1 ,(高脉冲) 输出:D0-D7 = 数据;

四、LCD1602的状态字的说明

D7 D6 D5 D4 D3 D2 D1 D0

其中bit7是判断LCD忙状态的标志,每次读写LCD1602必须对其状态进行判断。

五、LCD1602初始化设置

1.显示模式设置

指令码 功能

0011 1000 16x2显示,5x7点阵,8位数据口

2.显示开关及光标设置

指令码 功能

0000 1DCB D=1 开显示;D=0 关显示 ;

C=1 显示光标;C=0 不显示光标 ;

B=1 光标闪烁;B=0 光标不闪烁 ;

0000 01NS N=1 读写一位,指针+1,光标+1 ;

N=0 读写一位,指针 -1,光标 -1

S =1 读写一位,屏幕左移(N=1)或者右移(N=0);

S =0 屏幕不移动 ;

3.指令码 01H 1.数据指针清0 ;

2.所有显示清0 ;

02H 1.数据指针清0 ;

六、实验

实验1:通过LCD1602显示简单的字符串

程序:

main.h

#ifndef _1602_H_

#define _1602_H_

typedef unsigned char uint8 ;

sbit RS = P1^0 ;

sbit RW = P1^1 ;

sbit EN = P1^5 ;

sbit BUSY = P0^7 ;

unsigned char code word1[] = {"yang zhou"} ;

unsigned char code word2[] = {"I love you"} ;

#endif

main.c

#include

#include

#include"1602.h"

void wait()

{

P0 = 0xFF ;

while(BUSY)

{

RS = 0 ;

RW = 1 ;

EN = 0 ;

EN = 1 ;

}

EN = 0 ;

}

void W_cmd(uint8 cmd)

{

wait() ;

EN = 0 ;

P0 = cmd ;

RS = 0 ;

RW = 0 ;

EN = 1 ;

EN = 0 ;

}

void Init_LCD1602()

{

W_cmd(0x38) ;

W_cmd(0x0C) ;

W_cmd(0x06) ;

W_cmd(0x01) ;

}

void W_dat(uint8 dat)

{

EN = 0 ;

P0 = dat ;

RS = 1 ;

RW = 0 ;

EN = 1 ;

EN = 0 ;

}

void W_string(uint8 *p)

{

while(*p !=)

{

W_dat(*p++) ;

}

}

main()

{

Init_LCD1602() ;

W_cmd(0x80) ;

W_string(word1) ;

W_cmd(0xC0) ;

W_string(word2) ;

while(1) ;

}

这里面有个c语言中的指针问题,我掌握的并不是很好,但是现在明白指针的必要性,因为数组进行传递时必须需要指针。


实验2:读取eeprom存储数据,再通过uart通信发送,+1后再存储回eeprom

程序:

main.h

# ifndef _MAIN_H_

# define _MAIN_H_

# include

# include

typedef unsigned char uint8 ;

typedef unsigned int uint16 ;

typedef unsigned long uint32 ;

sbit SCL = P3^7 ;

sbit SDA = P3^6 ;

sbit RS = P1^0 ;

sbit RW = P1^1 ;

sbit EN = P1^5 ;

sbit BUSY = P0^7 ;

# endif

main.c

# include "main.h"

void delay(void)

{

_nop_() ;

_nop_() ;

_nop_() ;

_nop_() ;

}

void I2C_init(void)

{

SDA = 1 ;

SCL = 1 ;

}

void I2C_start(void)

{

SDA = 1 ;

delay() ;

SCL = 1 ;

delay() ;

SDA = 0 ;

delay() ;

SCL = 0 ;

delay() ;

}

void I2C_stop(void)

{

SCL = 0 ;

delay() ;

SDA = 0 ;

delay() ;

SCL = 1 ;

delay() ;

SDA = 1 ;

delay() ;

}

void I2C_send(uint8 byte)

{

uint8 i ;

for (i=0; i<8; i++)

{

SCL = 0 ;

delay() ;

SDA = byte&0x80 ;

byte<= 1 ;

delay() ;

SCL = 1 ;

delay() ;

}

SCL = 0 ;

SDA = 1 ;

delay() ;

SCL = 1 ;

delay() ;

SCL = 0 ; //为下一次输入数据做准备

delay() ;

}

uint8 I2C_read (void)

{

uint8 i, byte = 0 ;

for(i=0; i<8; i++)

{

SCL = 0;

SDA = 1 ; //读数据必须要保证SDA = 1 ;且 SCL = 1 ,不写入

delay() ;

SCL = 1 ;

delay() ;

byte<=1 ;

if(SDA == 1)

byte |= 0x01 ;

delay();

}

SCL = 0 ;

SDA = 1 ;

delay() ;

SCL = 1 ;

delay() ;

SCL = 0 ;

delay() ;

return byte ;

}

void write_eeprom(uint8 addr ,uint8 databyte)

{

I2C_start() ;

I2C_send(0xa0) ;

I2C_send(addr) ;

I2C_send(databyte) ;

I2C_stop() ;

}

uint8 read_eeprom(uint8 addr)

{

uint8 byte ;

I2C_start() ;

I2C_send(0xa0) ;

I2C_send(addr) ;

I2C_start() ;

I2C_send(0xa1) ;

byte = I2C_read() ;

I2C_stop() ;

return byte ;

}

void UART_init(void)

{

SCON = 0x50 ;

TMOD = 0x20 ;

TH1 = 0xFD ;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top