单片机·LCD1602
一、管脚功能介绍
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
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 ;
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 ;
单片机LCD160 相关文章:
- 单片机写LCD1602液晶程序源码(12-02)
- 单片机LCD1602底层驱动子程序(12-02)
- PIC单片机驱动LCD1602液晶显示字符串程序(12-02)
- 单片机LCD1602液晶显示(11-30)
- 基于51单片机驱动LCD1602液晶显示thb6064ah细分64(11-30)
- 51单片机驱动LCD1602的电路图+程序(11-30)