帮我写一个程旭,单片机上电复位后共阳极数码管显示0,按键K1触发外部中断1实现数码管十进制循环计数(0-9循环计数),每当K1按下,数码管显示数码加1
时间: 2024-03-11 08:51:46 浏览: 89
好的,以下是一个简单的程序,可以实现您的要求:
```c
#include <reg52.h>
sbit K1 = P3^2; // 定义 K1 按键对应的引脚
void delay(unsigned int t)
{
while(t--);
}
void display(unsigned char num)
{
unsigned char code DisplayTable[] = { // 共阳极数码管显示表
0xC0, // 显示 0
0xF9, // 显示 1
0xA4, // 显示 2
0xB0, // 显示 3
0x99, // 显示 4
0x92, // 显示 5
0x82, // 显示 6
0xF8, // 显示 7
0x80, // 显示 8
0x90 // 显示 9
};
P2 = DisplayTable[num % 10]; // 显示个位数字
}
void main()
{
unsigned char num = 0; // 计数器初始值为 0
TMOD = 0x01; // 定时器 T0 工作在模式 1
TH0 = 0xFC; // 定时器 T0 定时 1ms
TL0 = 0x18;
TR0 = 1; // 启动定时器 T0
EX1 = 1; // 使能外部中断 1
IT1 = 1; // 外部中断 1 触发方式为下降沿触发
EA = 1; // 全局中断使能
while(1) {
display(num); // 显示当前数字
delay(1000); // 每隔 1s 显示一次
}
}
void Interrupt1() interrupt 2
{
num++; // 数字加 1
if(num == 10) { // 循环计数
num = 0;
}
}
```
程序的实现思路如下:
1. 在 `main()` 函数中,先初始化定时器 T0 和外部中断 1,然后进入一个死循环,每隔 1s 调用 `display()` 函数显示当前数字。
2. `display()` 函数根据参数 `num` 的值,在共阳极数码管的显示表中查找对应的值,并将其输出到 P2 引脚,从而实现数码管的显示。
3. 当按下 K1 按键时,会触发外部中断 1,进入 `Interrupt1()` 中断服务函数。在该函数中,将计数器 `num` 的值加 1,如果已经计数到 9,则从 0 开始循环计数。
需要注意的是,这个程序并没有实现上电复位后显示 0 的功能,如果需要实现这个功能,可以在程序开头添加一条语句 `P2 = 0xC0;`。
阅读全文