基于数码管和OLED的Arduino桌面级显示设备

基于数码管和OLED的Arduino桌面级显示设备

前序

​ 前天才回到学校,打扫了两天的宿舍,今天终于有空整理自己的东西了。于是我找到了尘封已久的基于数码管和OLED的Arduino桌面级显示设备(之前做好了,但是由于各种原因被我拆掉了一些零件),今天可算是把它修复了,以后就挂宿舍欣赏了(手动滑稽)。

​ 关于数码管程序及OLED的Arduino程序编写可查看我之前的博客,在此我就不在多叙述。

​ 附上链接:

注:代码注释较少(个人认为比较简单),大家可观看代码中的一些显示的,然后自行修改即可

视频效果

​ 没有仪器,手有点抖,原谅在下技术不过关,大家将就着看吧。
由于CSDN不能上传视频,而且gif大小有限制,只能用分段的GIF了。
1
2

源码

​ 由于本人不会发链接下载,所以就直接贴出来了。

​ 如果大家有需要我可以发个下载链接(看留言人数哟)。

注:代码注释较少(个人认为比较简单),大家可观看代码中的一些显示的,然后自行修改即可

/* 数码管和OLED多彩显示
 * 用于装饰桌面
 * OLED基于Adafruit库编写
 * 数码管基于时序编写
*/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                 //OLED显示屏的SCL接A5,SDA接A4

#define D_a 2    //一一对应晶体管的单个管
#define D_b 3
#define D_c 4
#define D_d 5
#define D_e 6
#define D_f 7
#define D_g 8
#define D_h 9

#define COM1 10  //对应4位晶体管的管号位
#define COM2 11
#define COM3 12
#define COM4 13

bool Digital_tube_number[37][8] = {  //若效果不好可自行修改
  {0,0,0,0,0,0,1,1},//0
  {1,0,0,1,1,1,1,1},//1
  {0,0,1,0,0,1,0,1},//2
  {0,0,0,0,1,1,0,1},//3
  {1,0,0,1,1,0,0,1},//4
  {0,1,0,0,1,0,0,1},//5
  {0,1,0,0,0,0,0,1},//6
  {0,0,0,1,1,1,1,1},//7
  {0,0,0,0,0,0,0,1},//8
  {0,0,0,0,1,0,0,1},//9
  {0,0,0,1,0,0,0,1},//A10
  {0,0,0,0,0,0,0,0},//B11
  {0,1,1,0,0,0,1,0},//C12
  {0,0,0,0,0,0,1,0},//D13
  {0,1,1,0,0,0,0,0},//E14
  {0,1,1,1,0,0,0,0},//F15
  {0,1,0,0,0,0,1,0},//G16
  {1,0,0,1,0,0,0,0},//H17
  {1,1,1,1,0,0,1,0},//I18
  {1,0,0,0,1,1,1,0},//J19
  {1,1,0,1,0,0,0,0},//K20
  {1,1,1,0,0,0,1,0},//L21
  {0,0,0,1,0,0,1,0},//M22
  {1,1,0,1,0,1,0,0},//N23
  {0,0,0,0,0,0,1,1},//O24
  {0,0,1,1,0,0,0,0},//P25
  {0,0,0,0,0,0,1,0},//Q26
  {0,0,0,1,0,0,0,0},//R27
  {0,1,0,0,1,0,0,0},//S28
  {0,1,1,1,0,0,1,0},//T29
  {1,0,0,0,0,0,1,1},//U30
  {1,0,0,0,0,0,1,0},//V31
  {1,1,1,1,1,1,0,0},//W32
  {1,1,1,1,1,1,0,0},//X33
  {1,0,0,0,1,0,0,0},//Y34
  {1,1,1,1,1,1,1,1},//不显示
  {1,1,1,1,1,1,1,0},//小数点36.
};

int delay_time = 2;

void setup() {
  // put your setup code here, to run once:
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(1000); // Pause for 2 seconds
  
  display.clearDisplay();
  display.cp437(true);                 //若声明则使用CP437字符集(默认关闭)
  display.setTextSize(1);              // 字体大小
  display.setTextColor(WHITE);         // 字体颜色
  display.setCursor(20,8);             // 字体位置(未声明将顺序向下)
  display.println(F("Welcome back!"));
  display.setCursor(40,16);
  display.println(F("FenYun!"));
  display.display();
  delay(2000); // Pause for 2 seconds
  
  for(int i=D_a;i<=D_h;i++){
    pinMode(i,OUTPUT);
  }
  for(int i=COM1;i<=COM4;i++){
    pinMode(i,OUTPUT);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  display.clearDisplay();
  display.setTextSize(4);
  display.setCursor(0,0);          
  display.setTextColor(WHITE);
  display.write(3);
  display.display();
  display.startscrolldiagright(0x00, 0x0F);
  Digital_tube_dynamic_display(0,5,0,8,5,1);
  Digital_tube_dynamic_display(5,2,0,36,5,1);
  display.startscrolldiagleft(0x00, 0x0F);
  Digital_tube_dynamic_display(15,14,23,16,5,2);
  Digital_tube_dynamic_display(34,30,23,36,5,2);
  Digital_tube_dynamic_display(3,2,3,36,5,2);
  display.clearDisplay();
  display.stopscroll();
  display.cp437(true);                 //若声明则使用CP437字符集(默认关闭)
  display.setTextSize(1);              // 字体大小
  display.setTextColor(WHITE);         // 字体颜色
  display.setCursor(30,0);             // 字体位置(未声明将顺序向下)
  display.println(F("Just do it!"));
  display.setCursor(40,8);
  display.println(F("FenYun!"));
  display.setCursor(1,16);             // 字体位置(未声明将顺序向下)
  display.println(F("Fight! Fight! Fight!"));
  display.setCursor(35,24);
  display.println(F("FenYun323!"));
  display.display();
  Digital_tube_display_sametime(2);
  
  delay(2500);
}

/* 动态显示
 * a数码管1显示,b数码管2显示,c数码管3显示,d数码管4显示,
 * time1视觉暂留最短时间,time2动态时间
 */
void Digital_tube_dynamic_display(int a,int b,int c,int d,int time1,float time2)
{
  if(time1>6){
    time1 = 6;
  }
  for(int i=0;i<time2*250/time1;i++){
    Digital_tube_display(1,a);
    delay(time1);
    Digital_tube_display(2,b);
    delay(time1);
    Digital_tube_display(3,c);
    delay(time1);
    Digital_tube_display(4,d);
    delay(time1);
  }
}

void Digital_tube_display_sametime(int number)
{
  digitalWrite(COM1,HIGH);
  digitalWrite(COM2,HIGH);
  digitalWrite(COM3,HIGH);
  digitalWrite(COM4,HIGH);
  for(int i=0;i<8;i++){
    digitalWrite(2+i,Digital_tube_number[number][i]);
  }
}

void Digital_tube_display(int com,int number)
{
  for(int i=COM1;i<=COM4;i++){
    digitalWrite(i,LOW);
  }
  switch(com){
    case 1:
      digitalWrite(COM1,HIGH);
      break;
    case 2:
      digitalWrite(COM2,HIGH);
      break;
    case 3:
      digitalWrite(COM3,HIGH);
      break;
    case 4:
      digitalWrite(COM4,HIGH);
      break;
  }
  for(int i=0;i<8;i++){
    digitalWrite(2+i,Digital_tube_number[number][i]);
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值