目录
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
- 指令数据都有执行时间,因此每次写入数据后都需要延时一段时间,否则会出错。