目录

  • 1 单片机概述
    • 1.1 单片机概述
  • 2 单片机预备知识
    • 2.1 keil4使用教程
    • 2.2 利用Proteus和keil仿真51单片机流水灯
    • 2.3 PROTEUS中文手册
    • 2.4 芯片手册
    • 2.5 KEIL及PROTEUS软件下载
    • 2.6 单片机预备知识
  • 3 单片机结构与原理
    • 3.1 单片机最小系统
    • 3.2 使用Altium Designer绘制单片机最小电路原理图
    • 3.3 电源、晶振和复位电路
    • 3.4 单片机上下拉电阻
    • 3.5 单片机结构与原理
  • 4 C51语言
    • 4.1 4.1二进制、十进制和十六进制
    • 4.2 4.2 C 语言变量类型和范围
    • 4.3 4.3 C 语言基本运算符
    • 4.4 4.4 C 语言 for 循环语句
    • 4.5 4.5 C 语言 while 循环语句
    • 4.6 4.6 C 语言函数的简单介绍
    • 4.7 4.7 单片机延时方法(Keil 软件延时)
    • 4.8 C51语言
  • 5 LED灯实例
    • 5.1 工程仿真实例
    • 5.2 单片机 LED 灯闪烁程序
    • 5.3 单片机 LED 流水灯程序
    • 5.4 LED灯实例
    • 5.5 独立按键控制LED灯
  • 6 数码管/键盘实例
    • 6.1 单片机按键介绍
    • 6.2 单片机按键消抖程序
    • 6.3 单片机矩阵按键的扫描
    • 6.4 键 盘
    • 6.5 点亮数码管
    • 6.6 数码管的显示原理
    • 6.7 数码管实例
  • 7 中断系统
    • 7.1 51单片机中断详解(上)
    • 7.2 51单片机中断详解(中)
    • 7.3 51单片机中断详解(下)
    • 7.4 INT0中断计数实例
    • 7.5 中断系统
  • 8 定时/计数器
    • 8.1 51单片机定时计数器
    • 8.2 TIME0控制LED闪烁
    • 8.3 定时器 计数器
    • 8.4 实例一
    • 8.5 实例二
    • 8.6 实验-用计数器/中断实现 100 以内的按键计数
  • 9 串行通信
    • 9.1 51单片机串口通信
    • 9.2 单片机之间双向通信
    • 9.3 串行通信
  • 10 LCD1602实例
    • 10.1 1602液晶
    • 10.2 1602实验
  • 11 IIC总线技术
    • 11.1 51单片机IIC
    • 11.2 IIC总线实例
    • 11.3 I2C串行总线
  • 12 A/D&D/A转换
    • 12.1 单片机AD和DA
    • 12.2 ADC0808模数转换实例
    • 12.3 DAC0832数模转换实例
    • 12.4 D A 与 A D转换器
1602液晶

1602液晶简介

1602液晶也叫1602字符型液晶,16x02,每行16个字符显示两行。它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

#度娘告知


引脚接口说明


1602液晶上有16个引脚,上面依次标了上述符号,与单片机上的接口依次对应连接即可,如图:




原理图



想知道如何操作液晶屏就需要看清楚自己单片机上与液晶屏连接引脚的控制原理图,我使用的是郭天祥的51单片机中的原理图。线上标的相同符号的地方是连在一起的。


1.直接接地  


2.接VCC 


3.接在一个滑动变阻上再与地相接 。VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。


4.接RS->P3.5 。RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。


5.直接接地(因为我们一般都只让液晶屏显示即写入,所以这个单片机原理图直接接地)


6.LCDEN使能端->P3.4。当E端由高电平跳变成低电平时,液晶模块执行命令。


7-14.数据写入->P0


15.接一个电阻后(电阻为了限流,延长LCD的使用寿命也防止烧坏背光灯)与VCC连接(液晶屏背光正极)


16.直接接地(液晶屏背光负极)


1602 11条指令


指令1:清屏指令。

  (1)清楚液晶显示器,即将DDRAM的内容全部填入空白的ASCII码20H

  (2)地址计数器(AC)的值设为0

  (3)光标复位到地址00H位置(显示器的左上方)


指令2:光标复位指令。

  (1)光标返回地址00H

  (2)AC值设为0

  (3)DDRAM的内容不变


指令3:光标和显示模式设置。设定每次输入1位数据后光标的移位方向,并且设定输入后字符是否移动。

     I/D(光标移动方向):             高:右移          低:左移

     S(屏幕上所有文字是否移动):高 :有效右移  低:无效


