#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴段码
uchar tbit[]={0,0,0,0,0,0};//存储用于6个数码管显示的6个数
uchar time[3];//分钟存储时、分、秒
void delayms(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void timer_update()
{
time[2]++;
if(time[2]>=60)
{ time[2]=0;
time[1]++;
if(time[1]>=60)
{ time[1]=0;
time[0]++;
if(time[0]>=24)time[0]=0;
}
}
}
void display()
{ uchar i;
for(i=0;i<6;i++)
{
P0=0xff; //消除错误的显示位置,关闭显示
wela=1;
wela=0;
if(i==1||i==3)
P0=tab[tbit[i]]|0x80; //控制显示的数字,加小数点
else
P0=tab[tbit[i]]; //控制显示的数字,不加小数点
dula=1;
dula=0;
P0=~(1<<i); //1左移i位再取反,控制显示位置
wela=1;
wela=0;
delayms(1);
}
}
void main()
{ uchar i;
dula=0;
wela=0;
IT1=0; //1,表示INT1下降沿触发,0表示低电平触发。试试改为IT1=0时效果会怎样
EX1=1; //允许INT1中断
EA=1; //允许全局中断
while(1)
{
for(i=0;i<3;i++)
{ tbit[2*i]=time[i]/10;
tbit[2*i+1]=time[i]%10;
}
display();
}
}
void INT1_isr() interrupt 2 //INT1中断服务程序,按下P3.3引脚的按键后,程序自动跳到此执行
{
//此程序请用本文件夹提供的Proteus仿真图,按下图里的第4个独立按键,此仿真电路已经将第4个独立按键改接到单片机的P3.3/INT1引脚
//此程序的效果是按下按键,秒钟数马上加1。按键按住期间,秒钟数不变。
timer_update();
}
评论1
最新资源