[問題] ADC Binary to 16階LED,i>0可,i>=0卻不行

看板ASM (組合語言)作者 (800IM)時間12年前 (2012/07/20 05:05), 編輯推噓6(606)
留言12則, 3人參與, 最新討論串1/1
這個題目要把 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)

07/20 11:51, , 1F
你這樣算不出漸層喔~ 只能亮不亮
07/20 11:51, 1F
我只是要"整體"看起來漸層的就好,不用到PWM這麼細緻啦, 版大太佛心了還幫我把code寫好貼上

07/20 11:51, , 2F
另外,你第一個迴圈會有問題
07/20 11:51, 2F

07/20 11:52, , 3F
for(i=0;ADC>(i*16);i++);//計算階數 <<
07/20 11:52, 3F

07/20 11:54, , 4F
(ADC/0x0F)^0x0F這樣呢?
07/20 11:54, 4F

07/20 11:55, , 5F
要漸層要配和PWM使用
07/20 11:55, 5F

07/20 11:57, , 6F
unsgned char r,s; s=ADC>>4;s=ADC&0xf; 這樣就求出階數
07/20 11:57, 6F

07/20 11:57, , 7F
與餘數了。何必浪費CPUTIME去求*/?
07/20 11:57, 7F
好直接! 直接用ALU的運算思考除法.可是,請問求餘數的做法是怎麼推導的呢?

07/20 12:07, , 8F
對C不純熟,只想到後SWAPF ADC後ANDLW 0FH。受教了
07/20 12:07, 8F

07/20 13:57, , 9F
i為unsigned char, 所以"i>=0"always成立..
07/20 13:57, 9F
這邊就沒辦法理解耶,unsigned char不是0~255嗎? ※ 編輯: deo2000 來自: 118.168.15.78 (07/20 16:52)

07/20 18:31, , 10F
0~255, 所以當i=0時, i-- => i=255
07/20 18:31, 10F

07/20 18:35, , 11F
以16進制來看比較清楚, 0x00-1=0xFF
07/20 18:35, 11F

07/20 20:35, , 12F
>>1 =/2 >>4=/16; &1=%2 &3=%4 &7=%8 &15=%16
07/20 20:35, 12F
文章代碼(AID): #1G27QbIn (ASM)
文章代碼(AID): #1G27QbIn (ASM)