8051单片机实战分析(以STC89C52RC为例) | 09 - LED点阵显示数字

本文围绕8*8 LED点阵展开,介绍其驱动需用到74HC595数字器件。阐述了LED点阵是由发光二极管排列组成的显示器件,说明了8*8点阵的工作原理,还给出了8*8 LED点阵、74HC595、MCU的原理图,以及点亮左上角点和显示数字的程序。

对于LED 8*8 点阵的驱动需要用到74HC595数字器件,不了解或者忘记的可以查看博文《74HC595秒懂》学习或者回顾一下!

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 脚要接高电平,而(K1K2K3K4K5K6K7K8)这些引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第K1 脚接低电平,而(K1K2K3K4K5K6K7K8)接高电平,那么第一列就会点亮。

下面我们通过给LED点阵显示一个点与显示一个数字深入理解它的使用。

2 原理图

① 8* 8 LED点阵原理图:

② 74HC595原理图(JOE排针处把OE接到GND):

③ MCU原理图:

3 程序

① 点亮左上角第一个点:

#include "reg51.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include <intrins.h>

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 <intrins.h>

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);  //消隐,防止给下次扫描带来影响
		}	
	}		
}
51单片机基础应用设计C语言实源码仿真300个合集: 100000秒以内的计时程序 10秒的秒表 12864LCD图形滚动演示 128X64LED 160128LCD图文演示 1602字符液晶滚动演示程序 1602液晶显示的DS1302实时时钟 16×16点阵(滚动显示) 16×16点阵2(滚动显示) 2io5键盘模拟音量数码管显示 2×20串行字符液晶演示 32x16汉字 44行列键盘 485全双工通信 4×4键盘矩阵控制条形LED显示 4个独立式按键控制LED开关 4个独立式按键控制LED移位 4只数码管滚动显示0~3 555可调PWM发生器 555的应用 6264扩展内存 6个16×16点阵 74HC154译码器应用 74HC595 74HC595串入并出芯片应用 74LS138译码器应用 74LS148扩展中断 8051双机通信简 8255并行口扩展实 89C51PWM 8x8LED汉字显示 8x8点阵做的贪吃蛇游戏 8×8LED点阵显示数字 8只数码管同时显示不同字符 8只数码管显示多个不同字符 8只数码管滚动显示8~F 8只数码管滚动显示单个数字 8只数码管滚动显示数字串 8只数码管闪烁显示 8通道自动温度检测系统仿真(含原程序) ADC0808 PWM实验 ADC0809模数转换与显示 ADC0832模数转换与显示 AT89C51对直流电动机的驱动 AVR_Uart BCD译码数码管显示数字 c51 可预设电压的数控电源(功能强大) clock Conter CPU控制的独立式键盘扫描实验 da、ad。液晶,传递函数模型综合应用的实 DIY51式数控电源 DS1621温度传感器实验 ds18b20 DS18B20温度传感器实验 DS18B20温度检测及其液晶显示 HorseLight I2C IIC-24C04与数码管 IIC-24C04与蜂鸣器 INT0与INT1中断计数 INT0中断3位计数 INT0及INT1中断计数 INT0和INT1控制条形LED INT1中断5位计数 IO并行口直接驱动单个数码管 K1-K4 分组控制LED K1-K4 控制LED移位 K1-K4 控制数码管加减演示 K1-K4 控制数码管移位显示 K1-K4 键状态显示 key_lcd ks0108 液晶12864 LCD频率计仿真 LED代码查询V1[1].1 LED模拟交通灯 LED闪烁 M16_AN_Compare M16_EEPROM M16_Horse MAX7221控制数码管动态显示 my16key_c NT0中断控制LED NT0中断计数 NumberDisplay P3口流水灯 PCF8574 PCF8583+LCD1602 PCF8591模数与数模转换实验 proteus ADDC的练习程序 PWM PWMLED PWM控制LED的亮度仿真程序 PWM控制马达的方法 PWM波输出(可调) PWM电机正反转 pwm程序实 PWM调温 RAM扩展练习 sscom32串口调试 TIMER0与TIMER1控制条形LED TIMER0控制LED二进制计数 TIMER0控制单只LED闪烁 TIMER0控制四只LED滚动闪烁 TIMER0控制流水灯 ULN2803 usart_t 《lcd1602仿真实》 一个数控直流稳压电源 一个步进电机的仿真 一步一步教你51_PC串口通信 万能逻辑电路实验 三机通讯 串口仿真mcu_pc 串口方式1 串行数据转换为并行数据 交通灯 从左到右的流水灯 光藕隔离驱动电机 内部函数intrins.h应用举 净水控制器仿真电路 刚做好的十个字的led屏模拟有程序 包含单片机寄存器的头文件 单只按键控制单只数码管滚动显示 单只数码管循环显示0-9 单只数码管循环显示0~F 单片机与PC机串口通讯仿真 单片机之间双向通信 单片机向PC发送数据 单片机向主机发送字符串 单片机接收PC发出的数据 单片机控制的电动自行车驱动系统 单片机数据发送程序 发一个用定时器做的PWM 基于1602+ds12b80+ds1302+音乐+电子书+流水灯的多功能电子表 基于ADC0832的数字电压表 基于AT24C02的多机通信 基于AT89C51+MAX7219的频率计 附带proteus仿真电路图 实际硬件电路测试通过 基于DS1302的日历时钟 基于yjwpm测试过的DS18B20仿真实 多功能电子钟 多点温度测量 多路开关状态指示 大屏幕仿真 子电路做的一个H型电机驱动电路 字符串函数string.h应用举 字符函数ctype.h应用举 宏定义应用举 定时器中断控制的独立式键盘扫描实验 定时器控制交通指示灯 定时器控制数码动态显示 定时器控制数码管动管显示 对I2C总线上挂接多个AT24C02
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值