写出单片机代码,要求为数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。
时间: 2024-02-03 14:12:07 浏览: 102
以下是基于STC89C52单片机的代码,使用定时器0来实现跑表功能:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = { // 数码管显示表
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
};
uchar count = 0; // 计数器,每10ms加1
uchar flag = 0; // 标志位,用于判断是否停止计时
void delay(uint xms) { // 延时函数,xms为毫秒数
uint i, j;
for(i=xms; i>0; i--) {
for(j=112; j>0; j--);
}
}
void timer0() interrupt 1 { // 定时器0中断服务程序
TH0 = 0xfc; // 重新赋初值,使定时器在10ms后再次溢出
TL0 = 0x66;
count++; // 每10ms计数器加1
}
void main() {
uchar i;
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xfc; // 给定时器赋初值,使它在10ms后溢出
TL0 = 0x66;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
while(1) {
if(flag == 0) { // 如果未按下独立键盘,则继续计时
if(count == 100) { // 如果计数器达到100,则表示1秒已经过去
count = 0; // 重置计数器
i++; // 跑表加1
if(i >= 1000) i = 0; // 跑表最大值为999,超过则重新从0开始
}
P1 = 0xff; // 关闭所有数码管
P0 = table[i/100]; // 显示百位数码管
P1 = 0xfe; // 打开百位数码管
delay(1);
P1 = 0xff; // 关闭所有数码管
P0 = table[i%100/10]; // 显示十位数码管
P1 = 0xfd; // 打开十位数码管
delay(1);
P1 = 0xff; // 关闭所有数码管
P0 = table[i%10]; // 显示个位数码管
P1 = 0xfb; // 打开个位数码管
delay(1);
} else { // 如果按下了独立键盘,则停止计时
TR0 = 0; // 关闭定时器0
P1 = 0xff; // 关闭所有数码管
P0 = 0xff; // 显示横线
P1 = 0xf7; // 打开横线数码管
while(1) { // 等待松手
if(P3 != 0xff) {
delay(10); // 延时消抖
if(P3 != 0xff) {
flag = 0; // 标志位清零
TR0 = 1; // 启动定时器0
break; // 跳出循环
}
}
}
}
}
}
```
在程序中,我们使用了定时器0来实现跑表功能。每10ms定时器会产生一次中断,计数器加1,当计数器达到100时,表示1秒已经过去,此时跑表加1,如果跑表超过999则重新从0开始。同时,我们在程序中加入了独立键盘的检测,当按下键盘时,程序会停止计时,当松开键盘时,程序会继续计时。
阅读全文