预先注意点:
首先,我们暂且将LED矩阵原理图放置如下,并提出两点注意:
-
本产品从ROW0,COL0开始,而不是ROW1,COL1。
-
在每一列的二极管输入中,1为高电平,0为低电平。然而,在每一行的二极管输入中,1为低电平,0为高电平。所以在整理亮灯逻辑的时候一定要注意行与列的输入电平均为1才能使对应坐标的灯亮。
原理解读:
- 存储方式:
在八位寄存器里的数据的存储方式:
输入:10101010
存储:
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
- 传输方式:
我们暂且将数据传输部分硬件原理图放置如下,以方便解读:
优先输入的八位数据会先以串行的传输的方式通过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;
}
}