单片机程序里只定义了一个按键,但是用发的开发板做实物,另一个按键却可以暂停秒表,暂停之后无法进行其他操作,只能按总开关复位
#include <stc15.h>
#include "delay.h"
sbit DS = P1^1; //串行数据
sbit SH = P1^3; //移位寄存器时钟
sbit ST = P1^2; //存储寄存器时钟
sbit K1=P3^2;//按键开关
sbit LED=P5^5;
unsigned char code SEG[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //带小数点的 共阳极管码
unsigned char count,m,n,i,a,b,second,flag;
void Timer0Init(void) //10毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xF0; //设置定时初始值
TH0 = 0xD8; //设置定时初始值
TF0 = 0; //清除TF0标志
}
void Timer2Init(void) //50毫秒@12.000MHz
{
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0xB0; //设置定时初始值
T2H = 0x3C; //设置定时初始值
}
//595发送数据
void Send(unsigned char n)//传送数据函数
{
unsigned char i;
for(i=0;i<8;i++)
{
if(n&0x80)//取数据n的最高位
DS=1;
else
DS=0;
n<<=1;//左移数据n
SH=0;//移入数据
SH=1;
}
}
/*主函数*/
void main()
{
Send(0xff);Send(0xff);ST=0;ST=1;//一开始熄屏
LED=1;
EA=1;ET0=1;EX0=1;IT0=1;EX1=1;IT1=1;//开INT0.INT1,T0中断 切INT0,INT1为下降沿有效
IE2|=0X04;//开T2的中断
PT0=1;//设T0的优先级比INT0高 也就是优先级T0>INT0>INT1
Timer0Init();Timer2Init();//定时器初始化
while(1);
}
//中断函数
void INT0(void) interrupt 0
{
Delay10ms();//延时消抖
if(K1==0)
{
LED=0;
second=0;//为下一次长按进行初始化
TR0=1;//定时器0开始计时
i++;//记录按键次数
}
while(K1==0);//等待按键释放
{
TR0=0;//定时器0暂停计时
LED=1;
}
if(second>50)//表示长按2s
{
AUXR &= ~0x10;//定时器2暂停计时
Send(0xff);Send(0xff);ST=0;ST=1;//熄屏
m=0;n=0;i=0;//重新初始化
flag=1;//长按标志位
LED=1;
}
if(i==1)//按下一次 启动计时
{
AUXR |= 0x10;//定时器2开始计时
LED=0;
}
if(i==2)//再按一下暂停计时
{
AUXR &= ~0x10;//定时器2暂停计时
LED=1;
}
if(i==3)//按下一次 启动计时
{
AUXR |= 0x10;//定时器2开始计时
LED=0;
i=1;
}
}
void Timer0(void) interrupt 1
{
second++;
}
void Timer2(void) interrupt 12
{
count++;
if((count%2==0)&&flag==0)//计时2*50ms=0.1s时
{
Send(SEG[m]);Send(SEG[n]&0x7f);ST=0;ST=1;//传送数据给数码管 m:个位 n:十位
m++;
if(m%10==0)//m>10时向n进位
{
n++;
m=0;
}
if(n>9)//n>9时清零
n=0;
}
if(flag==1)
{
flag=0;//为下一次长按进行初始化
}
}
|