指令4:显示开关控制。控制显示器开/关、光标显示/关闭以及光标是否闪烁

    D(控制整体显示的开与关):高:开显示  低:关显示

    C(控制光标的开与关):       高:有光标  低:无光标

    B(控制光标是否闪烁):       高:闪烁     低:不闪烁


指令5:光标或显示移位。           

  

S/C(移动文字/标)R/L
00光标左移1格且AC-1
01光标右移1格且AC+1
10显示器上字符全部左移1格但光标不动
11显示器上字符全部右移1格但光标不动


指令6:功能设置命令。设定数据总线位数、显示的行数及字型。

     DL(数据总线位数):高:8     低:4

     N(显示行数)        :高:2      低:1

     F(显示点阵类型)   :高:5*7点阵   低:5*10点阵


指令7:设定CGRAM地址指令。

     设定下一个要存入数据的CGRAM的地址。


指令8:设定DDRAM地址指令。

     设定下一个要存入数据的DDRAM的地址。


指令9:读取忙信号或AC地址指令。

    (1)读取忙信号BF的内容    

              BF(液晶显示器是否忙):高:忙,暂时无法接收单片机送来的数据或指令   低:可接收

    (2)读取地址计数器(AC)的内容


指令10:数据写入DDRAM或CGRAM指令。

     (1)将字符码写入DDRAM,以使液晶显示屏显示出相对于的字符

     (2)使用者自己设计的图形存入CGRAM


指令11:从CGRAM或DDRAM读出数据的指令。读取DDRAM或CGRAM中的内容。



时序图

这里我们只讲写所以读的时序图我就不放出来了。感兴趣的读者这些资料买1602的商家都有提供。


看到这里对于才接触液晶屏的你来说应该也不是问题,前面已经接触过串口通信等内容学会了如何看时序图(还是不会的话可以对应后面的代码看),这里唯一阻拦你的应该就是时间问题。商家也为我们提供了资料,不过查了很多资料都说不同厂家的时间是不一样的,不过时间单位应该都差不了多少所以有些东西还是要看厂家的不同来定。


时间都是ns级别的,而单片机的操作都是us级的,所以我们基本不用担心,如果不放心或者不成功可以适当利用延时函数

还是不太理解CGROM、CGRAM及DDRAM的朋友可以看看:

http://blog.csdn.net/wait_for_taht_day5/article/details/50636096

代码

/*  用液晶1602以从右侧移入方式第一行显示“Hello everyone!”  第二行显示“Welcome to my blog!”*/ #include <reg52.h> #include <string.h>	                        //strlen包含的头文件 #define uint unsigned int #define uint8 unsigned char uint8 code table[]="Hello everyone!"; uint8 code table1[]="Welcome to my blog!"; sbit lcden=P3^4; sbit lcdrs=P3^5; sbit dula=P2^6; sbit wela=P2^7; uint8 num; void delay(uint z); void write_com(uint8 com); void write_data(uint8 date); void init(); void Write1602_Str(uint addr,uint length,uint *pbuf);   void main(){	init(); 	Write1602_Str(0x80+0x10,strlen(table),table);	  //Hello everyone! 	Write1602_Str(0x80+0x50,strlen(table1),table1);	  //Welcome to my blog!		 	while(1) 	{				write_com(0x18);								delay(200);			    //移动速度,可自定	}					  }    void delay(uint z) { 	uint i,j; 	for(i=z;i>0;i--) 		for(j=0;j<921;j++); } void write_com(uint8 com) {	lcdrs=0;					 //RS=0->指令								 // R/W我的单片机上引脚直接接地了所以不用设置	delay(1);					 //tsp1 	P0=com;						 //DB0-DB7 	delay(1);					 //tsp2 	lcden=1;					 //tR 	delay(1);					 //tpW 	lcden=0;					 //tF、tHD1、tHD2 } void write_data(uint8 date) {	lcdrs=1;					 //RS=1->数据 	delay(1); 	P0=date; 	delay(1); 	lcden=1; 	delay(1); 	lcden=0; } void init() {	dula=0;				 //段选位关闭,因为P0口同时也是控制数据管的口 	wela=0;				 //同上 	lcden=0;			 //使能关(操作之前看时序图都需要E开始是0后来变为1) 	write_com(0x38);     //设置16*2显示,5*7点阵,8位数据口 	write_com(0x0e);     //设置开显示,不显示光标 	write_com(0x06);     //写一个字符后地址指针加1 	write_com(0x01);     //显示清0,数据指针清0 } void Write1602_Str(uint8 addr,uint8 length,uint8 *pbuf) {     uint8 i;      write_com(addr);     for(i=0;i<length;i++)        write_data(pbuf[i]);    }



总结:


1602显示字符必要条件:

(1)液晶显示模式的设置

(2)字符显示位置的指定

(3)待显示字符的字模代码