大学生熬夜奋战竟然就为了这个?LED矩阵竟然真的香!
本项目是基于74H595D来实现“心”型LED灯闪烁的操作。通过8051的超小型系统板模块(由8051控制器-STC15W204和USB转串口的CH340构成)连接电脑输入,达成目的。
标签
嵌入式系统
8051
ICISTRUE
更新2021-01-06
851

预先注意点:

首先,我们暂且将LED矩阵原理图放置如下,并提出两点注意:

FkIWuZ7zGhHXDczxlauqaY1EAkEi

  1. 本产品从ROW0,COL0开始,而不是ROW1,COL1。

  2. 在每一列的二极管输入中,1为高电平,0为低电平。然而,在每一行的二极管输入中,1为低电平,0为高电平。所以在整理亮灯逻辑的时候一定要注意行与列的输入电平均为1才能使对应坐标的灯亮。

原理解读:

  • 存储方式:

在八位寄存器里的数据的存储方式:

输入:10101010

存储:

0

1

0

1

0

1

0

1

 

  • 传输方式:

我们暂且将数据传输部分硬件原理图放置如下,以方便解读:

FvbnDrNbhumiMuAB2clhKOzxiR8P

优先输入的八位数据会先以串行的传输的方式通过SER1进入左侧的74HC595D芯片中,然后转变为并行的数据传输方式在IO端输出,输出口为QA,QB,QC,QD,QE,QF,QG,QH。用于控制每一列的输入电平。然后由于for循环的存在,SER端会再输入8位数据,由于寄存器只能存储八位数据,所以左侧的74HC595D中的八位数据会被“推”出QH’输出端,并行传输会再次转换为串行传输,通过SER2进入右侧的74HC595D,左侧芯片的输出则成为了右侧芯片的输入。所以最后从结果上看,第一组输入的八位数据会成为控制每一输入电平的高低判断标准,而第二组输入的八组数据会成为控制每一输入电平的高低判断标准。

程序展示:

由于此次项目是团队合作,各部分编码风格各有千秋,在此并不打算进行标准化抑或统一化处理,以求保证此次合作的多元化。

程序可以控制每一个小灯的亮灭。首先,我们先从行找起。比如说我想要点亮第一行全部的LED灯,当row=1时,将 SER设置为1。其余行将SER设置为0.这样我们就可以控制某一行灯的亮灭。同理,在找到对于行的基础上,我们也需要用同样的方法判断列,在行和列的约束下,我们就可以准确的找到某一位置的LED灯,并控制灯的亮灭。此方法的局限性就在于只能控制单一灯泡的亮灭。如LED灯的数很多,程序会比较繁琐。

在此,声明变量a作为行数,变量b作为列数,首先用两个for循环确定某一行某一列的电平高低,以达到点亮某一个特定灯的效果。外面再次嵌套一个for循环以达到同时点亮这条线上的所有灯的效果。

 

  • 姜宇航的分项目部分:

代码展示:

for(c=0;c<8;c++)
{
  a=c;
  b=c;
// 行
  for(a=0;a<8;a++){
    if(a==c){
      SER=1;
      _nop_();
      _nop_();
      SRCLK=1;
      _nop_();
      _nop_();
      SRCLK=0;   
    }else{
      SER=0;
      _nop_();
      _nop_();
      SRCLK=1;
      _nop_();
      _nop_();
      SRCLK=0;
    }
  }
// 列
  for(b=0;b<8;b++){
    if(b==c){
      SER=1;
      _nop_();
      _nop_();
      SRCLK=1;
      _nop_();
      _nop_();
      SRCLK=0;   
    }else{
      SER=0;
      _nop_();
      _nop_();
      SRCLK=1;
      _nop_();
      _nop_();
      SRCLK=0;
    }
  } 
  _nop_();
  _nop_();
  RCLK=1;
  _nop_();
  _nop_();
  RCLK=0;
}

 

  • 高昂的分项目部分:

代码展示:

//参考全亮函数,写出如下函数:
void flag(u8 row,col ){
u8 a,b;

 for(a=0;a<8;a++){
  if(a==row){
   SER=1;
   _nop_();
   _nop_();
   SRCLK=1;
   _nop_();
   _nop_();
   SRCLK=0;   
  }else{
   SER=0;
   _nop_();
   _nop_();
   SRCLK=1;
   _nop_();
   _nop_();
   SRCLK=0;
  }
 }
  for(b=0;b<8;b++){
  if(b==col){
   SER=1;
   _nop_();
   _nop_();
   SRCLK=1;
   _nop_();
   _nop_();
   SRCLK=0;   
  }else{
   SER=0;
   _nop_();
   _nop_();
   SRCLK=1;
   _nop_();
   _nop_();
   SRCLK=0;
  }
 }     
 _nop_();
 _nop_();
 RCLK=1;
 _nop_();
 _nop_();
 RCLK=0;
 }

 

  • 高昂的分项目部分:

