51单片机学习记录(8) “8x8点阵”
8x8点阵就是由64个小led灯组成的矩阵,现在先让我们看一下点阵的内部结构

从图中可以了解到
- (从行看去)每一行的小灯的阳极相连在一起排成了一列
- (从列看去)每一列的小灯的阴极相连在一起排成了一行
也就是说当我们对行进行操作的时候需要发送低电平,对列进行操作的时候需要发送高电平,这样才能使电路导通
74HC595芯片
因为想要点亮8x8点阵还需要它
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7nZt45i-1596860197988)(./点阵原理图.png)]](https://img-blog.csdnimg.cn/20200808121724774.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTkzMTAwOQ==,size_16,color_FFFFFF,t_70)
其中8x8点阵的led灯的列就是图示D0到D7控制的,当我们编写程序时需要用到SER,SRCLK,RCLK这三个寄存器,让我们看一下这个芯片的手册



其中我圈画的部分就是我们需要关注的,SHCP(也就是原理图中的SRCLK),它的引脚是11,原理图中的网络标号是P3^6,同样的STCP(RCLK)
它的引脚是12,在原理图中的网络标号是P3^5.具体的功能和描述,图中的说明都十分的详细了,这里就不在赘述。
而SER就是用来接受我们传递的数据。
再说一下什么是"上升沿",所谓的上升沿就是数字电路中,数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。

最后讲一下运作的过程,首先我们传送8位的数据给SER,SER接受完数据后,我们手动置1让SRCLK处于上升沿状态,SRCLK寄存器就会将数据移位到原理图中的QA,循环这个过程,直到最后一位数据传送到QH,再来让RCLK处于上升沿状态,RCLK就会将存储的数据发送到D0口,也就是控制led灯的列的控制口
让8x8点阵显示自己想要的图形(这里以心形为例)

实际编写程序时,对列数组中存储的是我们想要的图形,对行数组中存储的数据是每一列亮起的条件(因为这里采用的是动态扫描的方式,跟动态数码管的原理有点类似),还是通过例子来说明吧。
首先我们可先在稿纸上或电脑上点出自己想要的图形,接着按照下列步骤进行数据的记录,最后编写程序的时候将数据存储在数组中
- 因为对列来说,小灯是阳级接入,所以让灯点亮是高电平,也就是说,需要亮起的灯就是高电平,不需要亮起的就是低电平,还需要注意的是,从上到下是低位到高位,所以我们应该从下往上看,例如第一列的数据就应当为 (0000 1110) = (0x0e) 第二列的数据为 (0001 1111) = (0x1f),依次类推
- 接着还需要行的数据,这个比较简单,因为是采用动态扫描的方式,也就是让灯一列一列的亮起,通过延时来达到一种类似静态显示的效果,需要注意的是,从左到右是从高位到低位,所以读取数据时应该从左向右,如下图从P0 - P07

还有一点就是对行来说,灯是阴极接入,所以需要点亮的输入低电平,具体就是,首先先让第一列亮起其他列不亮也就是 (0111 1111) = (0x7f) 再让第二列亮起其他列不亮也就是 (1011 1111) = (0xbf),依次下去
#include <reg51.h> #include <intrins.h> typedef unsigned char u8; typedef unsigned int u16; /*定义74HC595芯片3个寄存器的位置*/ sbit SER = P3^4; sbit RCLK = P3^5; sbit SRCLK = P3^6; /*得到数据后,分别将其存入列数组和行数组中*/ u8 lei_array[]={
0x0e,0x1f,0x3f,0x7e,0x7e,0x3f,0x1f,0x0e}; u8 hang_array[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; void delay(u16); //声明延时函数 void HC595(u8); //声明工作函数 void main() {
u8 i; //用于控制循环 while(1) {
P0 = 0x7f; //先让第一列灯亮起再进入循环 for(i=0;i<8;++i) {
P0 = hang_array[i]; //依次点亮每一列的小灯 HC595 (lei_array[i]); //将列数据发送给HC595进行处理 delay(1000); //延时一段时间 HC595(0x00); //进行消影,这两步可以对比动态数码管 } } } void delay(u16 i) {
while(i--); } void HC595(u8 data1) {
u8 i; //用于控制for循环 /*先手动置0,进入循环后再手动置1,达到上升沿的效果*/ SRCLK = 0; RCLK = 0; for(i=0;i<8;++i) {
SER = data>>7; //因为移位的时候是先从高位开始,所以先将传来的数据右移7位留下最高位发给SER data = data<<1; //再将原本的数据左移1位,使其次高位上升到最高位 SRCLK = 1; //此时手动置1,使SRCLK处于上升沿,开始执行它的功能 _nop_(); //这个过程大概十几纳秒因此,延时两个机器周期即可,_nop_()函数是<intrins.h>库里的函数 _nop_(); SRCLK = 0; //再次手动置0为下次传送作准备 } RCLK = 1; //传送完数据后,让RCLK处于上升沿状态,将数据传送到D0口 _nop_(); _nop_(); RCLK = 0; }
讯享网
最后效果如图


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/29165.html