#include <reg51.h> unsigned char code seg_duan[] = {0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char code seg_wei[] = {0xfe,0xfd,0xfb,0xf7}; unsigned char num=0; sbit key1=P3^0; sbit key2=P3^1; //sbit le=P2^0; void delay(unsigned int k) { unsigned int i,j; for(i=0;i<k;i++) { for(j=0;j<121;j++) {;} } } void keyscan() { if(key1==0) { delay(10); if(key1==0) { while(!key1); num++; if(num>99) { num=0; } } } if(key2==0) { delay(10); if(key2==0) { while(!key2); if(num==0) num=99; else num--; } } } void display(unsigned char i) { P2=seg_wei[0]; P0=seg_duan[i%10]; delay(5); P2=0xff; P2=seg_wei[1]; P0=seg_duan[i/10]; delay(5); } main() { while(1) { keyscan(); display(num); } }我需要在这段代码修改成以前设计的两位加减计数器,按键按下时,数码管上的数值不显示。现在要求按键按下时,不影响数码管上数值的显示,用单片机中的中断定时器代码实现。
时间: 2023-11-30 21:03:39 浏览: 142
一个定时器代码
好的,首先需要了解一下中断定时器的基本原理和使用方法。
中断定时器是单片机中一个非常重要的模块,它可以在一定的时间间隔内产生一个中断请求,从而实现定时器的功能。在定时器中断函数中,我们可以编写一些代码来处理一些事情,比如更新数码管上的数值。
对于这个问题,我们需要做以下几个步骤:
1. 初始化中断定时器
首先,我们需要初始化中断定时器。这里我们选择使用定时器0作为中断定时器,并设定其时间为10ms。初始化代码如下:
```c
void init_timer0() {
TMOD |= 0x01; // 定时器0工作在模式1,16位定时器
TH0 = 0xFC; // 定时器初值,计算公式为:65536 - (Fosc/12) * T
TL0 = 0x67; // 定时器初值,计算公式为:65536 - (Fosc/12) * T
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 打开总中断开关
}
```
2. 编写中断函数
接下来,我们需要编写一个中断函数,在其中更新数码管上的数值。由于我们想要按键按下时不影响数码管上的数值,因此我们需要在中断函数中增加一些判断语句,判断按键是否按下。如果按下,则不更新数码管上的数值,否则更新数码管上的数值。中断函数代码如下:
```c
void timer0_isr() interrupt 1 {
static unsigned char cnt = 0; // 静态变量,用于计数
cnt++; // 每次进入中断函数,计数器加1
if(cnt == 100) { // 如果计数器达到100次,即1秒钟
cnt = 0; // 计数器清零
keyscan(); // 扫描按键
if(key1 == 0) { // 如果按键1按下,则不更新数值
delay(10);
if(key1 == 0) {
while(!key1);
}
}
else if(key2 == 0) { // 如果按键2按下,则不更新数值
delay(10);
if(key2 == 0) {
while(!key2);
}
}
else { // 否则更新数值
if(num >= 99) num = 0;
else num++;
}
display(num); // 显示数值
}
}
```
3. 修改主函数
最后,我们需要在主函数中调用初始化函数,并让程序进入一个死循环。主函数代码如下:
```c
main() {
init_timer0(); // 初始化定时器0
while(1); // 进入死循环
}
```
将以上代码整合到一起,得到完整的代码如下:
阅读全文