代码展示:

void flag(u8 row,col ){
u8 a,b;

 for(a=0;a<8;a++){
  if(a==row){
   SER=1;
   _nop_();
   _nop_();
   SRCLK=1;
   _nop_();
   _nop_();
   SRCLK=0;   
  }else{
   SER=0;
   _nop_();
   _nop_();
   SRCLK=1;
   _nop_();
   _nop_();
   SRCLK=0;
  }
 }
  for(b=0;b<8;b++){
  if(b==col){
   SER=1;
   _nop_();
   _nop_();
   SRCLK=1;
   _nop_();
   _nop_();
   SRCLK=0;   
  }else{
   SER=0;
   _nop_();
   _nop_();
   SRCLK=1;
   _nop_();
   _nop_();
   SRCLK=0;
  }
 }     
 _nop_();
 _nop_();
 RCLK=1;
 _nop_();
 _nop_();
 RCLK=0;
 }
void main()
{   
 // u8 i;
 while(1)
 {
  flag(7,3);
  flag(7,2);
  flag(7,1);
  flag(7,0);
  flag(6,4);
  flag(6,3);
  flag(6,2);
  flag(6,1);
  flag(6,0);
  flag(5,5);
  flag(5,4);
  flag(5,3);
  flag(5,2);
  flag(5,1);
  flag(5,0);
  flag(4,5);
  flag(4,4);
  flag(4,3);
  flag(4,2);
  flag(4,1);
  flag(4,0);
  flag(3,5);
  flag(3,4);
  flag(3,3);
  flag(3,2);
  flag(3,1);
  flag(3,0);
  flag(2,4);
  flag(2,3);
  flag(2,2);
  flag(2,1);
  flag(2,0);
  flag(1,3);
  flag(1,2);
  flag(1,1);
  flag(1,0);
  flag(0,2);
  flag(0,1);
  flag(0,0);  
 }  
}
  • 宋昀泽的分项目部分:

代码展示:

void syz1()
{
	u8 sum,a,b;
	SRCLK=0;
	RCLK=0;
    for(sum=0;sum<8;sum++){
// 行
	for(a=0;a<8;a++){
		if(a==sum){
			SER=1;
			_nop_();
			_nop_();
			SRCLK=1;
			_nop_();
			_nop_();
			SRCLK=0;			
		}else{
			SER=0;
			_nop_();
			_nop_();
			SRCLK=1;
			_nop_();
			_nop_();
			SRCLK=0;
		}
	}
// 列
		for(b=0;b<8;b++){
		if(b==7-sum){
			SER=1;
			_nop_();
			_nop_();
			SRCLK=1;
			_nop_();
			_nop_();
			SRCLK=0;			
		}else{
			SER=0;
			_nop_();
			_nop_();
			SRCLK=1;
			_nop_();
			_nop_();
			SRCLK=0;
		}
	}
	
	_nop_();
	_nop_();
	RCLK=1;
	_nop_();
	_nop_();
	RCLK=0;
	
	}
}
void syz2()
{
	u8 sum,a,b;
	SRCLK=0;
	RCLK=0;

    for(sum=0;sum<8;sum++){
// 行
	for(a=0;a<8;a++){
		if(a==sum){
			SER=1;
			_nop_();
			_nop_();
			SRCLK=1;
			_nop_();
			_nop_();
			SRCLK=0;			
		}else{
			SER=0;
			_nop_();
			_nop_();
			SRCLK=1;
			_nop_();
			_nop_();
			SRCLK=0;
		}
	}
// 列
		for(b=0;b<8;b++){
		if(b==8-sum){
			SER=1;
			_nop_();
			_nop_();
			SRCLK=1;
			_nop_();
			_nop_();
			SRCLK=0;			
		}else{
			SER=0;
			_nop_();
			_nop_();
			SRCLK=1;
			_nop_();
			_nop_();
			SRCLK=0;
		}
	}	
	_nop_();
	_nop_();
	RCLK=1;
	_nop_();
	_nop_();
	RCLK=0;
	}
}
团队介绍
比奇堡一家亲团队创建于2020年12月30日11点16分,是由一群热爱电子和编程的比奇堡少年们组成。阳光开朗、热情大方、机敏聪慧、沉着谦逊是我们代名词。
团队成员
高昂
西交利物浦大学 通信工程专业
焦天阔
西交利物浦大学 电子科学与技术专业
宋昀泽
西交利物浦大学 计算机科学与技术专业
姜宇航
西交利物浦大学 电气工程及其自动化
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号