LED点阵屏与LCD1602

目录

LED点阵屏

点阵屏的介绍

LED点阵屏分类

点阵屏的显示原理

点阵案例

静态案例

电路图

keil文件

动态案例

电路图

keil文件

LCD1602

LCD1602概述

LCD1602内部结构

存储器结构

LCD引脚及应用电路

时序结构

LCD1602指令集

LCD1602编程

初始化

显示字符

仿真案例

电路图

keil文件

LED点阵屏

点阵屏的介绍

前言:LED点阵屏由若干个独立的LED组成,LED以矩阵的行式排列,以灯珠亮灭来显示文字、图片、视频等。

LED点阵屏分类

  • 按颜色:单色、双色、全彩
  • 按像素:8*8、16*16等(大规模的LED点阵通常由很多个小点阵拼接而成)

点阵屏的显示原理

  • LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以8字型排列而已
  • LED点阵屏与数码管一样,有共阴极和共阳极两种接法,不同的接法对应的电路结构不同
  • LED点阵屏需要进行逐行和逐列扫描,才能使所有LED同时显示

点阵案例

静态案例

需求:通过开关控制电阵屏上0-9的数字显示。

电路图

注意:P2是行,低电平有效;P3是列,高电平有效。

keil文件
#include "reg51.h"
sbit key=P1^0;
#用来在行的基础下做列显示——高电平有效
unsigned char code tab[]={
	0x00,0x7E,0xFF,0xC3,0xC3,0xFF,0x7E,0x00, //0
	0x00,0x00,0x43,0xFF,0xFF,0x03,0x00,0x00, //1
	0x00,0x63,0xC7,0xCF,0xDB,0xF3,0x63,0x00, //2
	0x00,0x42,0xDB,0xDB,0xDB,0xFF,0x66,0x00, //3
	0x00,0x3E,0x46,0xFF,0xFF,0x06,0x06,0x00, //4
	0x00,0xF6,0xF7,0xD3,0xD3,0xDF,0xDE,0x00, //5
	0x00,0x7E,0xFF,0xDB,0xDB,0xDF,0x4E,0x00, //6
	0x00,0xC0,0xC0,0xC7,0xFF,0xF8,0xC0,0x00, //7
	0x00,0x7E,0xFF,0xDB,0xDB,0xFF,0x7E,0x00, //8
	0x00,0x72,0xFB,0xDB,0xDB,0xFF,0x7E,0x00, //9
};
unsigned char row[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char num=0,flag=0;
void keyboard(){
	if(flag==0&&key==0){ //按键按下
		flag=1;
	}
	if(flag==1&&key==1){ //按键按下并且松手
		num++;
		flag=0;
	}
	if(num==10){
		num=0;
	}
}
void matrix(){
	int i=0;
	for(i=8*num;i<8*(num+1);i++){
		P2=~row[i-8*num]; //确定行,低电平有效
		P3=tab[i]; //确定列,高电平有效
	}
}
void main()
{
	while(1)
	{
		keyboard(); //按键盘
		matrix(); //显示点阵屏
	}
}

注意:此代码采用了逐行扫描的方式,通过行与行之间的延时将整个图画显示出来。

动态案例

需求:在点阵中动态显示移动字幕hello!

电路图

keil文件
#include "reg51.h"
unsigned char str[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0x08,0x08,0x08,0xff,0x00,0x0e,0x15,
0x15,0x15,0x08,0x00,0x7e,0x01,0x02,0x00,
0x7e,0x01,0x02,0x00,0x0e,0x11,0x11,0x0e,
0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char offset=0;
void main()
{
	unsigned char i=0,offset=0,n=10;
	while(1)
	{
		while(n--){
			for(i=0;i<8;i++){
				P2=~(0x80>>i);
				P3=str[i+offset];
			}
		}
		offset++;
		if(offset>40){
			offset=0;
		}
	}
}

LCD1602

LCD1602概述

  • LCD1602液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其他的一些内置特殊字符,还可以有8个自定义字符
  • 显示容量:16*2个字符,每个字符为5*2点阵
  • LCD1602是一个自带控制和扫描电路的,我们显示时只需要通过数据线将我们要显示的内容发送给它就行

LCD1602内部结构

解释:

  • LCD1602中的屏幕由32个小方块组成,其中每个小方块都属于一个点阵 
  • LCD1602的引脚都接在控制器中。
  • 里面由两个存储单元,CGRAM和CGROM,其相当于数码管中的段码表
  • DDRAM数据显示区,我们想要让他显示的数据是写在DDRAM中,然后他会通过DDRAM中的数据来向子模库找到相应字符的一个显示点阵的字模,然后再在屏幕对应的位置上显示我们的点阵数据。
  • DDRAM是40*2的会比屏幕长些(用于做移动字幕),但是他只有前16列(32块)映射到了屏幕上

存储器结构

注意:

  • DDRAM就是一个RAM存储器,存储器内部都有对应屏幕位置的地址;第一行对应屏幕第一行的地址;第二行对应屏幕第二行的地址。 
  • 80个字节的显示缓冲区DDRAM(原始地址:0x80),分2行,地址分别为00H——27H,40H——67H
  • 要在LCD的某个位置显示符号,只需要将显示符号的ASCII码存入DDRAM的对应位置即可
  • 在CG存储器中我们想要显示某个数据只需要填写他的索引码就行,就是字符对应横排的码与字符对应纵排的码连接组成索引码

LCD引脚及应用电路

时序结构

理解:我们在读数据之前要把RS设置为高电平,RW杠置高电平(因为RS=1,RW=1为读数据)之后将e置位高电平,经过一段时间后,那么内部就会把读出来的数据放入,持续一段时间后再把e置低,那么我们的一次读数据就完成了。 

理解:我们在写数据之前要把RS设置为高电平,RW杠置低电平(因为RS=1,RW=0为写数据)之后再把我们要写的一字节数据放在我们的对应口,当把这些数据设置好之后将e置位高电平,此时数据便是有效的,持续一段时间后再把e置低,那么我们的一次写数据就完成了。

LCD1602指令集

LCD1602编程

初始化

发送指令:0x38设置16*2显示,5*7点阵,8位数据接口
发送指令:0x0C设置开显示,不显示光标,闪烁关
发送指令:0x06数据读写操作后,光标自动+1,画面不动
发送指令:0x01清屏指令

显示字符

  • 发送指令0x80|AC:设置要显示字符的位置 

  • 发送数据:发送显示的字符数据

仿真案例

需求:通过LCD液晶屏幕在第二行的正中间显示Hello World!

电路图

keil文件

#include "reg51.h"
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
unsigned char str[]={"Hello World!"};
void delay(unsigned int n){
	unsigned int i=0,j=0;
	for(i=0;i<n;i++){
		for(j=0;j<120;j++);
	}
}
#写指令
void writecom(unsigned char com){
	RS=0;
	RW=0;
	E=0;
	P2=com;
	delay(5);
	E=1;
	E=0;
}
#写数据
void writedat(unsigned char dat){
	RS=1;
	RW=0;
	E=0;
	P2=dat;
	delay(5);
	E=1;
	E=0;
}
#初始化液晶屏
void initlcd(){
	writecom(0x38);
	writecom(0x0c);
	writecom(0x06);
	writecom(0x01);
}
void display(){
	unsigned int i=0;
	writecom(0x80+0x40+2);
	delay(5);
	while(str[i]!='\0'){
		writedat(str[i]);
		delay(5);
		i++;
	}
}
void main(){
	initlcd();
	while(1){
		display();
	}
}

注意:

  • 实际地址在发送之前要把他的最高位置1,代表它是一个地址设置的指令。
  • 第一行第一列显示的地址:0x80+0x00;第二行第一列显示的地址:0x80+0x40
  • 指令数据都有执行时间,因此每次写入数据后都需要延时一段时间,否则会出错。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值