74LS139 0-9按键计数器
时间: 2023-05-24 13:04:43 浏览: 106
74LS139是一款二选一多路复用器,一般用于选通二个输入信号之一并输入到输出端,也可用于实现简单的逻辑运算。
要实现0-9按键计数器,需要将9个按键分别连接到74LS139的输入端口(A0~A7),将74LS139的输出端口(Y0~Y3)连接到4个JK触发器(如74LS76),将JK触发器的输出端口连接到数码管显示模块。
当按下任意一个按键,相应的输入端口会被拉低,74LS139会选通对应的输出端口,从而使相应的JK触发器触发并计数。当计数器达到9时,重新计数。
代码实现:
由于74LS139的输入端口具有反向特性,需要将按钮按下时的输入信号反向处理(例如通过反向拍扫或使用反向器)。
int btn [] = {5, 6, 7, 8, 9, 10, 11, 12, 13}; // 9个按键引脚
int out [] = {2, 3, 4, A0}; // 74LS139的Y0~Y3引脚
int jk [] = {A1, A2, A3, A4}; // JK触发器的J、K引脚
int num [4] = {0, 0, 0 , 0}; // 计数器
void setup () {
for (int i = 0; i < 9; i ++) {
pinMode (btn [i], INPUT);
}
for (int i = 0; i < 4; i ++) {
pinMode (out [i], OUTPUT);
digitalWrite (out [i], HIGH);
pinMode (jk [i], OUTPUT);
}
}
void loop () {
for (int i = 0; i < 9; i ++) {
if (digitalRead (btn [i]) == LOW) { // 如果发现按键按下
digitalWrite (out [i / 2], ~i & 1); // 设置74LS139的A0和A1引脚
digitalWrite (out [i / 2 + 2], i & 1); // 设置74LS139的A2和A3引脚
digitalWrite (jk [i / 2], LOW); // 清零JK触发器的J、K
digitalWrite (jk [i / 2], HIGH); // 设置JK触发器的J、K
num [i / 2] ++; // 计数器加1
if (num [i / 2] > 9) { // 超过9回到0
num [i / 2] = 0;
}
}
}
for (int i = 0; i < 4; i ++) {
digitalWrite (out [i], HIGH); // 禁用74LS139的输入
digitalWrite (jk [i], HIGH); // 禁用JK触发器的J、K
}
display (); // 显示计数器的值
}
void display () {
byte seg [] = { // 数码管显示的段选信号
B11000000, B11111001, B10100100, B10110000,
B10011001, B10010010, B10000010, B11111000,
B10000000, B10010000
};
for (int i = 0; i < 4; i ++) {
digitalWrite (jk [i], LOW); // 清零JK触发器的J、K
digitalWrite (jk [i], HIGH); // 设置JK触发器的J、K
digitalWrite (out [i], HIGH); // 禁用74LS139的输入
digitalWrite (out [i], LOW); // 选择对应的数码管
digitalWrite (A5, LOW); // 共阳极数码管选择
digitalWrite (A6, HIGH);
digitalWrite (A7, HIGH); // 高电平清零计数器
for (int j = 0; j < 10; j ++) { // 通过循环切换段选信号
digitalWrite (A0, ~j & 1);
digitalWrite (A1, j & 1);
PORTD = seg [num [i]]; // 设置端口D的输出
delay (50); // 延迟以供数码管刷新
}
digitalWrite (A0, LOW); // 禁止74LS139输出
digitalWrite (A1, LOW);
digitalWrite (out [i], HIGH); // 禁用数码管
}
}
以上代码仅供参考,实际应用中可能需要根据具体的硬件配置进行修改。
阅读全文