- UID
- 496471
- 阅读权限
- 30
- 推广
-
- 幽默
-
- 注册时间
- 2013-10-29
- 最后登录
- 1970-1-1
|
注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
本帖最后由 桥式整流 于 2014-1-2 10:34 编辑
本人在做一个秒表系统 其中有一个要求不会写
在按键2按下时暂停5秒 数码管在暂停的5秒之内一直显示暂停时的那个数,5秒之后继续计时,但得加上5秒。也就是在这里开始改,我改了好久没有成功
/*0~99秒计时器,当一秒钟到来时,就让秒计数单元加1,当秒计数达到99时,就自动返回到0,重新秒计数。
方法1:定时器中断方式*/
#include <reg51.h>
void key();
void key1();
unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x7f}; //共阳接法数码管0~9对应代码
unsigned char n,a;
unsigned char m ,t;
sbit d1=P0^7;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^3;
void delay(unsigned int c);
void main()
{TMOD=0x01; //定时器0工作在工作方式1下
TH0=(65536-10000)/256; //设置50ms定时时计数器的初值,TH0=(65536-50000)/256
TL0=(65536-10000)%256; // TL0=(65536-50000)/256
EA=1; //CPU开总中断
ET0=1; //T0开中断
TR0=0; //不启动T0
m=0;
n=0;
t=0;
a=0;
while(1) //本段程序功能为显示
{
P0=dispcode[n/10]; //段选,显示十位数字
P2=0X40;//位选
delay(5); //动态扫描
P0=0xff;
P0=dispcode[n%10]; //段选,显示个位数字
P2=0x80; //位选
delay(5); //动态扫描
P0=0xff;
P0=dispcode[t/10]; //段选,显示十位数字
P2=0X10;//位选
delay(5); //动态扫描
P0=0xff;
P0=dispcode[t%10]; //段选,显示个位数字
P2=0x20; //位选
d1=0;
delay(5); //动态扫描
P0=0xff;
key();
key1();
}
}
void t0() interrupt 1 using 2
{
TH0=0Xd8; //重装50ms初值,TH0=(65536-50000)/256
TL0=0Xf0; // TL0=(65536-50000)/256
m++;
if(m==1) //是否1S到了的判断。1S=50ms*20
{
m=0;
n++; //数码管显示的内容加1
if(n==100) //是否显示到20的判断
{
n=0; //当数码管显示到20后,返回显示0
t++;
if(t==100)
{
n=99;
t=99;
}
}
}
}
void key()
{
if(K1==0)
{
delay(5);
if(K1==0)
{
while(!K1);
TR0=1;
}
}
}
void key1()
{
if(K2==0)
{
delay(5);
if(K2==0)
{
while(!K2);
TR0=0;
for(a=0;a<200;a++) //暂停5秒
t=t+5;
TR0=1;
}
}
}
void delay(unsigned int c)
{
unsigned int x,y;
for(x=c;x>0;x--)
for(y=110;y>0;y--);
} |
|