51单片机矩阵按键按一个显示秒表(51单片机矩阵按键扫描程序)

简介

51单片机是一种常用的微控制器,具有体积小、功耗低、成本低等优势,被广泛应用于各种电子产品中。矩阵按键是一种常见的按键形式,可以由多个按键组成,灵活性高,操作简单方便。秒表是一种计时工具,可以精确地计算时间,被广泛应用于各种场合。本文将介绍如何使用51单片机和矩阵按键按一个显示秒表。

电路设计

电路使用89S52单片机作为控制芯片,使用4x4矩阵按键作为输入设备,使用数码管作为输出设备。具体接法如下:

  • 矩阵按键的行引脚接在P0.0-P0.3上,列引脚接在P2.0-P2.3上。
  • 数码管的8个引脚分别接在P1.0-P1.7上。

电路原理图如下图所示:

51单片机矩阵按键按一个显示秒表(51单片机矩阵按键扫描程序)

程序设计

程序主要分为两个部分,分别是按键扫描和秒表计时。

按键扫描的过程如下:

  1. 初始化矩阵按键的行引脚为高电平,并将列引脚设置为输入状态。
  2. 轮流将每一列设为低电平,并读取每一行的状态,如果有按键按下,就返回按键的键值。
  3. 如果没有按键按下,就返回0。

秒表计时的过程如下:

  1. 初始化秒表计数器为0。
  2. 每1ms执行一次中断服务程序,并将秒表计数器加1。
  3. 每隔1s输出一次秒表计数器的值。
  4. 如果检测到按键按下,就暂停或重置秒表计数器。

程序代码如下:

```c
#include

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define LED P1

BYTE KeyScan();
void Delay(WORD n);
void Display(WORD num);

BYTE code smgduan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, // 0-7
0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71, // 8-15
0x00, // 熄灭
};

volatile WORD time_count = 0; // 秒表计数器,加volatile防止编译器优化

void main()
{
BYTE key_value = 0; // 按键值
BYTE press_flag = 0; // 按键按下标志
BYTE pause_flag = 0; // 秒表暂停标志
BYTE reset_flag = 0; // 秒表复位标志
BYTE i;

while(1)
{
key_value = KeyScan(); // 按键扫描
if(key_value) // 如果有按键按下
{
if(key_value == 1) // 如果是第一个按键
{
if(press_flag) // 如果已经按下,则停止计时
{
pause_flag = 1;
press_flag = 0;
}
else // 如果没有按下,则开始计时
{
pause_flag = 0;
press_flag = 1;
}
}
else if(key_value == 2) // 如果是第二个按键
{
reset_flag = 1;
}
}

if(!pause_flag) // 如果秒表没有暂停,则计数器加1
{
time_count++;
if(time_count == 1000) // 如果计数器达到1000,则输出时间并清零计数器
{
Display(time_count);
time_count = 0;
}
}

if(reset_flag) // 如果秒表复位标志为1,则清零计数器并输出0
{
time_count = 0;
Display(time_count);
reset_flag = 0;
}
}
}

BYTE KeyScan() // 按键扫描函数
{
BYTE i, j;
static BYTE key_value = 0;
static BYTE key_state = 0;

for(i = 0; i < 4; i++) // 轮流将每一列设为低电平 { P2 = 0x0f ^ (0x01 << i); // 第i列为低电平 for(j = 0; j < 4; j++) // 读取每一行的状态 { if(!(P0 & (0x01 << j))) // 如果第j行为低电平 { if(key_state == 0) // 如果按键没有被按下 { key_state = 1; // 标记按键被按下 key_value = i * 4 + j + 1; // 计算对应的键值 return key_value; // 返回键值 } } } } key_state = 0; // 没有按键被按下,标记清零 return 0; // 返回0表示没有按键被按下}void Display(WORD num) // 数码管显示函数{ WORD i; BYTE code table[] = {1000, 100, 10, 1}; // 数码管位权值表 for(i = 0; i < 4; i++) // 分解每一位数字并显示 { LED = smgduan[num / table[i]]; // 显示数字 Delay(5); // 稍作延时 LED = 0x00; // 熄灭数码管 num %= table[i]; // 取下一位数字 }}void Delay(WORD n) // 延时函数{ WORD i; while(n--) { i = 5000; while(i--); }}```

结论

通过以上的电路设计和程序设计,我们可以实现使用51单片机和矩阵按键按一个显示秒表的功能。电路和程序比较简单,适合初学者学习和仿制,也可以根据需要进行扩展和优化。秒表的精度和稳定性取决于晶振和程序实现的质量,建议使用高精度的晶振和合理的算法来提高稳定性和精度。

本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/mcurp4.html

郑重声明:

本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。

我们不承担任何技术及版权问题,且不对任何资源负法律责任。

如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。

如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!

(0)
上一篇 2023年4月26日 上午3:07
下一篇 2023年4月26日 上午3:07

猜你喜欢