看板 ASM 關於我們 聯絡資訊
這個題目要把 ADC的 0~255 8bit 輸入, 轉換成16個LED漸層顯示 #include <reg51.h> unsigned char ADC=0,i; main() { while(1) { ADC=P0; //載入ADC 8bit值 P1=P3=0xff;//關閉這16顆LED for(i=0;ADC>(i*16);i++);//計算階數 if(ADC>127) { P3=0; for(;i>=9;i--) P1=P1>>1; } else if(ADC<=128) { for(;i>0;i--) //Why can't "i>=0" ? <----問題所在 P3=P3>>1; } delay(10); } } 1.假如 for 迴圈設成 i>=0,高8bit全暗,低8bit全亮,電路對ADC毫無反應,怎麼會這樣? 2.請問整個題目還有更精簡的寫法嗎? (條件:越接近LSB要越先亮) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.167.217 ※ 編輯: deo2000 來自: 140.122.167.217 (07/20 05:41)
WolfLord:你這樣算不出漸層喔~ 只能亮不亮 07/20 11:51
我只是要"整體"看起來漸層的就好,不用到PWM這麼細緻啦, 版大太佛心了還幫我把code寫好貼上
WolfLord:另外,你第一個迴圈會有問題 07/20 11:51
WolfLord:for(i=0;ADC>(i*16);i++);//計算階數 << 07/20 11:52
kikiqqp:(ADC/0x0F)^0x0F這樣呢? 07/20 11:54
kikiqqp:要漸層要配和PWM使用 07/20 11:55
WolfLord:unsgned char r,s; s=ADC>>4;s=ADC&0xf; 這樣就求出階數 07/20 11:57
WolfLord:與餘數了。何必浪費CPUTIME去求*/? 07/20 11:57
好直接! 直接用ALU的運算思考除法.可是,請問求餘數的做法是怎麼推導的呢?
kikiqqp:對C不純熟,只想到後SWAPF ADC後ANDLW 0FH。受教了 07/20 12:07
MaxHaru:i為unsigned char, 所以"i>=0"always成立.. 07/20 13:57
這邊就沒辦法理解耶,unsigned char不是0~255嗎? ※ 編輯: deo2000 來自: 118.168.15.78 (07/20 16:52)
MaxHaru:0~255, 所以當i=0時, i-- => i=255 07/20 18:31
MaxHaru:以16進制來看比較清楚, 0x00-1=0xFF 07/20 18:35
WolfLord:>>1 =/2 >>4=/16; &1=%2 &3=%4 &7=%8 &15=%16 07/20 20:35