——这节,我们要用一位数码管显示0~9
但是在学习前,我们需要了解一些东西:
1.与 的运算
0&0=0 | 0&1=0 | 1&1=1 | 1&0=0 |
即 两个同时为1 结果才为1,否则为0
2.或 的运算
0|0=0 | 0|1=1 | 1|1=1 | 1|0=1 |
即 一个1 就是1,否则为0
3
0 | 0000 | 4 | 0100 | 8 | 1000 | c | 1100 |
1 | 0001 | 5 | 0101 | 9 | 1001 | d | 1101 |
2 | 0010 | 6 | 0110 | a | 1010 | e | 1110 |
3 | 0011 | 7 | 0111 | b | 1011 | f | 1111 |
我们接下来先来看一串代码
//显示数字3
int value = 0x4F;
void setup()
{
for (int i = 2 ; i < 9; i++)
{
pinMode(i , OUTPUT);
}
}
void loop(){
for (int i = 2 ; i < 9; i++ )
{
digitalWrite(i,value&0x01);
value >>= 1;
}
}
分析:
对于 void setup() : 我们使用一个for循环把d2 到 d8 口全部都打开
!!!!!
对于 void loop() : 我们对循环体内的说明
value & 0x01 是什么含义? 首先,value 为 01001111(0x4F,8进制)0x01 为 00000001
我们上面学过&运算 全部都是 1 为1,所以这个运算,我们把他理解为取最低位值的运算
>>为位移运算符,在这就是右移运算符,而 >>= 10100111(1),把括号内的移掉,然后在左边的空位上补0
所以第一个循环中 i = 2;输出值为1 所以为高电平;
第二个循环中 i =3;输出值为1 所以为高电平;
....
第五个循环中 i =6;输出值为0 所以为高电平;
...
第七个循环中 i =8;输出值为0 所以为高电平;
所以得到
a | b | c | d | e | f | g | h |
1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 |
D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 |
所以 a b c d g 是亮的,
所以我们显示的是数字 3,所以我们的代码abcdefg是从右到左的顺序开始的
接下来我们对数字的段码进行分析:
对应数码管 | h g f e d c b a | 对应 |
0 | 0 0 1 1 1 1 1 1 | 0x3F |
1 | 0 0 0 0 0 1 1 0 | 0x06 |
2 | 0 1 0 1 1 0 1 1 | 0xx8 |
3 | 0 1 0 0 1 0 1 1 | 0x4F |
4 | 0 1 1 0 0 1 1 0 | 0x66 |
5 | 0 1 1 0 1 1 0 1 | 0x6D |
6 | 0 1 1 1 1 1 0 1 | 0x7D |
7 | 0 0 0 0 0 1 1 1 | 0x07 |
8 | 0 1 1 1 1 1 1 1 | 0x7F |
9 | 0 1 1 0 1 1 1 1 | 0x6F |
void sendData1( int value)// 数字段码
{
for( int i = 2 ; i<=9 ; i++)
{
digitalWrite(i,value & 0x01);
value >>= 1;
}
delay(500);
}
void setup() {
for(int i=2 ; i<=9 ; i++)
{
pinMode(i,OUTPUT);
}
}
void loop() {
//过去
sendData1(0x3F);
sendData1(0x06);
sendData1(0x5B);
sendData1(0x4F);
sendData1(0x66);
sendData1(0x6D);
sendData1(0x7D);
sendData1(0x07);
sendData1(0x7F);
sendData1(0x6F);
//回来
sendData1(0x6F);
sendData1(0x7F);
sendData1(0x07);
sendData1(0x7D);
sendData1(0x6D);
sendData1(0x66);
sendData1(0x4F);
sendData1(0x5B);
sendData1(0x06);
sendData1(0x3F);
}
我们接着来看这段代码,里面有一个非常重要的函数 delay()
!!! 如果没有delay()会发生什么呢?
在这个代码中,我们的数码管 只会显示 0,为什么? 我们把 delay 理解为延时函数,而我的个人理解,就是执行的时长(我们在这以毫秒为单位),如果没有 delay(),我们的函数就会一直执行下去,也就是我的输入的 sendData1(0x3F) ,这样的话,如果一直让他输入,那我们后面的输入就不会出现,所以一直是 0
当我们使用 delay()后,我们这为0.5秒,也就是我们把 sendData(0x3F) 执行0.5秒,当我们执行完了以后,就会跳到下一个sendData(0x06);以此类推 这样我们就能实现 数码管从 0~9~0 的一个变换。
但是上述做法采用的依旧是堆叠的手段,我们如何让我们的代码变得更简单一点呢?
因此我们引入了 —— 数组
我们采取数组,就可以把代码给简单化了