基于 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 号按键释放
      }
    }
  }
}

代码说明:

  • 代码中定义了两个按键引脚 button1button2,以及四个数码管位选引脚 digit1digit4
  • count 变量用于存储当前的计数值。
  • digitCode 数组保存了数码管的段码,用于控制数码管显示不同的数字。
  • delay 函数用于延时,避免按键抖动。
  • display 函数用于控制数码管显示计数值。
  • init 函数用于初始化硬件引脚。
  • main 函数中使用循环检测按键状态,根据按键状态更新计数值,并调用 display 函数更新数码管显示。

注意:

  • 以上代码仅供参考,需要根据您的实际硬件连接进行修改。
  • 延时时间、按键去抖动时间等参数需要根据实际情况调整。

拓展:

  • 可以添加更多功能,例如:
    • 设置计数值上限和下限
    • 实现清零功能
    • 使用其他类型的显示器
    • 添加更多按键控制功能
  • 可以使用更高级的代码结构和算法,提高代码效率和可读性。

希望以上内容对您有所帮助!

关键词: STC89C51, 单片机, 按键, 计数器, 数码管, 代码示例, 编程

STC89C51 单片机按键控制计数器,实现数码管显示

原文地址: https://www.cveoy.top/t/topic/bR6U 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录