分享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 麻烦提供一下你用的SPI库,谢谢 不客气,其实那个软件也是找老外的资源 幻生幻灭 发表于 2016-3-5 12:56 static/image/common/back.gif
不客气,其实那个软件也是找老外的资源
我也找到了一个库,捣鼓了半天,能编译通过了,但是驱动st7585的9664lcd不成功。
页:
[1]