这学期要做单片机的课程设计 我这个不靠谱的小组长 折腾着我们组的成员 把开始定好的题目换成了做俄罗斯方块
元件是专业统一买 现在东西还没回来 先把原理和软件这一部分搞清楚
【外观】
用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作为一对 下载本文