×
单片机 > 单片机程序设计 > 详情

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

发布时间:2024-05-20 发布时间:
|

目标:用点阵点亮一个灯

1.8x8LED点阵简介

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

8x8点阵

生活中利用


2.内部结构

内部结构

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

点阵模块电路


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

引脚说明


这个芯片是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循环外,因为它想等串行输入端所有数据全部移到输出端再启动,它来一个上升沿,于是塞满的输出端得到释放(输出)


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式