//数码管显示
void Nixie_Scan(void)
{
static unsigned char index = 0; //设置一个静态无符号字符型变量 index
P2 = (P2 & 0x1f) | 0xe0; //数码管消隐
P0 =0xff;
P2 = (P2 & 0x1f) | 0xc0; //数码管位选
P0 = 0x01 << index; //0000 0001 左移index
P2 = (P2 & 0x1f) | 0xe0; //数码管段选
P0 = NixieBuff[index];
P2 &= 0x1f; //锁存
index ++;
index &= 0x07; //0000 0111
}
学习这段代码的时候,觉得 index &= 0x07;
无法理解。
然后通过运行下列代码:
#include<iostream>
using namespace std;
int main() {
for (int i = 0; i < 8; i++) {
static unsigned char x = 0;
unsigned char y;
y = 0x01 << x;
x++;
x &= 0x07;
cout <<(int)y<<","<< (int)x << "," << i << endl;
}
}
结果如下:
发现P0的确是一直向左移动一位,index也是每次只加一。
然后再看到——
0x07->0000 0111
& 0x07
即为前五位一直清零,则 index 最多只能加到 0000 0111
.
即,最多只能加到7.
再回过头看看,index ++;
index 是静态无符号字符型变量,
那么,字符型自加又是什么呢?
查阅了很多资料,还是加一;
但是我突然想到,会不会是加上字符型的 1 呢?字符型的 1 是 0x01
吗?
于是又去看ASCII码表——
结果发现,1 其实就是 0000 0001,那么,问题就解决了——
index ++;
其实就是变成
0000 0001 -> 0000 0010 -> 0000 0011
。。。。
而 & 0x07
就是为了防止 index > 7.
over.