lison 发表于 2015-2-8 15:57:12

分享Arduino AtTiny85 使用SPI驱动8*8LED点阵

本帖最后由 lison 于 2015-2-8 16:01 编辑

上次分享了《用Arduino IDE USB 驱动 AtTiny 85》,这次记录一下使用Tiny85点亮LED点阵。
准备材料:
1. AtTiny 85芯片一只
2.8*8 LED Matrix一块
3.USB数据线一条
先说接线方式:
VCC——5V
GND——GNDDIN——PB1 MISO ( Master in Slave Out )
CS——PB3
CLK——PB2 SCK/ADC1
接线方式困扰我的是DIN针,之前一直是接在MOSI口上,想当然的理解为主机输出(哎,半路和尚老被欺负),外设输入,却怎么也显示不对;后来换过来试了一下,才正确输出,看来是自己理解的有错误:应该理解为主机(M)负责输出,外设(S)负责接收来自M的输出,不知道这样理解是否正确。
来个接线的图:

http://lisonliou.gicp.net:10001/wp-content/uploads/2015/02/Led-%E7%82%B9%E9%98%B5%E9%92%88%E8%84%9A%E6%8E%A5%E7%BA%BF.png

http://lisonliou.gicp.net:10001/wp-content/uploads/2015/02/AtTiny85%E6%8E%A5%E7%BA%BF2.png

http://lisonliou.gicp.net:10001/wp-content/uploads/2015/02/AtTiny85%E6%8E%A5%E7%BA%BF1.png

如果照着上图接的话,注意对应好颜色就可以了。

再来张运行中的:

http://lisonliou.gicp.net:10001/wp-content/uploads/2015/02/AtTiny85%E7%82%B9%E4%BA%AELED%E7%82%B9%E9%98%B5%E6%95%88%E6%9E%9C.png

目前只是实现了0-9几个数字的变化,并伴有一个刷新的效果
程序代码如下:

#include <SPI.h>
#define DI   0// D0, pin 5Data In
#define DO   1// D1, pin 6Data Out (this is *not* MOSI)
#define USCK 2// D2, pin 7Universal Serial Interface clock
#define SS   3// D3, pin 2Slave Select

/*
*    16进制表示法,也可以写成二进制,例如B00111100(0x3c)
*    下为0-9的16进制显示
*/
byte numbers=
{
{0x3c,0×42,0×42,0×42,0×42,0×42,0×42,0x3c},
{0×08,0×18,0×28,0×08,0×08,0×08,0×08,0x7e},
{0x7e,0×02,0×02,0x7e,0×40,0×40,0×40,0x7e},
{0x7e,0×02,0×02,0x7e,0×02,0×02,0×02,0x7e},
{0×08,0×18,0×28,0×48,0xfe,0×08,0×08,0x1c},
{0x7e,0×40,0×40,0x7e,0×02,0×02,0×02,0x7e},
{0x7e,0×40,0×40,0x7e,0×42,0×42,0×42,0x7e},
{0x7e,0×02,0×04,0×08,0×10,0×10,0×10,0×10},
{0x7e,0×42,0×42,0x7e,0×42,0×42,0×42,0x7e},
{0x7e,0×42,0×42,0x7e,0×02,0×02,0×02,0x7e},
{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
};

/**
*    Matrix寄存器地址常量
*/
const byte NOOP=0×0;      //不运行
const byte DECODEMODE=0×9;    //译码模式
const byte INTENSITY=0xA;    //显示强度
const byte SCANLIMIT=0xB;    //扫描限制
const byte SHUTDOWN=0xC;    //停机
const byte DISPLAYTEST=0xF;    //显示器检测

void max7219(byte reg,byte data)
{
digitalWrite(SS,LOW);
SPI.transfer(reg);
SPI.transfer(data);
digitalWrite(SS,HIGH);
delay(200);
}

void setup()
{
pinMode(SS,OUTPUT);
digitalWrite(SS,HIGH);

SPI.begin();
initMax();
}

void initMax()
{
////清屏代码,暂不使用
/*for(byte i=0;i<sizeof(numbers);i++){
max7219(i+1,0);
}*/

max7219(SCANLIMIT,7);
max7219(DECODEMODE,0);
max7219(INTENSITY,1);
max7219(DISPLAYTEST,0);
max7219(SHUTDOWN,1);
}

byte i,j;
void loop()
{
for(i=0;i<11;i++){
for(j=0;j<8;j++)
max7219(j+1,numbers);

delay(1200);
}
}

AtTiny85是不能直接使用Arduino的SPI库的,这个问题困扰了我很长时间,最后在谷歌找到了答案,并且在github找到了这个类库。

然后分享一下用到的取模软件:LED Matrix Animator,感谢geek-workshop@幻生幻灭,虽然使用的板子不一样 :–)

最后看下动画效果:

http://player.youku.com/player.php/sid/XODg4MDI4NjU2/v.swf

原文来自:
Arduino AtTiny85 使用SPI点亮LED点阵
http://lisonliou.gicp.net:10001/?p=271

maxims 发表于 2016-3-5 01:22:47

麻烦提供一下你用的SPI库,谢谢

幻生幻灭 发表于 2016-3-5 12:56:11

不客气,其实那个软件也是找老外的资源

maxims 发表于 2016-3-5 22:57:15

幻生幻灭 发表于 2016-3-5 12:56 static/image/common/back.gif
不客气,其实那个软件也是找老外的资源

我也找到了一个库,捣鼓了半天,能编译通过了,但是驱动st7585的9664lcd不成功。
页: [1]
查看完整版本: 分享Arduino AtTiny85 使用SPI驱动8*8LED点阵