int x1=13
int x2=12;
int x3=11;
int x4=10;
int x5=9;
int x6=8;
int a=1;
int buttonState=0;
void setup() {
pinMode(2, INPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
digitalWrite(11, LOW);
delay(1000);
digitalWrite(11, HIGH);
digitalWrite(13, LOW);
delay(1000);
while(1)//
{
buttonState = digitalRead(2);
if (buttonState==HIGH)
{
a=a+1;
}
delay(1000);
if(a==1){
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
}
if(a==2){
digitalWrite(13, HIGH);
digitalWrite(12, LOW);
}
}
}
現在只做按一下按鈕+1下燈號,但是我燈號停止時未按鈕都是11,當我另外再設一按鈕當-1,那我按二下到13時,此時再按另一按鈕-1,不就只能設11暗10亮,這樣13亮不就瞬間跳到10亮,我要怎麼設讓哪一個燈亮是變數,而不是定數,這樣不管怎麼按,燈都只是一個個往上和往下
int a=0;
int buttonState=1;
int led_count;
void led_shift(){
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
led_count=x-INT(a/2);
digitalWrite(led_count,HIGH);
}
void setup() {
pinMode(2, INPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
digitalWrite(13, HIGH);
digitalWrite(11, LOW);
delay(1000);
digitalWrite(11, HIGH);
digitalWrite(13, LOW);
delay(1000);
}
void loop() {
if ((digitalRead(2)==LOW)&&(buttonState==1))
{
buttonState = digitalRead(2);
a++;
}
else
{
buttonState = digitalRead(2);
}
if ((a%2)==1)
{
led_shift();
a++;
if (a>=12)
{
a=0;
}
}
}
luluxx wrote:
謝謝你,請問這是哪...(恕刪)
??...習得什麼?
如果我說.....這個很簡單,根本不用看書,
這樣說會不會很假掰?....但是我真的沒看書學阿督挪.....
因為阿督挪的範例很直觀啊~也不用看書,
直接翻它的線上手冊,英文不要太爛,
照著裡面的例題範例,實作一下好像真的不難啊!!
我寫的例子其實還有很多改善空間的,
例如~~按鍵有彈跳問題,沒準加個延遲可以解決,
或是轉高低電壓位的時候看一下時間是不是合理判斷?
另外我覺得既然您原來的程式裡面已經用到loop了,
那麼還要用while(1)真的蠻多餘的,所以把一部分的燈號閃爍移到setup去了,
移位就是把某個電壓輸出弄到數字腳的遞增或是遞減,應該蠻直觀的.....
hchou38 wrote:共有六個輸出嗎...
void loop() {
if ((digitalRead(2)==LOW)&&(buttonState==1))
{
buttonState = digitalRead(2);
a++;
}
else
{
buttonState = digitalRead(2);
}
if ((a%2)==1)
{
led_shift();
a++;
if (a>=12)
{
a=0;
}
}
}
可以用 switch case 嗎...
或許這段可以改一下...
void loop() {
if (digitalRead(2)==LOW)
{
if (buttonState==1)
{
buttonState = 0;
a++;
if (a>=6)
a=0;
}
}
else
{
buttonState = 1;
}
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
switch (a)
{
case 0 :
digitalWrite(8, HIGH);
break;
case 1 :
digitalWrite(9, HIGH);
break;
case 2 :
digitalWrite(10, HIGH);
break;
case 3 :
digitalWrite(11, HIGH);
break;
case 4 :
digitalWrite(12, HIGH);
break;
case 5 :
digitalWrite(13, HIGH);
break;
}
}
luluxx wrote:
有點看不懂,為何a...(恕刪)
啊~~這個%2就是取除2的餘數啊....
其實要移位燈號的方法有很多種,
我把我範例的想法講解一下....
因為每按一次,就是高電壓變低電壓,我們註記一次.
這時候去改燈號.....
把燈號熄了.再把該點的燈號點亮,這樣只要號碼腳是遞增或是遞減,就會有移位的效果,
但是有個問題,這個動作應該是每次按鈕按下時候會做,
做完後就應該把註記再加一,才不會重複做這樣的事,
看起來熄了又亮,那就是閃爍不是亮燈了....
因為阿督挪的阿公還是C++,
所以有那個C跟C++的自訂函數方式,阿督挪也是可以用的,
用函式來做想要做的一大組動作,可以看起來有組織,下回還有相同的動作,
直接拿來用就可以了,所以很方便....
為何我會去學阿督挪?因為我以前常被我們公司的RD晃點,
晃點多了,自己也會去看C++或是阿督挪,免得又被工程師騙去,
假如有RD隨便亂講,我也可以語出驚人的回覆他其實我知道的....
luluxx wrote:
有點看不懂,為何a/2還有a%2,感覺移動只會用加法與減法,另外
If {
Buttonstate =revitalised(2)
}
Else{
Buttonstate =revitalised(2)
}
如果也執行,否則也執行,@@不懂...
第一次看到void led_shift(),意指並非只有setup與loop,void 後面我們可以自己定義?
1.
第一次a++後...a=1
a%2 便會成立...執行裡面的東西...
而裡面有一個 a++
則會讓 a=2,
下次再執行 run 到 if (a%2)時...
便會被擋在外面避免重覆執行...
是一個... lock 的作用...
2.
也是 lock 的用法...
只是...可能因為是用靈衣介面撰寫...
所以沒法思考的比較完善...
導致無論如何...
Buttonstate 那行每次都會執行...

阿...忘了說...
我不會阿...什麼諾...
hchou38 wrote:
啊~~這個%2就是..為何我會去學阿督挪?因為我以前常被我們公司的RD晃點,
晃點多了,自己也會去看C++或是阿督挪,免得又被工程師騙去,
假如有RD隨便亂講,我也可以語出驚人的回覆他其實我知道的.....(恕刪)
您公司在做那類產品?
C現在一般都用在嵌入式平台比較多,如果只會arduino是不夠的
代表是用軟體的思維在做韌體..
去年我在人力銀行上看到韌體需求居然是arduino,MCU的成本會較高
============================
我兩年前到現在公司任職開發USB HID介面客製化印表機韌體時,上一任開發者是軟體兼任的
原本列印的速度遠遠低於市售印表機
程式碼內呼叫一堆函式庫,想要快也難
到職後我直接控制暫存器控制讀寫頭,不用原廠函式庫,光這樣的處理速度時間只有原廠函式的66%
更不用說列印字的放大列印
上一任光一個文字放大2-8倍列印,居然是用呼叫演算法
我直接用自定計算法就快多了
整個案子下來列印速度達到印字頭的傳輸速度的上限(勾示波器看的結果)


























































































