STC89C51 单片机按键控制计数器,实现数码管显示
基于 STC89C51 单片机的按键控制计数器,实现数码管显示
本文将介绍如何使用 STC89C51 单片机实现一个简单的计数器,通过按键控制计数加减,计数值在数码管上显示。
硬件连接:
- 将 STC89C51 单片机的 GPIO 口连接到按键和数码管。
代码实现:
#include <reg52.h>
sbit button1 = P1^0; // 1号按键,连接到 P1 口的第 0 位
sbit button2 = P1^1; // 2号按键,连接到 P1 口的第 1 位
sbit digit1 = P2^0; // 数码管第 1 位,连接到 P2 口的第 0 位
sbit digit2 = P2^1; // 数码管第 2 位,连接到 P2 口的第 1 位
sbit digit3 = P2^2; // 数码管第 3 位,连接到 P2 口的第 2 位
sbit digit4 = P2^3; // 数码管第 4 位,连接到 P2 口的第 3 位
unsigned char count = 0; // 计数值
// 数码管段码表,根据需要自行定义
unsigned char digitCode[10] = {
0xFC, // 数字 0
0x60, // 数字 1
0xDA, // 数字 2
0xF2, // 数字 3
0x66, // 数字 4
0xB6, // 数字 5
0xBE, // 数字 6
0xE0, // 数字 7
0xFE, // 数字 8
0xF6 // 数字 9
};
// 延时函数,根据需要自行定义
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 110; j++) {
// 空循环,延时约 1ms,具体值根据实际情况调整
}
}
}
// 数码管显示函数
void display(unsigned char num) {
digit1 = 1; // 关闭所有位选
digit2 = 1;
digit3 = 1;
digit4 = 1;
switch (num) {
case 1:
digit1 = 0; // 打开第 1 位
P0 = digitCode[count % 10]; // 在第 1 位显示个位数
break;
case 2:
digit2 = 0; // 打开第 2 位
P0 = digitCode[(count / 10) % 10]; // 在第 2 位显示十位数
break;
case 3:
digit3 = 0; // 打开第 3 位
P0 = digitCode[(count / 100) % 10]; // 在第 3 位显示百位数
break;
case 4:
digit4 = 0; // 打开第 4 位
P0 = digitCode[count / 1000]; // 在第 4 位显示千位数
break;
default:
break;
}
d delay(1); // 显示一段时间,具体值根据实际情况调整
}
// 初始化函数
void init() {
button1 = 1; // 设置按键引脚为输入
button2 = 1;
digit1 = 0; // 设置数码管引脚为输出
digit2 = 0;
digit3 = 0;
digit4 = 0;
P0 = 0xFF; // 关闭所有段选
}
void main() {
init(); // 初始化
while (1) {
if (button1 == 0) { // 检测 1 号按键是否按下
delay(10); // 延时去抖动,具体值根据实际情况调整
if (button1 == 0) { // 再次检测 1 号按键是否按下
if (count < 9) { // 计数值小于 9 时才加 1
count++;
display(1); // 更新数码管显示
}
while (button1 == 0); // 等待 1 号按键释放
}
}
if (button2 == 0) { // 检测 2 号按键是否按下
delay(10); // 延时去抖动,具体值根据实际情况调整
if (button2 == 0) { // 再次检测 2 号按键是否按下
if (count > 0) { // 计数值大于 0 时才减 1
count--;
display(1); // 更新数码管显示
}
while (button2 == 0); // 等待 2 号按键释放
}
}
}
}
代码说明:
- 代码中定义了两个按键引脚
button1和button2,以及四个数码管位选引脚digit1到digit4。 count变量用于存储当前的计数值。digitCode数组保存了数码管的段码,用于控制数码管显示不同的数字。delay函数用于延时,避免按键抖动。display函数用于控制数码管显示计数值。init函数用于初始化硬件引脚。main函数中使用循环检测按键状态,根据按键状态更新计数值,并调用display函数更新数码管显示。
注意:
- 以上代码仅供参考,需要根据您的实际硬件连接进行修改。
- 延时时间、按键去抖动时间等参数需要根据实际情况调整。
拓展:
- 可以添加更多功能,例如:
- 设置计数值上限和下限
- 实现清零功能
- 使用其他类型的显示器
- 添加更多按键控制功能
- 可以使用更高级的代码结构和算法,提高代码效率和可读性。
希望以上内容对您有所帮助!
关键词: STC89C51, 单片机, 按键, 计数器, 数码管, 代码示例, 编程
原文地址: https://www.cveoy.top/t/topic/bR6U 著作权归作者所有。请勿转载和采集!