51单片机用一个按键实现一个数码管数字从F到0递减的变化程序
时间: 2023-08-13 15:06:24 浏览: 137
以下是用51单片机实现一个按键控制数码管数字从F到0递减的程序:
```c
#include <reg51.h>
sbit KEY = P1^0; // 定义按键输入端口
sbit LATCH = P2^2; // 定义锁存器端口
sbit SRCLK = P2^0; // 定义移位寄存器时钟端口
sbit SER = P2^1; // 定义移位寄存器数据输入端口
unsigned char code digit[16] = { // 数码管显示的数字编码
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x77, // A
0x7c, // B
0x39, // C
0x5e, // D
0x79, // E
0x71 // F
};
void delay(unsigned int t) { // 延时函数
unsigned int i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 120; j++);
}
void shiftOut(unsigned char dat) { // 移位输出函数
unsigned char i;
for(i = 0; i < 8; i++) {
SRCLK = 0;
SER = dat & 0x80;
dat <<= 1;
SRCLK = 1;
}
}
void writeDigit(unsigned char dat, unsigned char pos) { // 显示数字函数
LATCH = 0;
shiftOut(digit[dat]);
shiftOut(1 << pos);
LATCH = 1;
}
void main() {
unsigned char num = 0x0f; // 初始数字为 F
unsigned char flag = 1; // 标志位,用于判断是否需要更新显示
while(1) {
if(KEY == 0) { // 检测按键是否按下
delay(5); // 延时去抖动
if(KEY == 0) { // 再次检测按键是否按下
num--; // 数字递减
if(num > 0x0f) num = 0x0f; // 数字不能小于 0
flag = 1; // 更新显示
}
}
if(flag) { // 如果需要更新显示
writeDigit(num, 3); // 显示数字
flag = 0; // 清除标志位
}
delay(10); // 延时一段时间
}
}
```
程序中使用了位移寄存器和锁存器来控制数码管的显示。按键按下后,数码管显示的数字递减,直到变为 0。程序还添加了去抖动处理,使按键操作更加稳定。