单片机小白学习之路(十)---点阵

目标:用点阵点亮一个灯

1. 8x8LED点阵简介

LED点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随处可见,被广泛应用于汽车报站器,广告屏等。

单片机小白学习之路(十)---点阵_第1张图片
8x8点阵
单片机小白学习之路(十)---点阵_第2张图片
生活中利用

2. 内部结构

单片机小白学习之路(十)---点阵_第3张图片
内部结构

有点数码管,矩阵按键的影子,有两种接法,都一样其实,我们是左边的那个接法。
控制和矩阵按键差不多,行为一组,列为一组。左边的列是由74HC595芯片控制的,
上面的行是P0端口控制的

单片机小白学习之路(十)---点阵_第4张图片
点阵模块电路

看看我们这个芯片的说明书

单片机小白学习之路(十)---点阵_第5张图片
引脚说明

这个芯片是8 位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。三态。

模块电路里的符号是自己可改的, 我们看引脚就知道了,
  • 模块电路中D0~D7是并行数据输出。
  • 9脚是串行的输出。
  • 10脚(/SRCLR)是主复位低电平有效,既然是低电平有效,我们不能让它一直复位 不然没法工作了,所以接电源,上升沿有效
  • 11脚(SRCLK)是移位寄存器 时钟输入端,就是把并行口SER传入的数据按规律送到输出端,上升沿有效
  • 12脚(RCLK)存储寄存器时钟输入,就是把输出端存的数据给输出出去到外界,上升沿有效
  • 13脚(/OE)输出有效(低电平),意思是是低电平时才会允许输出,不然芯片不工作了,上面的短接片我们在单片机上把OE与GND接在一起
  • 14脚(SER)就 是串行输入端了

下面就是该怎么写代码了 ,注意上面内部结构图中标注了,高低位的所在位置

3.代码

#include 
#include   //提供和_nop_,他也提供左右移动函数

typedef unsigned int u16;
typedef unsigned char u8;

sbit SRCLK = P3^6;//一个上升沿把SER端的一个数据弄到输出端
sbit RCLK = P3^5; //如果是一个上升沿则准许输出端的数据输出点阵
sbit SER = P3^4; //串行输入端,输入数据

void HC595SendByte(u8 dat)
{
    u8 a;
    SRCLK = 0;
    RCLK = 0;
    for(a=0;a<8;a++){
        SER = dat>>7; //数据dat向右移7位,最高位变最低位
        dat<<=1; //dat数据自己左移一位相当于把第二位变第一位
        //为下一次做准备
        SRCLK = 1;
        _nop_(); //一个机器周期,相当于1us
        _nop_();    
        SRCLK = 0;//为下次做准备
    }
    RCLK = 1;//把输出端所有数据给点阵
    _nop_();
    _nop_();
    RCLK = 0;
}

void main()
{
    while(1){
        HC595SendByte(0x80);
        P0 = 0x7f;
    }
}          

SER输入数据dat是0x80(1000 0000),P0是(0111 1111),再对比内部机构的高低位所在位置是不是左上角那个灯导通了?

还要注意一下我们这个芯片移位的规则,它的规则是先移最高位的数字,但又从最低位那取,感觉有点蛋疼,但就这样没办法.

所以for循环里dat右移7位把最高位变最低,给了SER(串行输入端),下面那个意思dat不是已经完成最高位输出了吗,那就不再考虑它了,直接左移一位,把最高位挤走,次高位变最高位赋值给dat

SRCLK输入1,与前面输入的0构成上升沿于是数据移走
RCLK在for循环外,因为它想等串行输入端所有数据全部移到输出端再启动,它来一个上升沿,于是塞满的输出端得到释放(输出)

你可能感兴趣的:(单片机小白学习之路(十)---点阵)