数码管 二位 2位共阳 显示两个不同的数字

LED用来显示两位数字,然而现在网上详细的说明依然是没有。自己瞎搞就是只能显示两位一样的数字出来。

 

LED数码管

观察数码管的一侧,7段,再加上 角落里一个点就需要8个针脚。一个针脚供电。正好是9个针脚。
两边针脚公用,两个供电针脚正好是10个针脚。
LED数码管原理图
看原理图可知,7号,8号为供电针脚。
从图右上角可知:

显示数字1需要亮起 “B”,“C
同理234567890都可以勾画出来。

然后图下方的图举例,显示1,需要A,B。对应109针脚就OK了。

  • 如何让两边显示不同的数字呢?
    那就是在人眼可识别的闪烁频率以上交替显示两个数字。

    (光闪烁的频率达到一定程度时 人眼感觉不到它的闪烁 这个频率值 是45.8HZ
    据个例子 比如隔行扫描的电视 一张图像分为奇数场和偶数场分别扫描 按序连续播放 当频率足够快时 人眼由于视觉残留特性 便感觉动画很流畅 感觉不到奇偶交替带来的闪烁感 这个频率的值就称为人眼临界闪烁频率
    再比如日光灯 其实也是闪烁的 只是频率高于人眼临界闪烁频率 所以你看到的是连续照明)

因此,只要两个数字不断交替显示就可以达到效果了。

交替显示

下面是从0~99 再从 99~0循环显示的代码

#include "core.h"
#include
#define A 0
#define B 1
#define C 2
#define D 3
#define E 4
#define F 5
#define G 6
#define DP 7
 
#define First_num 8
#define Second_num 9
 
//初始化0~7管脚
void INIT(){
int i = 0;
for (i; i <= 9; i++){
   digitalWrite(i, HIGH);
}
}
 
void first_close_all(){
int i = 0;
for (i; i <= 7; i++){
   digitalWrite(i, HIGH);
}
}
 
void second_close_all(){
int i = 0;
for (i; i <= 7; i++){
   digitalWrite(i, LOW);
}
}
//数字1
void num_one(){
digitalWrite(B, LOW);
digitalWrite(C, LOW);
}
//数字2
void num_two(){
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(G, LOW);
digitalWrite(E, LOW);
digitalWrite(D, LOW);
}
//数字3
void num_three(){
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(G, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
}
//数字4
void num_four(){
digitalWrite(F, LOW);
digitalWrite(G, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
}
//数字5
void num_five(){
digitalWrite(A, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
}
//数字6
void num_six(){
digitalWrite(A, LOW);
digitalWrite(F, LOW);
digitalWrite(E, LOW);
digitalWrite(D, LOW);
digitalWrite(C, LOW);
digitalWrite(G, LOW);
}
//数字7
void num_seven(){
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
}
//数字8
void num_eight(){
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
}
//数字9
void num_nine(){
digitalWrite(G, LOW);
digitalWrite(F, LOW);
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
}
//数字0
void num_zero(){
int i = 0;
for (i; i <= 5; i++){
   digitalWrite(i, LOW);
}
}
 
// 显示数字
void display_first(int num){
   INIT();
   digitalWrite(First_num, HIGH);
   digitalWrite(Second_num, LOW);
   switch (num) {
      case 1:
         num_one();
         break;
      case 2:
         num_two();
         break;
      case 3:
         num_three();
         break;
      case 4:
         num_four();
         break;
      case 5:
         num_five();
         break;
      case 6:
         num_six();
         break;
      case 7:
         num_seven();
         break;
      case 8:
         num_eight();
         break;
      case 9:
         num_nine();
         break;
      default:
         num_zero();
         break;
   }
   delay(1);
}
 
void display_second(int num){
   INIT();
   digitalWrite(First_num, LOW);
   digitalWrite(Second_num, HIGH);
   switch (num) {
      case 1:
         num_one();
         break;
      case 2:
         num_two();
         break;
      case 3:
         num_three();
         break;
      case 4:
         num_four();
         break;
      case 5:
         num_five();
         break;
      case 6:
         num_six();
         break;
      case 7:
         num_seven();
         break;
      case 8:
         num_eight();
         break;
      case 9:
         num_nine();
         break;
      default:
         num_zero();
         break;
   }
   delay(1);
}
 
void setup(){
int i = 0;
for (i; i <= 9; i++){
   pinMode(i, OUTPUT);
}
}
 
void loop(){
int i,j;
int first_num,second_num;
for (i = 0; i <= 99; i++){
   if (i < 10) {
      for (j = 0; j < 20; j++){
         display_second(i);
         delay(49);
      }
   } else {
      for (j = 0; j < 500; j++){
         first_num = i / 10;
         second_num = i % 10;
         display_first(first_num);
         display_second(second_num);
      }
   }
}
 
for (i = 99; i >= 0; i--){
   if (i < 10) {
      for (j = 0; j < 20; j++){
         display_second(i);
         delay(49);
      }
   } else {
      for (j = 0; j < 500; j++){
         first_num = i / 10;
         second_num = i % 10;
         display_first(first_num);
         display_second(second_num);
      }
   }
}
}