手头这个案子,是做数码管显示,因为即将有8个数码管显示面板,想用一个MCU控制这8个,每个都是独立的,于是就有一些每一个显示过程中的一些标志位。
既然是8个,一个char也是8个位,所以我就打算用 位操作来植标清标。
这是一个简单的事儿。
植标
flag |= 1<<slave;
清标:
flag &= ~(1<<slave);
判标也简单
if(flag & 1<<slave);
最初是由于一个显示BUG让我去追踪这几个标志,结果发现了很恐怖的事情,那就是,这些标志胡乱变化——我的意思,我根本没有到了去植标或者清标,就是说改变它的地方,可是,它自个的数值就变了。
我百思不得其解。
为了不让大家伙莫不着头脑,我上传相关的部分代码。
关于这一部分,我问了些人,也看了了些资料,做了一个变动,就是把这几个标志,包括那个分机slave的变量都设置成unsigned无符号型,但是没用。
因为怀疑是 逻辑移位和 算术移位 混淆了,但是无符号型换了后依然没用。
要说的是,这是一个很小众的玩意,MAXIM的一款内嵌32位CPU的一个东西,主要用来做通信,IO控制的。
它的IDE也很**,是MAXIM自己定制的,用起来别提多难受......
下面上部分代码:
if(CheckWin()) //P03
{
BetFlag &= ~(1<<slave); //Forbid BET
OpenWin |= 1<<slave;
GetWin &= ~(1<<slave);
}
if(OpenWin & 1<<slave)
{
if(counter == 0)
{
for(i = 0;i < 13;i++)
{
if( (i == winner) && BET[slave]) //winner:reserve & flash
{
ShowMatrix(slave,i,Left,Flash,BET[slave]);
ShowMatrix(slave,i,Right,Flash,BL[slave]);
}
else //not win :clear,set to 0
ShowMatrix(slave,i,Left,NotFlash,0);
}
win[slave] = BET[slave][winner] * BL[slave][winner];
WinSum[slave] += win[slave];
}
counter++;
if(counter == 2000)
{
counter = 0;
OpenWin &= ~(1<<slave); //只植了一次标志
GetWin |= 1<<slave;
}
}
//if(GetWin & 1<<slave)
if(GetWin)
{
if(AddWin(slave))
{
GetWin &= ~(1<<slave); //也只清了一次
BetFlag &= ~(1<<slave);
}
ShowMatrix(slave,slave,Right,NotFlash,GetWin);//这种是显示程序,追踪该数值用
}
|