基于c51写一个数码管中断系统
时间: 2023-05-23 13:06:54 浏览: 248
A:以下是基于c51写的数码管中断系统代码示例:
```
#include <reg52.h> //头文件
#define KeyPort P3 //定义按键端口
#define DispPort P2 //定义数码管段选端口
#define KEY P3 //定义按键输入端口
#define DISP P2 //定义数码管段选端口
#define uchar unsigned char //定义无符号字符型
#define uint unsigned int //定义无符号整型
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
typedef unsigned long uint32_t;
uchar code Array[] = { // 数码管位选值
0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe
};
uchar code Display[] = { // 数码管数字值
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar KeySta[4] = {0xFF, 0xFF, 0xFF, 0xFF}; //按键状态数组
uchar flag; //按键按下标志
uchar idata Timer0Cnt; //定时器0计数变量
void Init_Led() { //数码管初始化
TMOD = 0x01; //设置定时器0为模式1
TH0 = 0xFC; //设置定时器0重装值
TL0 = 0x67;
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
}
void Key_Driver() { //键盘读取函数
uchar i;
static uchar backup[4] = {0xFF, 0xFF, 0xFF, 0xFF};
for (i = 0; i < 4; i++) {
backup[i] = (backup[i] << 1) | (KeyPort & (1 << i) ? 0 : 1); //从P3.0口开始扫描,每个按键读取8次,消抖
if (backup[i] == 0x00) {
KeySta[i] = 0; //按键按下
}
else if (backup[i] == 0xFF) {
KeySta[i] = 1; //按键松开
}
}
}
void T0_Timer() interrupt 1 { //定时器0中断函数
static uchar i = 0;
TH0 = 0xFC;
TL0 = 0x67; //重新赋初值
DispPort = 0xFF;
i = (++i) % 4;
DispPort = Display[flag];
DispPort = Array[i]; //数字依次在各个数码管上闪烁
}
void main() {
uint32_t cnt = 0;
uint8_t disp_val = 0;
Init_Led(); //初始化数码管
KeySta[0] = 1; //按键初始化
KeySta[1] = 1;
KeySta[2] = 1;
KeySta[3] = 1;
while (1) {
Key_Driver();
if (!KeySta[0]) {
flag++; //按键1按下
flag %= 10;
KeySta[0] = 1;
}
else if (!KeySta[1]) {
flag = 0; //按键2按下
KeySta[1] = 1;
}
else if (!KeySta[2]) {
flag--; //按键3按下
if (flag == -1)
flag = 9;
KeySta[2] = 1;
}
else if (!KeySta[3]) {
flag = disp_val; //按键4按下
KeySta[3] = 1;
}
if (Timer0Cnt++ >= 20) { //100ms
Timer0Cnt = 0;
DISP = Display[disp_val];
++disp_val;
disp_val %= 10;
}
}
}
```
在这里,我们使用了定时器0中断来刷新数码管,使用P3口读取按键状态,并根据按键状态控制数码管的数字滚动,闪烁等等。希望能帮到你。
阅读全文