打印
[技术问答]

初学者问个小问题

[复制链接]
612|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
18903210028|  楼主 | 2017-8-4 15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在学新唐MUC,其中有个语句不理解怎么运算的,请各位老师指导下
void Write_LED_Bar(uint32_t Number)
{
    uint32_t i;
    volatile uint32_t *ptrLED[_LED_Bar_Count] = {&_LED1, &_LED2, &_LED3, &_LED4, &_LED5, &_LED6, &_LED7};

    for(i = 0; i < _LED_Bar_Count; i++)
    {
        if((Number > i) & 0x01)
            *ptrLED[i] = 0; //LED ON
        else
            *ptrLED[i] = 1; //LED OFF
    }
}
这里边的if((Number > i) & 0x01)是怎么计算的
沙发
jiekou001| | 2017-8-4 16:00 | 只看该作者
你你这,应该是判断Number是不是大于i,如果大于i,就进行位与操作。。操作后,如果第一个位置是1,就是真。后面的0x01通常称为掩码。。

使用特权

评论回复
板凳
jiekou001| | 2017-8-4 16:00 | 只看该作者
其实我也是新手,略懂一点。。不过不知道你这程序是干啥的。

使用特权

评论回复
地板
jiekou001| | 2017-8-4 16:01 | 只看该作者
if((i>>j)&0x01==0)k++什么意思啊?



假设i=01101100,二进制,j=7,
那么i>>j就是i右移7位,得到临时变量01,(注意这个时候i的值并没有改变)然后 临时变量01再和0x01取并运算,得1,K的值就加1,在这里0x01叫做掩码,
和你见到的网络掩码是一个作用,就是把某个值里面为一的位提取出来。
你贴上的那段代码
extern void _stdcall Init()
{
unsigned char i;
int j,k;
int cTable[256];
cTable[0]=8;
for(i=1;i!=0;i++)
{
k=0;
for(j=0;j<8;j++)
{
if((i>>j)&0x01==0) k++;
}cTable==k;
}
}
就是记录每个字节中不为一的bit有多少位,最多保存256个字节的信息。例如:
01101100 、00110011.。。。。
两个字节,记在cTable[0],cTable[1]里是4、4,明白了么?


使用特权

评论回复
5
jiekou001| | 2017-8-4 16:02 | 只看该作者
上面的例子,应该跟你问的类似。只不过这个是移位操作,你的那个是比较操作。。

使用特权

评论回复
6
18903210028|  楼主 | 2017-8-4 16:04 | 只看该作者
谢谢您,我再理解理解

使用特权

评论回复
7
天灵灵地灵灵| | 2017-8-4 22:18 | 只看该作者
这个写的规范点,就容易理解了。

使用特权

评论回复
8
yiyigirl2014| | 2017-8-5 21:33 | 只看该作者
这个是C语言的问题了。跟单片机本身无关。。推荐C Primer Plus 这本书。

使用特权

评论回复
9
18903210028|  楼主 | 2017-8-5 21:46 | 只看该作者
本帖最后由 18903210028 于 2017-8-5 21:49 编辑

这是一个通过采集AD口然后点亮LED灯的实验,是新唐的M451库里带的程序。我今天单步仿真发现如果Number的值是2 i=0或1时,2在和后边的 & 0x01按位与。应该不是真,但还是会执行   *ptrLED = 0; //LED ON这条语句。还是会有两个灯亮,LED1和LED2。难道这个掩码不参与判断吗
while(1)
    {
        //Get Volume Knob Data 获取音量旋钮数据
        Volume = Get_ADC_Knob();                    //Volume Range: 0 ~ 4095
        printf("%d\n", Volume);

        //Use Volume Control to LED Flash Speed
//      Write_LED_Color_Flash(Volume);

        //Show Volume scale on LED Bar
        LED_Value = Volume * (12 + 1) / 4096;       //LED Bar Count Range: 0 ~ 12
        Write_LED_Bar(LED_Value);
    }
#define _LED_Bar_Count      7

#define _LED1               PB2
#define _LED2               PB3
#define _LED3               PC3
#define _LED4               PC2
#define _LED5               PA9
#define _LED6               PB1
#define _LED7               PC7



void Write_LED_Bar(uint32_t Number)
{
    uint32_t i;
    volatile uint32_t *ptrLED[_LED_Bar_Count] = {&_LED1, &_LED2, &_LED3, &_LED4, &_LED5, &_LED6, &_LED7};

    for(i = 0; i < _LED_Bar_Count; i++)
    {
        if((Number > i)& 0x01 )
            *ptrLED = 0; //LED ON
        else
            *ptrLED = 1; //LED OFF
    }
}

使用特权

评论回复
10
18903210028|  楼主 | 2017-8-5 21:52 | 只看该作者
yiyigirl2014 发表于 2017-8-5 21:33
这个是C语言的问题了。跟单片机本身无关。。推荐C Primer Plus 这本书。

谢谢,我在网上下载了这本书

使用特权

评论回复
11
18903210028|  楼主 | 2017-8-5 21:53 | 只看该作者
天灵灵地灵灵 发表于 2017-8-4 22:18
这个写的规范点,就容易理解了。

这个怎么写会规范呢,麻烦您帮忙写个规范的,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