视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
74HC595 驱动88点阵
2025-10-03 15:10:01 责编:小OO
文档
开始课程设计的题外话+74HC595 驱动8*8点阵

这学期要做单片机的课程设计 我这个不靠谱的小组长 折腾着我们组的成员 把开始定好的题目换成了做俄罗斯方块

元件是专业统一买 现在东西还没回来 先把原理和软件这一部分搞清楚

【外观】

用6个8*8的LED点阵做显示屏

1个开关按钮;1个复位按钮

有 左右下翻转  4个控制按钮

用小喇叭加入音效,1个开/关音效按

两层设计 上面层放点阵屏幕和7个按钮 下面层放芯片 喇叭等等其他所有元件←希望放得下

【功能】

初步——

俄罗斯方块的基本功能:1能随机落下6种方块;2操作按钮能控制方块移动;3触底判断是否满屏,满屏则结束游戏,未满屏判断是否满行,满行则消除行,进入下一次循环;

次之——

1开机加入logo与欢迎界面;2游戏中加入音效;3保存最高分值;4可选择游戏难度

嗯………………想到再加

 

74HC595 驱动8*8点阵 

8X8点阵共由个发光二极管组成 且每个发光二极管是放置在行线和列线的交叉点上 当对应的某一行置1电平 某一列置0电平 则相应的二极管就亮   

 

移位锁存器74HC595(74LS595)原理: 74HC595为8位输出锁存移位寄存器

RESET: 复位信号

shitf clock:移位时钟

serial data input: 串行数据输入

output enable:输出使能

latch clock:锁存时钟

595有3层结构:

第一层为移位D触发器;

第二层为锁存D触发器;

第三层为输出3态门;

当复位信号为0时,移位D触发器清0;

当移位脉冲从L->H时,第一个移位D触发器的Q=D; 其它的Qn=Qn-1;

当锁存脉冲从0->1时,第二层为锁存D触发器的输出=/输入;

当OE=1时,595的输出为高阻态;

当OE=0时,595的输出为第二层为锁存D触发器的输出的反相;

74595的数据端:

QA--QH(15,1,2,3,4,5,6,7): 八位并行输出端 可以接点阵的8列  

QH'(9): 级联输出端 将它接下一个595的SI端  

SI(14): 串行数据输入端  

74595的控制端说明:

SCLR(10脚): 低电平时将移位寄存器的数据清零 通常将它接Vcc  

SHCP(11脚):上升沿时数据寄存器的数据移位 QA-->QB-->QC-->...-->QH 下降沿移位寄存器数据不变 (脉冲宽度:5V时 大于几十纳秒就行了 通常都选微秒级)

STHCP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器 下降沿时存储寄存器数据不变 通常将RCK置为低电平 当移位结束后 在RCK端产生一个正脉冲(5V时 大于几十纳秒就行了 通常都选微秒级) 更新显示数据  

G(13脚): 高电平时禁止输出(高阻态)如果单片机的引脚不紧张 用一个引脚控制它 可以方便地产生闪烁和熄灭效果 比通过数据端移位控制要省时省力 

 

74HC595是一个串入并出的芯片 通过一个for(i=0;i<8;i++)来存储数据 

具体来说就是第一个时钟信号来到时低位的数据向高位挪动一位 

在这个程序中是SH_CK 信号 当SH_CLK 是一个上跳沿时 传入的形参dat与0x80相与 得到的数为1 则通过SDATA置1 否则通过SDATA置0 并存储在SDATA的相应位置(最低位)上 DS内部也自动左移一位数据 然后dat向左移一位 使次高位变为最高位与0x80相与 并存储

通过8次后 就可以得到数据 并存储在SDATA中 这时ST_CK一个上跳沿 数据即送出去了 

  

//串行数据输入

void Ser_IN(unsigned char Data)

{  unsigned char i;

for(i = 0; i < 8; i++)

    { SH_CK = 0;   //先置低

      SD = Data & 0x80;   //取数据的最高位

Data <<= 1; //将数据的次高位移到最高位 为下一次取数据做准备

     SH_CK = 1;     //再置高 产生移位时钟上升沿 上升沿时数据寄存器的数据移位

     }

 }

//并行数据输出

void Par_OUT(void)

{ ST_CK = 0;   //先置低

  ST_CK = 1; //再置高 产生移位时钟上升沿

             //上升沿时移位寄存器的数据进入数据存储寄存器 更新显示数据

  }

 

/************ 点阵扫描:从左到右3次-从右到左3次-从上到下3次-从下到上3次 循环 ***************/

#include

#include "74HC595.H"

unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 

unsigned char code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void delayms(unsigned int x)          //延时约x ms

{  unsigned int i,j;

for(i=x;i>0;i--)

for(j=110;j>0;j--);

 }

void main(void) 

{ unsigned char i,j; 

  while(1) 

{ for(j=0;j<3;j++) //从左到右3次

{ for(i=0;i<8;i++)

    { Ser_IN(taba[i]);// 列扫描

  Ser_IN(0xff);// 行送扫描数据

  Par_OUT();//74HC595输出显示

      delayms(100);  

      } 

    } 

 

for(j=0;j<3;j++)//from right to left 3 time

{ for(i=0;i<8;i++)

    { Ser_IN(taba[7-i]);// 列扫描

  Ser_IN(0xff);// 行送扫描数据

  Par_OUT();//74HC595输出显示

      delayms(100); 

     } 

   }

for(j=0;j<3;j++)//从上到下 3次 

{ for(i=0;i<8;i++)

     { Ser_IN(0x00);// 列扫描

   Ser_IN(tabb[i]);//8 行送扫描数据

   Par_OUT();//74HC595输出显示

       delayms(100); 

      } 

    } 

for(j=0;j<3;j++)//从下到上3次 

{ for(i=0;i<8;i++)

     { Ser_IN(0x00);// 列扫描

   Ser_IN(tabb[7-i]);// 行送扫描数据

       Par_OUT();//74HC595输出显示

       delayms(100);  

  } 

    }    

  }             

 } 

 /******以下为目录包含文件74HC595.H*****/

   

//Note: 74HC595驱动

//File: 74HC595.H

//      __                  __

//Note: MR 主复位接电源正极 OE 使能端 输出有效接电源负极

#ifndef __74HC595_H__  // #ifndef判断后面的标示符是否为未定义的 

#define __74HC595_H__

sbit SD  = P1^4; //串行数据输入

sbit ST_CK = P1^5; //存储寄存器时钟输入

sbit SH_CK = P1^6; //移位寄存器时钟输入

 

//函数声明

void Ser_IN(unsigned char Data); //串行数据输入

void Par_OUT(void);     //串行数据输出

 

//串行数据输入

void Ser_IN(unsigned char Data)

{

 unsigned char i;

for(i = 0; i < 8; i++)

 {

  SH_CK = 0;   //CLOCK_MAX=100MHz

  SD = Data & 0x80;

Data <<= 1;

  SH_CK = 1;

 }

}

 

//并行数据输出

void Par_OUT(void)

{

 ST_CK = 0;

 ST_CK = 1;

}

 

#endif  //#endif用于结束条件编译 编译时与前面最近的#if作为一对 下载本文

显示全文
专题