单片机上电复位后共阳极数码管显示0,按键K1触发外部中断1实现数码管十进制循环计数(0-9循环计数),每当K1按下,数码管显示数码加1。请写出程序。
时间: 2024-03-11 12:50:38 浏览: 106
单片机C语言程序设计 单只数码管循环显示0-9(有源码)
5星 · 资源好评率100%
好的,以下是基于STC89C52单片机的程序示例(使用定时器0和外部中断1):
```
#include <reg52.h>
sbit K1 = P3^2; // K1按键接在P3.2口
sbit D1 = P1^0; // 数码管第1段接在P1.0口
sbit D2 = P1^1; // 数码管第2段接在P1.1口
sbit D3 = P1^2; // 数码管第3段接在P1.2口
sbit D4 = P1^3; // 数码管第4段接在P1.3口
// 定义数码管0-9的显示段码
unsigned char code digit[10] = {
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90 // 9
};
unsigned char cnt = 0; // 数码管计数器
void Timer0_ISR() interrupt 1 // 定时器0中断服务程序
{
TH0 = 0xFC; // 重新设置定时器初值
TL0 = 0x67;
cnt++; // 数码管计数器加1
if (cnt > 9) {
cnt = 0; // 循环计数
}
// 更新数码管显示
D1 = digit[cnt] & 0x01;
D2 = digit[cnt] & 0x02;
D3 = digit[cnt] & 0x04;
D4 = digit[cnt] & 0x08;
}
void INT1_ISR() interrupt 2 // 外部中断1服务程序
{
if (K1 == 0) {
// 按键K1按下,触发计数
cnt++;
if (cnt > 9) {
cnt = 0; // 循环计数
}
// 更新数码管显示
D1 = digit[cnt] & 0x01;
D2 = digit[cnt] & 0x02;
D3 = digit[cnt] & 0x04;
D4 = digit[cnt] & 0x08;
}
}
void main()
{
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 设置定时器初值
TL0 = 0x67;
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
EX1 = 1; // 允许外部中断1
while (1) {
// 主程序中不需要执行任何操作
}
}
```
在这个程序中,我们使用定时器0实现数码管的循环计数,并通过外部中断1触发计数。在定时器0中断服务程序和外部中断1服务程序中,我们都更新了数码管的显示,以反映当前计数器的值。需要注意的是,由于定时器和外部中断都可能会同时触发中断服务程序,因此需要使用可重入函数来实现数码管的显示更新。
阅读全文