#include<reg52.h> //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int//对数据类型进行声明定义
bit qtflag=1;
sbit D1=P1^0;
sbit D2=P1^1;
sbit D3=P1^2;
sbit D4=P1^3;
sbit DIO_595=P1^4;
sbit RCK_595=P1^5;
sbit SCLK_595=P1^6;
sbit led=P1^7;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit ENA=P0^2;
sbit IN1=P0^0;
sbit IN2=P0^1;
void pwm();
uchar msflag,sdh,sdl,sdflag=7;
uint miao,shi,fen;
unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
uint i,j;
for (i=xms;i>0;i--)
for (j=110;j>0;j--);
}
void delay(uint i)
{
while(i--);
}
void Hc595SendByte(uchar dat)
{
uchar a;
SCLK_595=0;
RCK_595=0;
for(a=0;a<8;a++)
{
DIO_595=dat>>7;
dat<<=1;
SCLK_595=1;
delay(1);
SCLK_595=0;
}
RCK_595=1;
delay(1);
RCK_595=0;
}
void display()
{
uchar i;
if(msflag==0)
{
for(i=0;i<4;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
D1=1;D2=0;D3=0;D4=0; Hc595SendByte(smgduan[fen/10]); break;//显示第1位
case(1):
D1=0;D2=1;D3=0;D4=0; Hc595SendByte(smgduan[fen%10]); break;//显示第2位
case(2):
D1=0;D2=0;D3=1;D4=0; Hc595SendByte(smgduan[miao/10]); break;//显示第3位
case(3):
D1=0;D2=0;D3=0;D4=1; Hc595SendByte(smgduan[miao%10]); break;//显示第4位
}
delay(50);//间隔一段时间扫描
Hc595SendByte(0x00);//消隐
}
}
if(msflag==1)
{
for(i=0;i<4;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
D1=1;D2=0;D3=0;D4=0; Hc595SendByte(0x00); break;//显示第1位
case(1):
D1=0;D2=1;D3=0;D4=0; Hc595SendByte(0x00); break;//显示第2位
case(2):
D1=0;D2=0;D3=1;D4=0; Hc595SendByte(0x00); break;//显示第3位
case(3):
D1=0;D2=0;D3=0;D4=1; Hc595SendByte(smgduan[sdflag]); break;//显示第4位
}
delay(50);//间隔一段时间扫描
Hc595SendByte(0x00);//消隐
}
}
if(msflag==2)
{
for(i=0;i<4;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
D1=1;D2=0;D3=0;D4=0; Hc595SendByte(0x00); break;//显示第1位
case(1):
D1=0;D2=1;D3=0;D4=0; Hc595SendByte(0x00); break;//显示第2位
case(2):
D1=0;D2=0;D3=1;D4=0; Hc595SendByte(0x00); break;//显示第3位
case(3):
D1=0;D2=0;D3=0;D4=1; Hc595SendByte(0x00); break;//显示第4位
}
delay(500);//间隔一段时间扫描
Hc595SendByte(0x00);//消隐
}
}
}
void key()
{
if(k1==0) //检测K1键是否按下
{
delay(100);//按键消抖
if(k1==0)
{
msflag++;
if(msflag==3)
msflag=0;
}
while(!k1); //检测K1键是否松开
}
if(k2==0)
{
delay(100);
if(k2==0)
{
qtflag=~qtflag;
}
while(!k2);
}
if(k3==0)
{
delay(100);
if(k3==0)
{
if(sdflag<7)
sdflag++;
}
while(!k3);
}
if(k4==0)
{
delay(100);
if(k4==0)
{
if(sdflag>1)
sdflag--;
}
while(!k4);
}
}
void pwm()
{
switch(sdflag)
{
case 7:
sdh=10;sdl=0;break;
case 6:
sdh=9;sdl=1;break;
case 5:
sdh=8;sdl=2;break;
case 4:
sdh=7;sdl=3;break;
case 3:
sdh=6;sdl=4;break;
case 2:
sdh=5;sdl=5;break;
case 1:
sdh=4;sdl=6;break;
}
}
void qd()
{
if(qtflag)
{
uchar i;
for(i=0;i<sdl;i++)
{
ENA=0;
display();
}
for(i=0;i<sdh;i++)
{
ENA=1;
display();
}
}
else
ENA=0;
}
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
}
void main()
{
Timer0Init();//定时器0初始化
TR0=1;
IN1=1;
IN2=0;
while(1)
{
display();
key();
pwm();
qd();
}
}
void Timer0()interrupt 1
{
static uint i;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i==1000)
{
miao++;
i=0;
led=~led;
if(miao==60)
{
fen++;
miao=0;
if(fen==60)
{
shi++;
fen=0;
if(shi==24)
{
shi=0;
}
}
}
}
}
|