【Arduino】基于一位数码管制作数字骰子

实验现象
数码管快速在 0-9 之间循环跳动,当按下按键时,数码管定格在当前的数字上,持续0.2秒,后继续在0-9之间循环跳到。
理论学习
数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按 段数分为七段数数码管和八段数数码管,八段数数码管比七段数数码管多一个发光二极管单元(多一个小数点显示) 发光二极管单元连接方式分为共阳数码管和共阴数码管。共阳数码管是指将所有发光二极管的阳极连接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极 PWR 接到电源输入 PWR 上,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管则更好相反,阴极连接到一起形成了公共阴极,阳极是独立分开的。本实验使用的是共阳数码管。数码管和发光二极管一样,需要添加限流电阻,因为网上没有查到资料说明该数码管的击穿电压是多大。所以供给电源电压宁可小不可大,所以选择 220Ω 限流电阻,和 3.3V供电。
在这里插入图片描述
图1 八段数数码管
在这里插入图片描述
图2 八段数数码管原理图
实验准备
arduino主板-1
面包板-1
数据线-1
一位数码管-1
220Ω电阻-1
按键-1
按键帽-1(可省略)
跳线若干
连接电路
在这里插入图片描述
实验完整代码–>由于部分代码显示不完全,我只能分开写了

//设置控制各段的数字 IO 脚 
#define KEY 13
int a=7; 
int b=6; 
int c=5; 
int d=11; 
int e=10; 
int f=8; 
int g=9; 
int dp=4; 

int KEY_NUM = 0;  
 
void digital_0(void) 
{
    
     
unsigned char j; 
for(j=5;j<=11;j++) 
digitalWrite(j,LOW); 
digitalWrite(dp,HIGH); 
digitalWrite(g,HIGH); 
}  
//显示数字 1 
void digital_1(void) 
{
    
     
unsigned char j; 
digitalWrite(c,LOW);//给数字 5 引脚低电平,点亮 c 段
digitalWrite(b,LOW);//点亮 b 段
for(j=7;j<=11;j++)//熄灭其余段
digitalWrite(j,HIGH); 
digitalWrite(dp,HIGH);//熄灭小数点 DP 段
} 
//显示数字 2 
void digital_2(void) 
{
    
     
unsigned char j; 
digitalWrite(b,LOW); 
digitalWrite(a,LOW); 
for(j=9;j<=11;j++) 
digitalWrite(j,LOW); 
digitalWrite(dp,HIGH); 
digitalWrite(c,HIGH); 
digitalWrite(f,HIGH); 
} 
//显示数字 3 
void digital_3(void) 
{
    
     
unsigned char j; 
digitalWrite(g,LOW); 
digitalWrite(d,LOW); 
for(j=5;j<=7;j++) 
digitalWrite(j,LOW); 
digitalWrite(dp,HIGH); 
digitalWrite(f,HIGH); 
digitalWrite(e,HIGH); 
} 
//显示数字 4 
void digital_4(void) 
{
    
     
digitalWrite(c,LOW); 
digitalWrite(b,LOW); 
digitalWrite(f,LOW); 
digitalWrite(g,LOW); 
digitalWrite(dp,HIGH); 
digitalWrite(a,HIGH); 
digitalWrite(e,HIGH); 
digitalWrite(d,HIGH); 
} 
//显示数字 5 
void digital_5(void) 
{
    
     
unsigned char j; 
for(j=7;j<=9;j++) 
digitalWrite(j,LOW); 
digitalWrite(c,LOW); 
digitalWrite(d,LOW); 
digitalWrite(dp,HIGH); 
digitalWrite(b,HIGH); 
digitalWrite(e,HIGH); 
} 
//显示数字 6 
void digital_6(void) 
{
    
     
unsigned char j; 
for(j=7;j<=11;j++) 
digitalWrite(j,LOW); 
digitalWrite(c,LOW); 
digitalWrite(dp,HIGH); 
digitalWrite(b,HIGH); 
} 
//显示数字 7 
void digital_7(void) 
{
    
     
unsigned char j; 
for(j=5;j<=7;j++) 
digitalWrite(j,LOW); 
digitalWrite(dp,HIGH); 
for(j=8;j<=11;j++) 
digitalWrite(j,HIGH); 
} 
//显示数字 8 
void digital_8(void) 
{
    
     
unsigned char j; 
for(j=5;j<=11;j++) 
digitalWrite(j,LOW); 
digitalWrite(dp,HIGH); 
} 
//显示数字 9 
void digital_9(void) 
{
    
     
unsigned char j; 
for(j=5;j<=11;j++) 
digitalWrite(j,LOW); 
digitalWrite(dp,HIGH);
digitalWrite(e,HIGH); 
} 
void ScanKey()            //按键扫描程序
{
    
    
  KEY_NUM = 0;          //清空变量
  if(digitalRead(KEY) == LOW)     //有按键按下
  {
    
    
    delay(20);        //延时去抖动
    if(digitalRead(KEY) == LOW)   //有按键按下
    {
    
    
      KEY_NUM = 1;      //变量设置为1
      while(digitalRead(KEY) == LOW); //等待按键松手
    }
  }
}
void setup() 
{
    
     
int i;//定义变量
for(i=4;i<=11;i++) 
pinMode(i,OUTPUT);//设置 4~11 引脚为输出模式
pinMode(KEY,INPUT_PULLUP);    //定义KEY为带上拉输入引脚
} 
void loop() 
{
    
     
while(1) 
{
    
     
digital_0(); 
delay(50);
ScanKey();        
 if(KEY_NUM == 1)      
  {
    
       
    digital_0();
    delay(200);  
  }
digital_1(); 
delay(50);
ScanKey();        
 if(KEY_NUM == 1)      
  {
    
       
    digital_1();
    delay(200);  
  }
digital_2(); 
delay(50);
ScanKey();        
 if(KEY_NUM == 1)      
  {
    
       
    digital_2();
    delay(200);  
  }
digital_3(); 
delay(50);
ScanKey();        
 if(KEY_NUM == 1)      
  {
    
       
    digital_3();
    delay(200);  
  }
digital_4(); 
delay(50);
ScanKey();        
 if(KEY_NUM == 1)      
  {
    
       
    digital_4();
    delay(200);  
  }
digital_5(); 
delay(50);
ScanKey();        
 if(KEY_NUM == 1)      
  {
    
       
    digital_5();
    delay(200);  
  }
digital_6(); 
delay(50);
ScanKey();        
 if(KEY_NUM == 1)      
  {
    
       
    digital_6();
    delay(200);  
  }
digital_7(); 
delay(50);
ScanKey();        
 if(KEY_NUM == 1)      
  {
    
       
    digital_7();
    delay(200);  
  }
digital_8(); 
delay(50);
ScanKey();        
 if(KEY_NUM == 1)      
  {
    
       
    digital_8();
    delay(200);  
  }
digital_9(); 
delay(50);
ScanKey();        
 if(KEY_NUM == 1)      
  {
    
       
    digital_9();
    delay(200);  
  }
}
} 

根据这个原理,可以产生0-9随机数,在数码管中不断显示,按下按键,数码管停止跳动,持续一段时间,数码管继续跳动。

相关文章
【Arduino基础】一位数码管实验

【Arduino基础】按键控制LED灯亮灭实验

猜你喜欢

转载自blog.csdn.net/weixin_43319452/article/details/105262166