查看: 4295|回复: 10
|
研究与学习帖, arduino + MBI5026 shift register + LED
[复制链接]
|
|
实验目的: 为了学习以及研究 arduino 和 shift register
小弟心血来操,就操 arduio 和一粒 MBI5026 shift register IC ..
来看图片只是基本的 MBI5026 链接...
- define SDI 11
- [code]#define SDI 11
- #define CLK 12
- #define LE 8
- byte pattern [16][16] = {
- { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
- };
- int j;
- int i = 1;
- void setup(){
- pinMode(SDI,OUTPUT);
- pinMode(CLK,OUTPUT);
- pinMode(LE,OUTPUT);
- }
- void loop(){
- j = j + i;
- if(j == 16 || j == 0 ){
- i = -i;
- };
- ledOutput(j);
- delay(10);
-
- }
-
-
-
-
- void ledOutput(int j){
- digitalWrite(LE,LOW);
- for(int a = 0; a < 16; a++){
- digitalWrite(CLK,LOW);
- int b = pattern[j][a];
- if(b == 1){
- digitalWrite(SDI,HIGH);
- }
- else{
- digitalWrite(SDI,LOW);
- }
- digitalWrite(CLK,HIGH);
- }
- digitalWrite(LE,HIGH);
- }
复制代码 [/code]Loading FB Video...
继续研究.... 本帖最后由 angels1026 于 6-10-2013 11:58 PM 编辑
|
评分
-
查看全部评分
|
|
|
|
|
|
|
楼主 |
发表于 6-10-2013 11:43 PM
|
显示全部楼层
想请教一下... 关于
FrequencyTimer2.h 的
为什么会出现
Error
uint_8t dost't name a type
我之前的电脑没问题的是从新 install 了 arduino IDE 在新电脑才发现到 FrequencyTimer2.h 不能用 |
|
|
|
|
|
|
|
发表于 7-10-2013 07:23 PM
|
显示全部楼层
angels1026 发表于 6-10-2013 11:43 PM
想请教一下... 关于
FrequencyTimer2.h 的
FrequencyTimer有放置在libraries文件夹里吗?
你的代码有 #include <FrequencyTimer2.h>吗?
FrequencyTimer library有一个Test example,也是发生同样问题吗? |
|
|
|
|
|
|
|
楼主 |
发表于 8-10-2013 10:15 PM
|
显示全部楼层
西门庆33 发表于 7-10-2013 07:23 PM
FrequencyTimer有放置在libraries文件夹里吗?
你的代码有 #include 吗?
大哥最近研究个 arduino VU meter ... 研究出了自己的 源码...- #define SDI 11
- #define CLK 12
- #define LE 8
- byte volume [16][16] = {
- { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 },
- { 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0 },
- { 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 },
- { 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 },
- { 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0 },
- { 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0 },
- { 1,1,1,1.1,1,1,1,1,1,1,0,0,0,0,0 },
- { 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0 },
- { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0 },
- { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0 },
- { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 },
- { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
- };
- int volumeRead;
- int maxVolume = 350;
- void setup(){
- pinMode(SDI,OUTPUT);
- pinMode(CLK,OUTPUT);
- pinMode(LE,OUTPUT);
- Serial.begin(9600);
- }
- void loop(){
- volumeRead = map(analogRead(A1) , 0, maxVolume, 0 , 16);
- ledOutput(volumeRead);
- }
-
-
-
-
-
- void ledOutput(int volumeRead){
- digitalWrite(LE,LOW);
- for(int a = 0; a < 16; a++){
- digitalWrite(CLK,LOW);
- int b = volume[volumeRead][a];
- if(b == 1){
- digitalWrite(SDI,HIGH);
- }
- else{
- digitalWrite(SDI,LOW);
- }
- digitalWrite(CLK,HIGH);
- }
- digitalWrite(LE,HIGH);
- }
-
-
-
-
-
复制代码 可以动...看了有点爽...
问题是... 有没有的 自动 adjust volume ... 因为我要开大声才会有反应... 虽然可以在 maxVolume 那边做手脚... 可是想要做个 amp VU meter 没有理由吧整个电脑搬上车吧... 做个手动 adjust 好像没有什么 standart ..
还有一个问题... 我接上了这个 VU meter 过后我的 喇叭的声音变得很差... bass 的时候 prok .. 漏风的声音... 静音的时候感觉到吵... 想请问下 老大下有什么办法决绝难题... |
|
|
|
|
|
|
|
发表于 8-10-2013 10:50 PM
|
显示全部楼层
angels1026 发表于 8-10-2013 10:15 PM
大哥最近研究个 arduino VU meter ... 研究出了自己的 源码...可以动...看了有点爽...
问题是... 有没 ...
使用Op Amp吧。
|
|
|
|
|
|
|
|
楼主 |
发表于 8-10-2013 11:22 PM
|
显示全部楼层
西门庆33 发表于 8-10-2013 10:50 PM
使用Op Amp吧。 - #include <FrequencyTimer2.h>
- #define SDI 11
- #define CLK 12
- #define LE 8
- byte pattern [16][16] = {
- { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
- };
- int i;
- int j;
- void setup(){
- pinMode(SDI,OUTPUT);
- pinMode(CLK,OUTPUT);
- pinMode(LE,OUTPUT);
- Serial.begin(9600);
-
- FrequencyTimer2::setPeriod(2000);
-
- FrequencyTimer2::disable();
- FrequencyTimer2::setOnOverflow(shiftOut);
- }
- void loop(){
- j++;
- if(j ==16){
- j = 0;
- };
- delay(100);
- }
- void shiftOut(){
- digitalWrite(LE,LOW);
- for(i = 0; i < 16; i++){
- if(pattern[j][i] == 1){
- digitalWrite(SDI,HIGH);
- }
- else{
- digitalWrite(SDI,LOW);
- }
- digitalWrite(CLK,HIGH);
- digitalWrite(CLK,LOW);
- }
- digitalWrite(LE,HIGH);
- }
复制代码 frequencytimer 问题原来是在 document 里面的 file 有问题 把它 delete 掉就可以用了... 我做了实验
不够小弟想学习..来个 digitalWrite , 现在想要研究 port manipulation
... 想请问大大有什么建议吗 ?
|
|
|
|
|
|
|
|
发表于 8-10-2013 11:30 PM
|
显示全部楼层
angels1026 发表于 8-10-2013 11:22 PM
frequencytimer 问题原来是在 document 里面的 file 有问题 把它 delete 掉就可以用了... 我做了实验
...
如果想要更快速的IO处理,当然要学习port manipulation了
|
|
|
|
|
|
|
|
楼主 |
发表于 8-10-2013 11:51 PM
|
显示全部楼层
西门庆33 发表于 8-10-2013 11:30 PM
如果想要更快速的IO处理,当然要学习port manipulation了
研究了 1 小时 第一个 BLINK LED pin 13 挑战成功
- void setup(){
- DDRB = 0x20;
- }
- void loop(){
- DDRB ^= 0x20 ;
- delay(100);
- }
复制代码 |
|
|
|
|
|
|
|
楼主 |
发表于 9-10-2013 12:49 AM
|
显示全部楼层
西门庆33 发表于 8-10-2013 11:30 PM
如果想要更快速的IO处理,当然要学习port manipulation了
- byte pattern [16][16] = {
- { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 },
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
- };
- int i;
- int j;
- void setup(){
- DDRB = 0x19;
- }
- void loop(){
- j++;
- if(j ==16){
- j = 0;
- };
- shiftOut(j);
- delay(30);
- }
- void shiftOut(int j){
- PORTB ^= 0x01;
- for(i = 0; i < 16; i++){
- if(pattern[j][i] == 1){
- PORTB = 0x08;
- }
- else{
- PORTB | 0x08;
- }
- PORTB = 0x10;
- PORTB ^= 0x10;
- }
- PORTB = 0x01;
- }
复制代码 是不是这样用的啊 ....
这个源码可以用.. LED 会跑动..
可是小弟不明白 ^ & | 和当他们加上 = 的时候那些 function 是怎样的啊 ... 小弟请大大指教
|
|
|
|
|
|
|
|
发表于 9-10-2013 07:09 PM
|
显示全部楼层
angels1026 发表于 9-10-2013 12:49 AM
是不是这样用的啊 ....
这个源码可以用.. LED 会跑动..
可是小弟不明白 ^ & | 和当他们加上 = ...
必须先搞清楚ATmeaga328与Arduino UNO的对照脚
PORTB = Digital 8至Digital 13
^叫为Exclusive OR(XOR), 用于toggle谋bit
PORTB ^= 0x01 (0001)就是toggle bit0(Digital 8),其余bit不会隨之变动
PORTB | 0x08(1000)用于关闭(LOW)bit3(Digital 11),类似digitalWrite(11, LOW);
PORTB | 0x08不能单独使用,之前必须先运行PORTB = 0x08
PORTB | 0x08运行前,会记录之前的PORTB 输出状态
PORTB | 0x08有如flip flop,当此bit3 LOW时,之前的PORTB 输出会变HIGH
PORTB = 0x10(0001 0000)
PORTB ^= 0x10
是用于toggle bit5(Digital 13),可以写成这样
digitalWrite(13, HIGH)
digitalWrite(13, LOW)
|
|
|
|
|
|
|
|
楼主 |
发表于 11-10-2013 12:17 AM
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|