通过按键中断方式控制任意两个相邻数码管显示数值,实现K3按键加数,k4减数显示效果,数码管显示数据范围0-20范围,单片机上电初始化值为10。把代码写出来
时间: 2024-03-04 11:53:47 浏览: 56
好的,以下是一个基于Arduino的示例代码:
```
// 定义数码管显示引脚
int digitPins[] = {2, 3};
// 定义数码管段选引脚
int segmentPins[] = {4, 5, 6, 7, 8, 9, 10, 11};
// 定义K3和K4按键引脚
int k3Pin = 12;
int k4Pin = 13;
// 定义显示数字的范围
int minValue = 0;
int maxValue = 20;
// 初始化显示数字
int currentValue = 10;
void setup() {
// 设置数码管引脚为输出模式
for (int i = 0; i < 2; i++) {
pinMode(digitPins[i], OUTPUT);
}
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
// 设置K3和K4按键引脚为输入模式
pinMode(k3Pin, INPUT_PULLUP);
pinMode(k4Pin, INPUT_PULLUP);
// 注册外部中断
attachInterrupt(digitalPinToInterrupt(k3Pin), addValue, FALLING);
attachInterrupt(digitalPinToInterrupt(k4Pin), subValue, FALLING);
// 显示初始值
displayValue(currentValue);
}
void loop() {
// 循环处理
}
void addValue() {
// K3按键触发中断,将当前值加1
currentValue++;
if (currentValue > maxValue) {
currentValue = minValue;
}
// 显示新的值
displayValue(currentValue);
}
void subValue() {
// K4按键触发中断,将当前值减1
currentValue--;
if (currentValue < minValue) {
currentValue = maxValue;
}
// 显示新的值
displayValue(currentValue);
}
void displayValue(int value) {
// 显示数字
for (int i = 0; i < 2; i++) {
int digitValue = value % 10;
digitalWrite(digitPins[i], LOW);
for (int j = 0; j < 8; j++) {
digitalWrite(segmentPins[j], digitPatterns[digitValue][j]);
}
delay(2);
digitalWrite(digitPins[i], HIGH);
value /= 10;
}
}
// 数字段选模式
int digitPatterns[][8] = {
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0} // 9
};
```
代码实现了上述的功能,其中`addValue`和`subValue`函数是两个按键的中断处理函数,当K3按键被按下时,`addValue`函数会将当前值加1并更新数码管显示;当K4按键被按下时,`subValue`函数会将当前值减1并更新数码管显示。`displayValue`函数实现了数码管的显示功能,通过循环显示两个数码管,每次显示一个数字。代码中还包括了数码管的段选模式数组`digitPatterns`,用于实现数字到段选的转换。
阅读全文