1 LED点阵
LED 点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随处可见,被广泛应用于汽车报站器,广告屏等。 通常应用较多的是 8* 8 点阵,然后使用多个 8 * 8 点阵可组成不同分辨率的 LED点阵显示屏,比如 16* 16 点阵可以使用 4 个 8* 8 点阵构成。因此理解了 8* 8LED点阵的工作原理,其他分辨率的 LED 点阵显示屏都是一样的。这里以 8* 8LED 点阵来做介绍。
工作原理:
8* 8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置 1 电平(行所接的是二极管的阳极,所以为高电平),某一列置 0 电平(列所接的是二极管的阴极极,所以为低电平),则相应的二极管就亮;如要将第一个二极管点亮,则A1 脚接高电平,K1脚接低电平,则第一个点就亮了;如果要将第一行点亮,则第 A1 脚要接高电平,而(K1、K2、K3、K4、K5、K6、K7、K8)这些引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第K1 脚接低电平,而(K1、K2、K3、K4、K5、K6、K7、K8)接高电平,那么第一列就会点亮。
下面我们通过给LED点阵显示一个点与显示一个数字深入理解它的使用。
2 原理图
① 8* 8 LED点阵原理图:
② 74HC595原理图(JOE排针处把OE接到GND):
③ MCU原理图:
3 程序
① 点亮左上角第一个点:
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
#include typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit SRCLK=P3^6; //存储寄存器时钟引脚(数据输入时钟线) sbit RCLK=P3^5; //移位寄存器时钟引脚(输出存储器锁存时钟线) sbit SER=P3^4; //串行数据输入引脚 /******************************************************************************* * 函数名 : Hc595SendByte(u8 dat) * 函数功能 : 向74HC595发送一个字节的数据 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Hc595SendByte(u8 dat) { u8 i; SRCLK=0; // 初始化数据输入时钟线 RCLK=0; // 初始化输出存储器锁存时钟线 for(i=0;i<8;i++) { SER=dat>>7; //从最高位开始发送 例:1111 0000,最高为1右移7位,最后变为1,那么最高位就保存下来 dat<<=1; //左移移位变为次高位 ,接上一例,左移移位变为次高位,在右移7位,变为次高位 SRCLK=1; // 从0到1给,即从低电平到高电平,给移位寄存器上升沿,数据存入移位寄存器中 _nop_(); _nop_(); SRCLK=0; // 复位引脚 } RCLK=1; // 移位寄存器时钟引脚加上升沿,数据并行输出 _nop_(); _nop_(); RCLK=0; // 复位引脚 } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { Hc595SendByte(0x80); // 写入0b10000000,让D7引脚输出高电平 P0=0x7f; // 写入0b01111111,让P07引脚输出低电平 while(1); } ② 在点阵上显示数字0: #include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器 #include typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit SRCLK=P3^6; //存储寄存器时钟引脚(数据输入时钟线) sbit RCLK=P3^5; //移位寄存器时钟引脚(输出存储器锁存时钟线) sbit SER=P3^4; //串行数据输入引脚 // 定义数字0的显示位置 u8 LedSeg[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}; u8 LedPos[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *******************************************************************************/ void delay(u16 i) { while(i--); } /******************************************************************************* * 函数名 : Hc595SendByte(u8 dat) * 函数功能 : 向74HC595发送一个字节的数据 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Hc595SendByte(u8 dat) { u8 i; SRCLK=0; // 初始化数据输入时钟线 RCLK=0; // 初始化输出存储器锁存时钟线 for(i=0;i<8;i++) { SER=dat>>7; //从最高位开始发送 例:1111 0000,最高为1右移7位,最后变为1,那么最高位就保存下来 dat<<=1; //左移移位变为次高位 ,接上一例,左移移位变为次高位,在右移7位,变为次高位 SRCLK=1; // 从0到1给,即从低电平到高电平,给移位寄存器上升沿,数据存入移位寄存器中 _nop_(); _nop_(); SRCLK=0; // 复位引脚 } RCLK=1; // 移位寄存器时钟引脚加上升沿,数据并行输出 _nop_(); _nop_(); RCLK=0; // 复位引脚 } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { u8 i; while(1) { P0=0x7f; // 初始化P0口 for(i=0;i<8;i++) //8行8列,在扫描行的同时,位选也进行,所以共8次循环 { P0=LedPos[i]; //发送位选数据,控制P0口 Hc595SendByte(LedSeg[i]); //发送段选数据,控制74HC595 delay(100); //延时,肉眼无法观察的速度 Hc595SendByte(0x00); //消隐,防止给下次扫描带来影响 } } }
上一篇:STC89C52RC单片机额外篇 | 01 - 认识中断、中断源以及中断优先级
下一篇:8051单片机实战分析(以STC89C52RC为例) | 08 - 矩阵按键驱动
推荐阅读最新更新时间:2024-11-02 12:51
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LT1117CM 的参考设计
- 发光校园卡IC卡
- Sg1845 用于隔离式 Mosfet 驱动器的电流模式 PWM 控制器的典型应用
- NCP300LSN45T1 4.5V LED 条形图电压监视器的典型应用
- LTC2634-LZ12 四通道、12 位数模转换器的典型应用
- OM13584、PTN5150A-PTN36043 USB Type-C CC 逻辑评估套件
- MIKROE-3402,基于 MCP1501 精密电压基准的 POT Click 板
- 用于恒流源的 TL431A 可编程精密基准的典型应用
- AM3GW-2405SZ 5V 3W DC-DC 转换器的典型应用
- STM32F40xZGT6核心板