以单片机STC8952为主控芯片,利用按键、INTO和INT1实现计数功能,利用八段码实现3位数计数器显示功能,按键每按下1次,计数器加1,同时显示加1,利用按键实现计数器清零功能。编写Keil代码
时间: 2024-03-22 07:42:05 浏览: 27
好的,以下是基于STC8952的计数器代码:
```c
#include <reg8952.h>
// 定义按键、INT0和INT1对应的IO口
sbit KEY = P3^2;
sbit INTO = P3^3;
sbit INT1 = P3^4;
// 定义计数器初始值为0
unsigned int count = 0;
// 定义8段码数字0~9的编码
unsigned char code segTable[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
// 延时函数
void delay(unsigned int t) {
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 125; j++);
}
}
// 数码管显示函数
void display(unsigned int num) {
unsigned char i;
unsigned char code posTable[] = { 0xFE, 0xFD, 0xFB }; // 8段码显示位置
for (i = 0; i < 3; i++) {
P0 = posTable[i]; // 选择8段码位置
P1 = segTable[num % 10]; // 显示个位数
delay(1); // 延时1ms
P1 = 0x00; // 关闭8段码显示
num /= 10; // 取下一位数字
}
}
// 中断服务函数
void interruptService() interrupt 0 {
if (INT0) { // 检测INT0中断
count++; // 计数器加1
display(count); // 显示计数器值
}
if (INT1) { // 检测INT1中断
count = 0; // 清零计数器
display(count); // 显示计数器值
}
}
void main() {
EA = 1; // 开启总中断
EX0 = 1; // 开启INT0中断
IT0 = 1; // INT0下降沿触发
EX1 = 1; // 开启INT1中断
IT1 = 1; // INT1下降沿触发
while (1) {
if (!KEY) { // 检测按键是否按下
delay(10); // 延时10ms去抖动
if (!KEY) { // 再次检测按键是否按下
count++; // 计数器加1
display(count); // 显示计数器值
while (!KEY); // 等待按键松开
}
}
}
}
```
在上述代码中,我们首先定义了按键、INT0和INT1对应的IO口。然后定义了计数器初始值为0,以及8段码数字0~9的编码表。接着定义了延时函数和数码管显示函数。
在主函数中,我们开启了总中断,开启了INT0和INT1中断,并分别设置了中断触发方式为下降沿。在while循环中,我们检测按键是否按下,并进行去抖动处理。如果按键被按下,则计数器加1,并显示计数器值,同时等待按键松开。当INT0中断或INT1中断被触发时,计数器也会相应地加1或清零,并显示计数器值。
以上就是基于STC8952的计数器代码。请注意,这只是一个简单的示例程序,实际应用中可能需要根据具体情况进行修改和优化。