c语言数码管0000到180,求助;51单片机独立按键长按加减键四位数码管就显示0000...
时间: 2023-07-31 16:11:00 浏览: 105
53-2按键加减操作数码管显示.rar 51单片机基础例程
下面是一个简单的C语言程序,使用了51单片机的定时器和外部中断来实现独立按键长按加减的功能,同时通过数码管显示当前的计数值:
```C
#include <reg52.h>
#define DIGIT_PORT P0 // 数码管段选控制端口
#define KEY_PORT P1 // 按键输入端口
#define KEY_ADD 0x01 // 加键输入端口
#define KEY_SUB 0x02 // 减键输入端口
unsigned char digit_tbl[10] = { // 数码管显示表
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
unsigned int count = 0; // 计数器变量
unsigned char cnt_h, cnt_l; // 计数器高低位
void delay_ms(unsigned int t) { // 延时函数
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
void display(unsigned char d1, unsigned char d2,
unsigned char d3, unsigned char d4) { // 数码管显示函数
DIGIT_PORT = digit_tbl[d1];
P2 = 0x01; delay_ms(1);
DIGIT_PORT = digit_tbl[d2];
P2 = 0x02; delay_ms(1);
DIGIT_PORT = digit_tbl[d3];
P2 = 0x04; delay_ms(1);
DIGIT_PORT = digit_tbl[d4];
P2 = 0x08; delay_ms(1);
}
void timer0_isr() interrupt 1 { // 定时器中断服务程序
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
count++; // 计数器加1
cnt_h = count/100; // 计算高位数值
cnt_l = count%100; // 计算低位数值
}
void ext0_isr() interrupt 0 { // 外部中断0服务程序
unsigned char key = KEY_PORT & 0x03; // 读取按键状态
if (key == KEY_ADD) { // 加键按下
count++; // 计数器加1
cnt_h = count/100; // 计算高位数值
cnt_l = count%100; // 计算低位数值
}
else if (key == KEY_SUB) { // 减键按下
if (count > 0) // 计数器减1,但不能小于0
count--;
cnt_h = count/100; // 计算高位数值
cnt_l = count%100; // 计算低位数值
}
else { // 长按键退出
while ((KEY_PORT & 0x03) == 0x00); // 等待按键释放
}
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536-50000)/256; // 定时器初值,50ms中断一次
TL0 = (65536-50000)%256;
ET0 = 1; // 允许定时器0中断
EA = 1; // 全局中断允许
TR0 = 1; // 启动定时器0
EX0 = 1; // 外部中断0允许
IT0 = 1; // 外部中断0下降沿触发
while (1) {
display(cnt_h/10, cnt_h%10, cnt_l/10, cnt_l%10); // 显示计数值
}
}
```
在程序中,使用了一个计数器变量`count`来保存当前的计数值,通过外部中断0和定时器0的中断服务程序来实现独立按键长按加减的功能。当加键按下时,计数器加1,当减键按下时,计数器减1,但不能小于0。同时,通过数码管显示函数`display()`将计数值显示在四位数码管上,以便用户观察。
阅读全文