【arduino】控制N位数码管

本文介绍了如何使用Arduino编程控制四位共阳极数码管,包括数码管的连接方式、亮灯函数的实现以及清空灯光的操作。通过实例展示了如何显示数字和小数点。
摘要由CSDN通过智能技术生成

以下以四位共阳极数码管为例;
本文所有说明均以注释的方式进行。
四位共阳极数码管
使用方法:

#include "DigitalTube.h"
//每位共阳极对应的引脚
  int digital[4] = {8, 11, 12, 7};
  //参数分别为a f b g e c d dp digital(共阳极引脚数组) length(digital长度)
  DigitalTube tube = DigitalTube(9, 10, 13, 6, 2, 5, 3, 4, digital, 4);
  
void setup() {
  for(int i=0; i<=13 ; i++){
    pinMode(i, OUTPUT);
  }
  //亮灯函数;第一个参数位灯的形状,第二个参数为第几位
  //灯的形状以八位二进制表示,从左到右分别的 a f b g e c d dp; 0为灭、1为亮
  //该函数表示在第二位显示0
  tube.light(0b11101110, 2);
  delay(5000);
  //清空灯光,防止余晖
  tube.clear();
}

void loop() {
  //亮灯函数;示数891.0 长度为5位(包括小数点)
  //第一个参数不一定为严格的小数可以有多个小数点例如tube.light("1.5.7.0", 7);
  tube.light("891.0", 5);
}

以下为核心代码;代码以共阳极数码管为例,可以根据自己的需要更改HIGH和LOW;或将需要的电平添加到构造函数中使用;

#ifndef _DIGITALTUBE_H_
#define _DIGITALTUBE_H_

#include"Arduino.h"

class DigitalTube
{
  private:
   	//八位数字引脚
    int figure[8];
    //共阳极引脚数组
    int* digitalPin;
    //共阳极引脚长度
    int digitalLength;
  public:
  	//0-9的形状
    int shapeList[10] = {0b11101110, 0b00100100, 0b10111010, 0b10110110, 0b01110100, 0b11010110, 0b11011110, 0b10100100, 0b111111110, 0b11110110};
    //初始化
    DigitalTube(int a, int f, int b, int g, int e, int c, int d, int dp, int digital[], int length);
    //亮单个灯光, shape 灯光形状; unit 第几位
    void light(int shape, int unit);
    void light(String num, int size);

    //清空灯光
    void clear();
};
#endif
#include "Print.h"
#include"DigitalTube.h"
#include"Arduino.h"

DigitalTube::DigitalTube(int a, int f, int b, int g, int e, int c, int d, int dp, int digital[], int length)
{
  //初始化PIN
  figure[0] = a;
  figure[1] = f;
  figure[2] = b;
  figure[3] = g;
  figure[4] = e;
  figure[5] = c;
  figure[6] = d;
  figure[7] = dp;
  this->digitalPin = digital;
  this->digitalLength = length;
  
  // 初始化电压
  for(int i=0; i< sizeof(figure) ; i++){
    digitalWrite(figure[i], LOW);
  }
  for(int i=0; i< sizeof(digital) ; i++){
    digitalWrite(digitalPin[i], LOW);
  }
};
void DigitalTube::light(int shape, int unit){

  for(int i =0; i< digitalLength ;i++){
    digitalWrite(digitalPin[i], LOW);
  }
  digitalWrite(digitalPin[unit], HIGH);

  for(int i=0; i< 8;i++){
    int level = shape&(1<<i);
    if(level != 0){
      digitalWrite(figure[7-i], LOW);
    }else{
      digitalWrite(figure[7-i], HIGH);
    }
  }
};

void DigitalTube::light(String num, int size){
  int i = 0, y = 0;
   while(i< size){
     int shape = this->shapeList[(int)num[i] - 48];
     if(num[i+1] == '.'){
       i++;
       shape = shape | 1;
     }
     this->light(shape, y);
     delay(1);
     this->clear();
     i++;
     y++;
   }
};

void DigitalTube::clear(){
  // for(int i =0; i< sizeof(digitalPin) ;i++){
  //   digitalWrite(digitalPin[i], HIGH);
  // }
  for(int i=0; i< 8;i++){
    digitalWrite(figure[i], HIGH);
  }
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值