标题:[求助] 一个位操作问题
只看楼主
litl123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-1
 问题点数:0 回复次数:6 
[求助] 一个位操作问题
单片机程序,定义一个数组 char SEGS[32] 其中前180个位(bit)为有效位,最后4个无效。在这180个位中随机7个位组成一个7段式的led数字8。共有14个led数字,请教高手有什么好办法对这些数字赋值,谢谢!

笨办法是:
//                 a ,b ,c ,d ,e ,f ,g
char number1[6] = {xx,xx,xx,xx,xx,xx,xx}  //xx 是在SEGS[]里的bit的位数


void set_seg(unsigned char seg_number)
{
    unsigned char seg_byte = 0,seg_bit = 0,data = 0;
    seg_byte = seg_number/8;
    seg_bit  = seg_number%8;
    data |= 1<<seg_bit;
    SEGS[byte] = data;
}

void clear_seg(unsigned char seg_number)
{
    unsigned char seg_byte = 0,seg_bit = 0,data = 0;
    seg_byte = seg_number/8;
    seg_bit  = seg_number%8;
    data &= ~(1<<seg_bit);
    SEGS[byte] = data;
}

void set_number1(unsigned char number)
{
    switch (number)
    {
        case 0:
        {
            set_seg(number1[0]);
            clear_seg(number1[1]);
                    .
                    .
                    .
                    .
                    .
            set_seg(number1[6]);
        }break;
        case 1:
        .
        .
        .
        case 9   
    }   
}

思路:有没有一个办法可以把任意的几个位组成一个数组,就像内存映射那样打乱顺序,再按要求组合??
搜索更多相关主题的帖子: 单片机程序 
2015-11-30 18:30
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
随机的7位是起始位随机还是任意位随机?这个随机是自己控制还是其他部分代码确定或者说给出的

反正怎么想你都应该把0-9初始化的

[此贴子已经被作者于2015-11-30 19:11编辑过]



[fly]存在即是合理[/fly]
2015-11-30 19:08
litl123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-1
得分:0 
位置是给出的而且固定,和其它程序无关,初始化有两种,一是0,二是不显
2015-11-30 19:28
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
程序代码:
#include <stdio.h>

#define BITE_SIZE 8

typedef unsigned char uchar;

// 0-f的7段码初始化,低7位可用
uchar flag[] = { 0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f, 0x77,
        0x7c, 0x39, 0x5e, 0x7d, 0x71 };

void print(uchar *str, size_t n)
{
    printf("%d", 0x1 & str[n / BITE_SIZE] >> (BITE_SIZE - n % BITE_SIZE - 1));
}

void set_num(uchar *str, size_t beg, int num)
{
    int realpos = beg / BITE_SIZE;
    int bitbeg = BITE_SIZE - beg % BITE_SIZE - 1;

    for (int i = 6;i >= 0;i--)
    {
        if (0x1 & flag[num] >> i) str[realpos] |= 0x1 << bitbeg;
        else str[realpos] &= ~(0x1 << bitbeg);

        realpos += bitbeg == 0;
        bitbeg = (bitbeg + 7) % BITE_SIZE;
    }
}

int main(int argc, char *argv[])
{
    uchar SEGS[32] = { 0 };

    for (size_t i = 0;i < sizeof(flag);i++)
    {
        set_num(SEGS, i * 8, i);
    }
    for (size_t i = 0;i < 32 * 8;i++)
    {
        if (i % 8 == 0) puts("");
        print(SEGS, i);
    }
    return 0;
}


[fly]存在即是合理[/fly]
2015-12-01 10:30
litl123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-1
得分:0 
realpos += bitbeg == 0;  这句是什么意思?
2015-12-01 13:25
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
相当于

if (bitbeg == 0)  realpos++;





[fly]存在即是合理[/fly]
2015-12-02 09:22
litl123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-8-1
得分:0 
谢谢 azzbcc 的指导
2015-12-04 10:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-459758-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.720925 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved