51单片机使用P1口驱动3位7段共阴型数码管,使用P2.0-P2.2口选择用于显示的数码管,外部中断引脚INT0(P3.2)上连接了按键S1,用于中断计数,外部引脚P3.5(T1)上连接了按键S2,用于清零计数
时间: 2023-05-26 08:07:38 浏览: 328
方案如下:
1. 设置P1口为输出口,用于驱动3位7段共阴型数码管,P2.0-P2.2口也设置为输出口,用于选择用于显示的数码管。
2. 设置外部中断INT0引脚(P3.2)为上升沿触发,连接按键S1用于中断计数。
3. 设置外部引脚P3.5(T1)为输入口,连接按键S2,用于清零计数。
4. 在中断服务程序中,每次按下按键S1,计数器加1,同时根据当前选择的数码管,在对应的数码管上显示计数器值。
5. 在主程序中,不断扫描按键S2的状态,如果按下则清零计数器。
代码实现如下(注:本例使用的是STC89C52单片机,其他单片机稍作修改即可):
```c
#include <reg52.h>
// 数码管编码表
unsigned char code LED_CODE[10] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
// 计数器
unsigned int counter = 0;
// 显示数码管的位数
unsigned char LED_POS[3] = {0xFE, 0xFD, 0xFB};
// 当前选择的数码管(0-2)
unsigned char LED_SEL = 0;
void delay(unsigned int t)
{
while(t--);
}
// 中断服务程序,用于计数
void INT0_ISR() interrupt 0
{
counter++;
// 在当前选择的数码管上显示计数器值
P1 = LED_CODE[counter % 10];
P2 = LED_POS[LED_SEL];
// 切换选择的数码管
LED_SEL = (LED_SEL + 1) % 3;
}
int main()
{
// 设置P1口为输出口,P2.0-P2.2口为输出口
P1 = 0x00;
P2 = 0x00;
P3 = 0xFF;
SP = 0x00; // 初始化栈指针
// 设置外部中断INT0引脚为上升沿触发
IT0 = 1;
EX0 = 1;
EA = 1;
while(1)
{
// 清零计数器
if(!P3_5){
counter = 0;
}
// 循环扫描数码管,实现动态扫描
P1 = LED_CODE[counter % 10];
P2 = LED_POS[LED_SEL];
// 延时,控制刷新频率
delay(1000);
}
return 0;
}
```
阅读全文