假期自己学习了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); //动态停机
}
以上代码复制直接可以用,第一次写文章有点小紧张哈,今天写了篇文章希望可以帮助到更多的小伙伴。让我们一起进步吧!。
?
|