Arduino(二)——数码管显示(不同程序)

——这节,我们要用一位数码管显示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 的一个变换。

但是上述做法采用的依旧是堆叠的手段,我们如何让我们的代码变得更简单一点呢?

因此我们引入了 —— 数组

 我们采取数组,就可以把代码给简单化了

猜你喜欢

转载自blog.csdn.net/ArtoriaLili/article/details/121277061