51单片机 c语言 按键计数 用两位的数码管实现计数的显示
时间: 2024-05-10 13:19:34 浏览: 122
51单片机源码程序-多位数按键加减(不闪烁)数码管显示.zip
以下是基于51单片机和C语言的按键计数程序,同时使用位数码管显示计数结果:
```c
#include <reg52.h>
sbit Key = P3^2;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
unsigned int Count = 0;
unsigned char DisplayBuffer[2] = {0, 0};
void Delay(unsigned int i) // 延迟函数
{
while(i--);
}
void WriteMax7219(unsigned char address, unsigned char dat) // 向数码管写入数据
{
LSC = 0;
for(int i = 0; i < 8; i++)
{
if(i == 0)
LSA = 1;
else if(i == 1)
LSB = 1;
else if(i == 2)
LSC = 1;
else
{
P1 = ((address << 8) + dat) >> (i - 3);
Delay(1);
P3 = 0x01;
Delay(1);
P3 = 0x00;
}
}
}
void InitializeMax7219() // 初始化数码管
{
WriteMax7219(0x09, 0x00); // 译码方式:BCD码
WriteMax7219(0x0a, 0x03); // 亮度
WriteMax7219(0x0b, 0x07); // 扫描界限
WriteMax7219(0x0c, 0x01); // 关闭掉电模式
WriteMax7219(0x0f, 0x00); // 显示测试:正常显示
}
void DisplayCount() // 显示计数结果
{
DisplayBuffer[0] = Count % 10;
DisplayBuffer[1] = Count / 10;
WriteMax7219(1, DisplayBuffer[0]);
WriteMax7219(2, DisplayBuffer[1]);
}
void main()
{
InitializeMax7219(); // 初始化数码管
while(1)
{
if(Key == 0) // 按键检测
{
Delay(1000); // 延时去抖
if(Key == 0)
{
Count++; // 计数器加1
DisplayCount(); // 显示计数结果
Delay(1000); // 延时去抖
while(Key == 0);
}
}
}
}
```
本程序使用 `P3^2` 作为按键输入,使用 `P2^2~P2^4` 控制数码管位选,使用 `P1` 控制数码管数据,使用 `P3^0` 控制数码管时钟。本程序使用数码管芯片 MAX7219 实现驱动,具体的 MAX7219 驱动原理请参考相关文献。
在主循环中,程序会不断检测按键是否按下,如果按下则计数器加1,并显示计数结果。需要注意的是,有时按键可能会出现抖动,因此程序中使用了一个简单的延时去抖算法来解决这个问题。
最后,本程序实现的是一个简单的计数器,如果需要实现更多功能,例如清零、加减、多位数码管显示等,可以在本程序的基础上进行扩展。
阅读全文