作者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