作者deo2000 (800IM)
看板ASM
標題[問題] ADC Binary to 16階LED,i>0可,i>=0卻不行
時間Fri Jul 20 05:05:38 2012
這個題目要把 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)
1F:推 WolfLord:你這樣算不出漸層喔~ 只能亮不亮 07/20 11:51
我只是要"整體"看起來漸層的就好,不用到PWM這麼細緻啦,
版大太佛心了還幫我把code寫好貼上
2F:→ WolfLord:另外,你第一個迴圈會有問題 07/20 11:51
3F:→ WolfLord:for(i=0;ADC>(i*16);i++);//計算階數 << 07/20 11:52
4F:→ kikiqqp:(ADC/0x0F)^0x0F這樣呢? 07/20 11:54
5F:→ kikiqqp:要漸層要配和PWM使用 07/20 11:55
6F:推 WolfLord:unsgned char r,s; s=ADC>>4;s=ADC&0xf; 這樣就求出階數 07/20 11:57
7F:→ WolfLord:與餘數了。何必浪費CPUTIME去求*/? 07/20 11:57
好直接! 直接用ALU的運算思考除法.可是,請問求餘數的做法是怎麼推導的呢?
8F:→ kikiqqp:對C不純熟,只想到後SWAPF ADC後ANDLW 0FH。受教了 07/20 12:07
9F:推 MaxHaru:i為unsigned char, 所以"i>=0"always成立.. 07/20 13:57
這邊就沒辦法理解耶,unsigned char不是0~255嗎?
※ 編輯: deo2000 來自: 118.168.15.78 (07/20 16:52)
10F:推 MaxHaru:0~255, 所以當i=0時, i-- => i=255 07/20 18:31
11F:推 MaxHaru:以16進制來看比較清楚, 0x00-1=0xFF 07/20 18:35
12F:推 WolfLord:>>1 =/2 >>4=/16; &1=%2 &3=%4 &7=%8 &15=%16 07/20 20:35