目录
目的/效果
一,STC单片机模块
二,8*8 LED点阵模块
2.1 电路图
2.1.1 8*8 点阵模块电路图
2.1.2 74HC595(串转并)模块 电路图
2.1.3 芯片引脚
2.2 引脚电平分析
2.3 74HC595 串转并模块
2.3.1 装弹(移位寄存器)
2.3.2 发弹(存储寄存器)
2.4 STC89C52RC 中的sfr、sbit
2.4.1 sfr(special function register):特殊功能寄存器声明
2.4.2 sbit(special bit):特殊位声明
2.4.3 可位寻址/不可位寻址:
三,创建Keil项目
四,代码
五,代码编译、下载到51单片机
目的/效果
程序控制,点亮点阵LED 第1行第一列LED
一,STC单片机模块
二,8*8 LED点阵模块
2.1 电路图
2.1.1 8*8 点阵模块电路图
2.1.2 74HC595(串转并)模块 电路图
2.1.3 芯片引脚
2.2 引脚电平分析
我们要点亮左下角 第一个 LED,需要将P70和DPa接通,其他引脚不管,如下图
将LED点阵左边第一列设置为0,即LED阴极为低电平,其余列为1,即高电平
将LED点阵上边第一行设置为1,即LED阳极为高电平,其余行为0,即低电平
对于74HC595模块的电平如下
这里要注意跳线帽:OE 输出有效(低电平),我们直接可以拔掉或者接GND上
DP上的HEX=0x80=1000 0000(二进制)
那么对于引脚P35(RCLK)、P36(SRCLK)、P34(SER)输入怎样的数据,DPa-DPh 才会输出1000 0000 的电平呢?我们就要详细分析这个74HC595译码器。
2.3 74HC595 串转并模块
74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三 态输出(即高电平、低电平和高阻抗)
移位寄存器工作方式就像手枪弹夹,但是子弹的发射(移位寄存器中的数据转储到存储寄存器),又像是【散弹】(因为是并行输出嘛)。
具体的装弹和发弹如下
2.3.1 装弹(移位寄存器)
上升沿:电平从低到高的那个过程。移位寄存器时钟在上升沿这个过程中才起作用。
先把数据放到针脚P34(SER)上(SER=1低电平 或者SER=0 高电平)
然后将 将P36(SRCLK) 针脚 先置低电平(SRCLIK=1)再置高电平(SRCLK=0)。这样就是实现了由上升沿 移位寄存(装弹)的效果。不过要注意这里不能立即置0,机器也需要处理时间。这里我们需要将程序延时10微秒后再做处理。
2.3.2 发弹(存储寄存器)
数据从位移寄存器转移到存储寄存器,也是需要时钟脉冲驱动的,这就是P35(RCLK)脚的作用。它也是上升沿有效。
2.4 STC89C52RC 中的sfr、sbit
2.4.1 sfr(special function register):特殊功能寄存器声明
例:sfr P0 = 0x80; 声明P0口寄存器,物理地址为0x80
2.4.2 sbit(special bit):特殊位声明
例:sbit P0_1 = 0x81; 或 sbit P0_1 = P0^1; 声明P0寄存器的第1位
比如本节我们用到了下面几个,我们把针脚P34、P35、P36定义用对应申明,在使用时不在写针脚地址寄存器(当然也可以继续使用针脚,作用一样)。
//定义74HC595控制管脚
sbit _SRCLK=P3^6; //移位寄存器时钟输入
sbit _RCLK=P3^5; //存储寄存器时钟输入 注意:在 REGX52.H 中已经申明了RCLK
sbit _SER=P3^4; //串行数据输入
2.4.3 可位寻址/不可位寻址:
在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用“&=”、“|=”、“^=”的方法进行位操作
三,创建Keil项目
详细参考:51单片机STC89C52RC——创建Keil项目-CSDN博客
四,代码
main.c
#include <REGX52.H>
#include "74HC595.h"
/**
* 函 数:主函数
* 参 数:无
* 返 回 值:无
*/
void main()
{
while(1)
{
_74HC595_Show(0,0x80);//点亮第一行,第一个LED
}
}
Delay.c
/**
* 函 数:延时函数 毫秒
* 参 数:ms 延时多少毫秒
* 返 回 值:无
*/
void Delay_ms(int ms) //@12.000MHz
{
unsigned char data i, j;
while(ms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
/**
* 函 数:延时函数 毫秒
* 参 数:ms 延时多少毫秒
* 返 回 值:无
*/
void Delay_us(int ms) //@12.000MHz
{
unsigned char data i, j;
while(ms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
/**
* 函 数:延时函数 10微秒
* 参 数:无
* 返 回 值:无
*/
void Delay_10us(int _10us) //@11.0592MHz
{
unsigned char data i;
while(_10us--)
{
i = 2;
while (--i);
}
}
Delay.h
#ifndef __DELAY_H_
#defind __DELAY_H_
void Delay_ms(int ms);
void Delay_10us(int _10us);
#endif
74HC595.c
#include <REGX52.H>
#include "Delay.h"
//定义74HC595控制管脚
sbit _SRCLK=P3^6; //移位寄存器时钟输入
sbit _RCLK=P3^5; //存储寄存器时钟输入 注意:在 REGX52.H 中已经申明了RCLK
sbit _SER=P3^4; //串行数据输入
/**
* 函 数:74HC595写入一个字节
* 参 数:Byte 要写入的字节
* 返 回 值:无
*/
void _74HC595_WriteByte(unsigned int Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
_SER=Byte&(0x80>>i); //将1000 0000 右移i位后 & Byte
_SRCLK=0; //移位寄存器置搞电平
Delay_10us(1);
_SRCLK=1; //移位寄存器置低电平
/*这里有需要可以延时10微秒*/
Delay_10us(1);
}
_RCLK=1; //存储寄存器置低电平
Delay_10us(1);
_RCLK=0; //存储寄存器置搞电平
}
/**
* 函 数:LED点阵屏显示一列数据
* 参 数:Column 要选择的列,范围:0~7,0在最左边,
Data 选择列显示的数据,高位在上,1为亮,0为灭
* 返 回 值:无
*/
void _74HC595_Show(unsigned char Column,Byte)
{
_74HC595_WriteByte(Byte); //向行写入数据
P0=~(0x80>>Column); //向列写入数据
Delay_10us(1); //等待显示稳定
}
74HC595.h
#ifndef __74HC595_H_
#defind __74HC595_H_
void _74HC595_WriteByte(unsigned int Byte);
void _74HC595_Show(unsigned char Column,Byte);
#endif
五,代码编译、下载到51单片机
代码编译请参考
《51单片机STC89C52RC——代码编译-CSDN博客》
代码下载请参考
《51单片机STC89C52RC——STCAI-ISP代码下载-CSDN博客》