【Proteus仿真】Arduino UNO按键控制数码管闪烁增/减显示

【Proteus仿真】Arduino UNO按键控制数码管闪烁增/减显示


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

仿真说明

  • 导出Hex文件方法
    在这里插入图片描述

导出的Hex文件在项目文件夹下 .

  • 加载文件
    在这里插入图片描述
  • 加载带BootLoader字符的Hex文件
    在这里插入图片描述

示例代码

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
125
126
127
//按键控制数码管闪烁增/减显示
//说明:通过按键加/减数码管所显示的数字,调节过程中数码管闪烁显示
//确定后恢复正常显示,按下取消时将回复到调节之前的值

#define k1\_down() (digitalRead(14) == 0) //加
#define k2\_down() (digitalRead(15) == 0) //减
#define k3\_down() (digitalRead(16) == 0) //确定
#define k4\_down() (digitalRead(17) == 0) //取消

const uint8\_t CA_SEGCODE[] = //0~9共阳数码管段码表
{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
uint16\_t count = 2022; //显示初始值
uint16\_t temp; //临时变量,用于存储按取消键前的已确定的值
uint8\_t array[] = {0, 0, 0, 0}; //保存数位分解结果的数组
uint8\_t adjust = 0; //标识当前是否处理调节状态
uint8\_t pre_key = 0xff; //保存上次按键状态
uint8\_t i, j, t; //定义变量

void setup()
{
DDRD = 0XFF; PORTD = 0XFF; //数码管段码端口配置
DDRB = 0XFF; PORTB = 0XFF; //数码管位码端口配置
DDRC = 0X00; PORTC = 0XFF; //按钮输入端口端口设为内部上拉
}

void loop()
{
for (t = 0; t < 35; t++) //正常刷新显示
{
INT\_TO\_4Digit(count); //数为分解
for (i = 0; i < 4; i++) //4位数码管扫描刷新显示
{
PORTD = 0XFF; //先暂时关闭段
PORTB = 1 << i; //输出位码
PORTD = CA_SEGCODE[array[i]]; //发送段码
delay(2); //延时
}
key\_handle(); //处理按键
}
if (adjust) //如果处于调节状态,脱离了扫描刷新,数码管开始闪烁
{
PORTD = 0XFF; //关闭所有数码管
for (t = 0; t < 15; t++) //在此循环中保持按键响应
{
delay(10); //延时
key\_handle(); //处理按键
}
}
}

//数位分解函数
//使用循环减法分解的速度优于使用/与%分解
void INT\_TO\_4Digit(uint16\_t n)
{
array[0] = 0;
while (n >= 1000)
{
array[0]++;
n -= 1000;
}
array[1] = 0;
while (n >= 100)
{
array[1]++;
n -= 100;
}
array[2] = 0;
while (n >= 10)
{
array[2]++;
n -= 10;
}
array[3] = n;
}

void key\_handle() //按键处理函数
{
if (pre_key == PINC) return; //按键状态未改变时退出
pre_key = PINC; //保存当前新的按键状态
//增按键
if (k1\_down()) //按键1按下
{
delay(10);
if (k1\_down())
{
if (temp == 0) temp = count; //备份temp,以便按下取消时还原
count++; //递增
adjust = 1; //进入调节状态
}
}
//减按键
else if (k2\_down())
{
delay(10);
if (k2\_down())
{
if (temp == 0) temp = count;
count--; //递减
adjust = 1;
}
}
//确定按键
else if (k3\_down())
{
delay(10);
if (k3\_down())
{
adjust = 0;
temp = 0;
}
}
//取消按键
else if (k4\_down())
{
delay(10);
if (k4\_down())
{
if (temp)
{
count = temp; //还原count
}
temp = 0; //temp清零
adjust = 0;
}
}
}


仿真资源和程序源码

本示例基于Proteus8.12平台。

1
2
3
链接:https://pan.baidu.com/s/1mQB5-MK1b\_Dj1WiL7YB93Q 
提取码:yh59


时间,从不曾给予我们毫无顾忌的任性,生活,也从不曾带给我们满是绝望的恐惧,回忆,更是从不曾留给我们颓废茫然的理由。