【Proteus仿真】Arduino UNO+按键控制2位数码管倒计时

【Proteus仿真】Arduino UNO+按键控制2位数码管倒计时


  • Proteus仿真
    在这里插入图片描述

数字引脚基本上都用完了。

程序源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/\* 
\* 按键控制2位数码管倒计时
\* Created: 周六 6月 25 2022
\* Processor: Arduino Uno
\* Compiler: Arduino AVR
\*/
int num=60; //定义倒计时数字
int count=0; //定义计数值
int start_key = 10; //开始按键
int pause_key = 11; //暂停按键
int reset_key = 12; //复位按键
//0-9对应的16进制数据
const uint8\_t CA_SEGCODE[] =
{ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//用数组指定2位8段数码管所连接的段引脚(或称段码引脚)
const uint8\_t ledPins_SEG[] = { 0,1,2, 3, 4, 5, 6, 7 };
//用数组指定2位8段数码管的位引脚(或称位码引脚)
const uint8\_t ledPins_DIG[] = {8,9};
//待显示到数码管的2个数字
const uint8\_t DATEx[] = {(uint8\_t)num/10,(uint8\_t)num%10};


int start_flag=0; //是否开启倒计时标志位
int reset_flag=0; //复位倒计时数标志位
//-----------------------------------------------------------------
// 初始配置
//-----------------------------------------------------------------
uint8\_t i;
void setup()
{

for(i=0;i<10;i++) //设置各引脚模式
pinMode(ledPins_SEG[i],OUTPUT);
for(i=0;i<2;i++)
pinMode(ledPins_DIG[i],OUTPUT);
for(i=10;i<13;i++)
{
pinMode(i,INPUT_PULLUP);
}
}
//-----------------------------------------------------------------
// 主循环
//-----------------------------------------------------------------
void loop()
{
const uint8\_t DATEx[] = {num/10,num%10}; //待显示的两位数字

for (i = 0; i < 3; i++) //循环扫描数码管
{
DIG\_OUTPUT(i); //操作位码
SEG\_OUTPUT(CA_SEGCODE[DATEx[i]]); //操作段码
delay(1);
count++; //每延时1ms,count+1
key\_scan(); //按键扫描子函数

if(start_flag==1 && count>300) //当开启了倒计时,每300ms倒计时-1(本来是1000ms,这里为了演示效果调到了300)
{
num--; //倒计时数-1
count=0; //计数归零
}

if(reset_flag==1) //当复位标志位为1
{
num=60; //倒计时数设置为60
reset_flag=0; //复位标志位归0
start_flag=0; //开始倒计时标志位归0
}

if(num<0) //当倒计时完毕,倒计时数重新设置为60
num=60;
}




}
//-----------------------------------------------------------------
// 段码输出函数
//-----------------------------------------------------------------
void SEG\_OUTPUT(uint8\_t x) {
for (uint8\_t j = 0; j < 8; j++) { //发送段码
if((x>>j & 0x01) != 0x00)
digitalWrite(ledPins_SEG[j],HIGH);
else
digitalWrite(ledPins_SEG[j],LOW);
}
}
//-----------------------------------------------------------------
// 位码输出函数
//-----------------------------------------------------------------
void DIG\_OUTPUT(uint8\_t dx) {
for (uint8\_t j = 0; j < 2; j++) { //发送位码(2位)
if(dx != j)
digitalWrite(ledPins_DIG[j],LOW);
else
digitalWrite(ledPins_DIG[j],HIGH);
}
}

void key\_scan() //按键扫描子函数
{
if(digitalRead(start_key)==LOW) //当启动倒计时按键按下
{
delay(10); //消抖延时
if(digitalRead(start_key)==LOW)
start_flag=1; //开始倒计时标志位置位1。以下操作暂停按键、复位按键原理类似
}

if(digitalRead(pause_key)==LOW)
{
delay(10);
if(digitalRead(pause_key)==LOW)
start_flag=0;
}

if(digitalRead(reset_key)==LOW)
{
delay(10);
if(digitalRead(reset_key)==LOW)
reset_flag=1;
}
}


程序源码和仿真资源

本实验基于Proteus8.12平台。

1
2
3
链接:https://pan.baidu.com/s/1\_2EPGTZX11GYSqmRAkF5Ew 
提取码:thy3


黑发不知勤学早,白首方悔读书迟。–颜真卿《劝学诗》