“第二十二课--Microduino 四位位数码管动态显示/zh”的版本间的差异

来自Microduino Wikipedia
跳转至: 导航搜索
视频
程序
 
(未显示2个用户的3个中间版本)
第1行: 第1行:
 +
{{Language|Lesson_22--Microduino_Four_Digital_Tube_Dynamic_Display}}
 
{| style="width: 800px;"
 
{| style="width: 800px;"
 
|-
 
|-
第7行: 第8行:
  
 
==设备==
 
==设备==
*'''[[Microduino-Core]]'''
+
*'''[[Microduino-Core/zh]]'''
*'''[[Microduino-FT232R]]'''
+
*'''[[Microduino-USBTTL/zh]]'''
 
*其他硬件设备
 
*其他硬件设备
 
**面包板跳线  一盒   
 
**面包板跳线  一盒   
第15行: 第16行:
 
**电位器          一个
 
**电位器          一个
 
**USB数据连接线  一根
 
**USB数据连接线  一根
 
 
  
 
==原理图==
 
==原理图==
第53行: 第52行:
  
 
==程序==
 
==程序==
<source lang="cpp">
+
[https://github.com/Microduino/Microduino_Tutorials/tree/master/Microduino_Advanced/MicroduinoFourDigitalDynamicDisplay MicroduinoFourDigitalDynamicDisplay]
 
 
/* 四位数码管的可控显示
 
** 注意,使用的5461AS是共阴极的,如果您是共阳极的需要注意某些部分的HIGH与LOW的替换
 
*/
 
 
 
//设置阳极接口
 
//D1口用来做串口数据传输(TX)
 
int a = 2;//D0,D1口在本程序中用来数据传出传入,不能当作数字针脚使用。
 
int b = 3;
 
int c = 4;
 
int d = 5;
 
int e = 6;
 
int f = 7;
 
int g = 8;
 
int p = 9;//小数点
 
//设置阴极接口(控制1、2、3、4数码管的亮与灭)
 
int d1 = 13;//千位
 
int d2 = 12;//百位
 
int d3 = 11;//十位
 
int d4 = 10;//个位
 
//设置变量
 
int del = 5000;  //此数值可用于对时钟进行微调
 
int changepin = A0;//从A0口输入电位计数据
 
int val=0;//接收从A0口获得的电位计数值
 
int val4=0;  //千位上的数字,即DIG1上的数字,对应针脚为d1,Arduino上的针脚为13
 
int val3=0;  //百位上的数字,即DIG2上的数字,对应针脚为d2,Arduino上的针脚为12
 
int val2=0;  //十位上的数字,即DIG3上的数字,对应针脚为d3,Arduino上的针脚为11
 
int val1=0;  //个位上的数字,即DIG4上的数字,对应针脚为d4,Arduino上的针脚为10
 
 
 
void setup()
 
{
 
  Serial.begin(9600);//设置串口通信速率为9600
 
 
  pinMode(d1, OUTPUT);
 
  pinMode(d2, OUTPUT);
 
  pinMode(d3, OUTPUT);
 
  pinMode(d4, OUTPUT);
 
 
 
  pinMode(a, OUTPUT);
 
  pinMode(b, OUTPUT);
 
  pinMode(c, OUTPUT);
 
  pinMode(d, OUTPUT);
 
  pinMode(e, OUTPUT);
 
  pinMode(f, OUTPUT);
 
  pinMode(g, OUTPUT);
 
 
 
  pinMode(p, OUTPUT);
 
}
 
 
 
void loop()
 
{
 
  val=analogRead(changepin);//读取电位计数值并赋给val
 
  Serial.println(val);//从串口中输出val的值
 
  for(int i=0;i<25;i++)//为了让数字不要那么灵敏的变来变去,给他循环25次恰好满足我的需求
 
  {
 
    //条件判断,根据val的位数分别显示
 
    if(val>=1000)//四位数
 
    {
 
      //注意,这里用使用了两种取某一位上的数字的算法,我只是想试试两种算法是否都好用
 
      val4=(val/1000)%10;                        /*比如1023除以1000等于1.023,
 
      取整数得到1,此即为千位上的数字,此为第一种算法,简单.*/
 
      val3=( val-((val/1000)%10*1000) )/100%10;  /*比如523减去523除以100等于5.23,取整后乘以100得到500,
 
      用523减去500得到23,再除以10得到2.3,取整后得到2,
 
      此为百位上的数字,此为第二章算法,稍显复杂,不过用起来也可以*/
 
      val2=(val-val/100%10*100)/10%10;
 
      val1= val-val/10%10*10-val/1000%10*1000;
 
 
 
      clearLEDs();
 
      pickDigit(1);
 
      pickNumber(val1);
 
      delayMicroseconds(del);
 
 
 
      clearLEDs();
 
      pickDigit(2);
 
      pickNumber(val2);
 
      delayMicroseconds(del);
 
 
 
      clearLEDs();
 
      pickDigit(3);
 
      pickNumber(val3);
 
      delayMicroseconds(del);
 
 
 
      clearLEDs();
 
      pickDigit(4);
 
      pickNumber(val4);
 
      delayMicroseconds(del);
 
    }
 
    else if(val>=100 && val<1000)//三位数
 
    {
 
      val3=(val/100)%10;
 
      val2=((val-(((val/100)%10)*100))/10)%10;
 
      val1=val-((val/100)%10)*100-((((val-((val/100)%10)*100)/10)%10)*10);
 
 
 
      clearLEDs();
 
      pickDigit(1);
 
      pickNumber(val1);
 
      delayMicroseconds(2*del);
 
 
 
      clearLEDs();
 
      pickDigit(2);
 
      pickNumber(val2);
 
      delayMicroseconds(del);
 
 
 
      clearLEDs();
 
      pickDigit(3);
 
      pickNumber(val3);
 
      delayMicroseconds(del); 
 
    }
 
    else if(val>=10 && val<100)//两位数
 
    {
 
      val2=(val/10)%10;
 
      val1=val-(((val/10)%10)*10);
 
 
 
      clearLEDs();
 
      pickDigit(1);
 
      pickNumber(val1);
 
      delayMicroseconds(del);
 
 
 
      clearLEDs();
 
      pickDigit(2);
 
      pickNumber(val2);
 
      delayMicroseconds(del);
 
    }
 
    else if(val>=0 && val<10)//一位数
 
    {
 
      val1=val;
 
      clearLEDs();
 
      pickDigit(1);
 
      pickNumber(val1);
 
      delayMicroseconds(del);
 
    }
 
  }
 
}
 
 
 
void pickDigit(int x)  //定义pickDigit(x),其作用是开启dx端口
 
{
 
  digitalWrite(d1, HIGH);
 
  digitalWrite(d2, HIGH);
 
  digitalWrite(d3, HIGH);
 
  digitalWrite(d4, HIGH);
 
 
 
  if(x==1)
 
  {
 
    digitalWrite(d4, LOW);
 
  }
 
  else if(x==2)
 
  {
 
    digitalWrite(d3, LOW);
 
  }
 
  else if(x==3)
 
  {
 
    digitalWrite(d2, LOW);
 
  }
 
  else if(x==4)
 
  {
 
    digitalWrite(d1, LOW);
 
  }
 
}
 
 
 
void pickNumber(int x)  //定义pickNumber(x),其作用是显示数字x
 
{
 
  switch(x)
 
  {
 
  default:
 
    zero();
 
    break;
 
  case 1:
 
    one();
 
    break;
 
  case 2:
 
    two();
 
    break;
 
  case 3:
 
    three();
 
    break;
 
  case 4:
 
    four();
 
    break;
 
  case 5:
 
    five();
 
    break;
 
  case 6:
 
    six();
 
    break;
 
  case 7:
 
    seven();
 
    break;
 
  case 8:
 
    eight();
 
    break;
 
  case 9:
 
    nine();
 
    break;
 
  }
 
}
 
 
 
void clearLEDs()  //清屏
 
{
 
  digitalWrite(a, LOW);
 
  digitalWrite(b, LOW);
 
  digitalWrite(c, LOW);
 
  digitalWrite(d, LOW);
 
  digitalWrite(e, LOW);
 
  digitalWrite(f, LOW);
 
  digitalWrite(g, LOW);
 
 
 
  digitalWrite(p, LOW);
 
}
 
 
 
 
 
/*
 
下面实现数字0到9以及小数点dp的显示,你也可以使用二维数组来实现这一部分,
 
详情请看博文:http://tahoroom.sinaapp.com/archives/5790.html
 
*/
 
void zero()  //定义数字0时各阳极针脚的开关
 
{
 
  digitalWrite(a, HIGH);
 
  digitalWrite(b, HIGH);
 
  digitalWrite(c, HIGH);
 
  digitalWrite(d, HIGH);
 
  digitalWrite(e, HIGH);
 
  digitalWrite(f, HIGH);
 
  digitalWrite(g, LOW);
 
}
 
 
 
void one()  //定义数字1时各阳极针脚的开关
 
{
 
  digitalWrite(a, LOW);
 
  digitalWrite(b, HIGH);
 
  digitalWrite(c, HIGH);
 
  digitalWrite(d, LOW);
 
  digitalWrite(e, LOW);
 
  digitalWrite(f, LOW);
 
  digitalWrite(g, LOW);
 
}
 
 
 
void two()  //定义数字2时各阳极针脚的开关
 
{
 
  digitalWrite(a, HIGH);
 
  digitalWrite(b, HIGH);
 
  digitalWrite(c, LOW);
 
  digitalWrite(d, HIGH);
 
  digitalWrite(e, HIGH);
 
  digitalWrite(f, LOW);
 
  digitalWrite(g, HIGH);
 
}
 
 
 
void three()  //定义数字3时各阳极针脚的开关
 
{
 
  digitalWrite(a, HIGH);
 
  digitalWrite(b, HIGH);
 
  digitalWrite(c, HIGH);
 
  digitalWrite(d, HIGH);
 
  digitalWrite(e, LOW);
 
  digitalWrite(f, LOW);
 
  digitalWrite(g, HIGH);
 
}
 
 
 
void four()  //定义数字4时各阳极针脚的开关
 
{
 
  digitalWrite(a, LOW);
 
  digitalWrite(b, HIGH);
 
  digitalWrite(c, HIGH);
 
  digitalWrite(d, LOW);
 
  digitalWrite(e, LOW);
 
  digitalWrite(f, HIGH);
 
  digitalWrite(g, HIGH);
 
}
 
 
 
void five()  //定义数字5时各阳极针脚的开关
 
{
 
  digitalWrite(a, HIGH);
 
  digitalWrite(b, LOW);
 
  digitalWrite(c, HIGH);
 
  digitalWrite(d, HIGH);
 
  digitalWrite(e, LOW);
 
  digitalWrite(f, HIGH);
 
  digitalWrite(g, HIGH);
 
}
 
 
 
void six()  //定义数字6时各阳极针脚的开关
 
{
 
  digitalWrite(a, HIGH);
 
  digitalWrite(b, LOW);
 
  digitalWrite(c, HIGH);
 
  digitalWrite(d, HIGH);
 
  digitalWrite(e, HIGH);
 
  digitalWrite(f, HIGH);
 
  digitalWrite(g, HIGH);
 
}
 
 
 
void seven()  //定义数字7时各阳极针脚的开关
 
{
 
  digitalWrite(a, HIGH);
 
  digitalWrite(b, HIGH);
 
  digitalWrite(c, HIGH);
 
  digitalWrite(d, LOW);
 
  digitalWrite(e, LOW);
 
  digitalWrite(f, LOW);
 
  digitalWrite(g, LOW);
 
}
 
 
 
void eight()  //定义数字8时各阳极针脚的开关
 
{
 
  digitalWrite(a, HIGH);
 
  digitalWrite(b, HIGH);
 
  digitalWrite(c, HIGH);
 
  digitalWrite(d, HIGH);
 
  digitalWrite(e, HIGH);
 
  digitalWrite(f, HIGH);
 
  digitalWrite(g, HIGH);
 
}
 
 
 
void nine()  //定义数字9时各阳极针脚的开关
 
{
 
  digitalWrite(a, HIGH);
 
  digitalWrite(b, HIGH);
 
  digitalWrite(c, HIGH);
 
  digitalWrite(d, HIGH);
 
  digitalWrite(e, LOW);
 
  digitalWrite(f, HIGH);
 
  digitalWrite(g, HIGH);
 
}
 
 
 
void dpoint() //点亮小数点
 
{
 
  digitalWrite(p, HIGH);
 
}
 
 
 
 
 
</source>
 
  
 
==调试==
 
==调试==

2014年10月29日 (三) 04:42的最新版本

Language English

目的

本教程将在上一课的基础上让大家了解四位数码管的动态显示,用一个电位器来控制显示数字

设备

原理图

第二十二课-Microduino四位数码管动态显示原理图.jpg

引脚表

Microduino引脚 数码管引脚
D2 A(11)
D3 B(7)
D4 C(4)
D5 D(2)
D6 E(1)
D7 F(10)
D8 G(5)
D9 Dp(3)
D13 DIG1(12)
D12 DIG2(9)
D11 DIG3(8)
D10 DIG4(6)


程序

MicroduinoFourDigitalDynamicDisplay

调试

步骤一:把代码复制到IDE中,编译

步骤二:电路连接,我们用两位共阳数码管电路图照片如下:

第二十二课-Microduino四位数码管动态显示连接图1.jpg
第二十二课-Microduino四位数码管动态显示连接图2.jpg

步骤三:运行代码

步骤四:旋转电位器看数码管显示

结果

数码管会显示从0~1023之间的数字,电位器用来控制大小

视频

http://v.youku.com/v_show/id_XNjgwMzc0MjQ4.html