14 8x8LED点阵

单片机STC89C52学习——14 8x8LED点阵

汇总:00 单片机STC89C52学习
参考教程:普中科技

1 工作原理

1.1 8x8LED点阵

通过动态扫描显示。若为双色LED,只是多并联一个发光二极管

14 8x8LED点阵_第1张图片
本开发板使用上图左边,ROW1 ~ 8由D7 ~ D0(74HC595的输出)控制,COL1 ~ 8由P07 ~ P00控制,通常不点亮时P0输出高电平
14 8x8LED点阵_第2张图片
原理图

1.2 74HC595芯片

8 位串行输入、串行或并行输出的移位寄存器,具有高阻关断状态,三态。通过74HC595节约IO口。移位时从最高位开始

14 8x8LED点阵_第3张图片
74HC595原理图
对应看时名称可能不一样,这时看引脚号即可
14 8x8LED点阵_第4张图片
引脚说明
14 8x8LED点阵_第5张图片
功能表
14 8x8LED点阵_第6张图片
其他说明

2 程序:8x8LED点阵——1 显示左上角1个点;2 显示0

2.1 显示左上角1个点

#include "reg51.h"// 52单片机头文件有RCLK,会导致下面重定义
#include "intrins.h"// 因为用到_nop_()

typedef unsigned char u8;
typedef unsigned int u16;

// 需要控制74HC595的3个口
sbit SER = P3^4;// 串行数据输入
sbit RCLK = P3^5;// 存储寄存器时钟输入
sbit SRCLK = P3^6;// 移位寄存器时钟输入

void HC595(u8 dat)// P34的输入
{
    u8 a;
    SRCLK = 0;
    RCLK = 0;
    // 先到移位寄存器
    for (a = 0; a < 8; a ++)
    {
        SER = dat >> 7;// 移位7次,传送最高位
        dat <<= 1;// 把最高位左移换掉
        SRCLK = 1;// 上升沿,芯片手册写的是“大于几十纳秒”
        _nop_();// 延时1个机器周期。其实一条指令就有1微秒,所以也可以不延时。只是保险起见
        _nop_();
        SRCLK = 0;// 拉低回去   
    }
    // 再从移位寄存器输出
    RCLK = 1;
    _nop_();
    _nop_();
    RCLK = 0;   
}

void main()
{
    HC595(0x80);// D7高电平其余低电平,P34输入0x80,1000 0000
    P0 = 0x7f;// P07低电平其余高电平,P0输入0x7f,0111 1111
    while (1);
}

效果:并未显示...

2.2 显示0

#include "reg51.h"// 52单片机头文件有RCLK,会导致下面重定义
#include "intrins.h"// 因为用到_nop_()

typedef unsigned char u8;
typedef unsigned int u16;

// 需要控制74HC595的3个口
sbit SER = P3^4;// 串行数据输入
sbit RCLK = P3^5;// 存储寄存器时钟输入
sbit SRCLK = P3^6;// 移位寄存器时钟输入

u8 ledduan[] = {0x00, 0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00};// 显示0,每列如何显示
u8 ledwei[] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};// 点亮每一列,0111 1111 0右移

void delay(u16 i)
{
    while(i --);
}

void HC595(u8 dat)// P34的输入
{
    u8 a;
    SRCLK = 0;
    RCLK = 0;
    // 先到移位寄存器
    for (a = 0; a < 8; a ++)
    {
        SER = dat >> 7;// 移位7次,传送最高位
        dat <<= 1;// 把最高位左移换掉
        SRCLK = 1;// 上升沿,芯片手册写的是“大于几十纳秒”
        _nop_();// 延时1个机器周期。其实一条指令就有1微秒,所以也可以不延时。只是保险起见
        _nop_();
        SRCLK = 0;// 拉低回去   
    }
    // 再从移位寄存器输出
    RCLK = 1;
    _nop_();
    _nop_();
    RCLK = 0;   
}

void main()
{
    u8 i = 0;
    while (1);
    {
        for (i = 0; i < 8; i ++)
        {
            P0 = ledwei[i];// 选择哪一列显示
            HC595(ledduan[i]);// 列如何显示
            delay(100);
            HC595(0x00);// 消隐   
        }
    }
}

效果:什么都没有...

你可能感兴趣的:(14 8x8LED点阵)