单片机数码管显示时钟程序
- 格式:docx
- 大小:15.77 KB
- 文档页数:14
ttincludeO //#include#include〈>
ftdefine uchar unsigned char
ftdefine uint unsigned int
sbit dula二P2"6;
sbit wela二P2"7;
sbit keyl=P3"4;
sbit key2二P3"5;
sbit key3=P3*6;
sbit beep二P2"3;
unsigned code table[]={
0x3f , 0x06 , 0x5b , 0x4f ,
0x66 , 0x6d , 0x7d , 0x07 ,
0x7f , 0x6f , 0x77 , 0x7c,
0x39 , 0x5e , 0x79 , 0x71
};
uchar numl, num2, s, si, m, ml, f, fl, num, numf, nums, dingshi;
uchar ns, nsl, nf, nf 1, numns, numnf;
void delay(uint z);
void keyscan ();
void keyscanl ();
void alram(); void display(uchar m, uchar ml, uchar f, ucharf1, uchars,
ucharsl); void displayO(uchar nf, uchar nf1, uchar ns, uchar nsl);
void main()
{
TMOD二0x01;//设定定时器0工作方式1
THO=(65536-46080)/256 ;
TLO=(65536-46080)%256 ;
EA二1;//开总中断
ETO=1;//开定时器0中断
TRO二1;//启动定时器0中断
numns=12;
numnf=0;
while (1)
{
if(dingshi==0)
{
keyscan ();
display (m, ml, f, fl, s, si);
alram();
else
keyscanl ();
displayO (nf, nf 1, ns, nsl);
}
}
}
void keyscan ()
if (keyl==0)
{
delay(10);
if(keyl==0)
nums++;
if (nums=:=24)
nums二0;
while (!keyl);
display (m, ml, f, fl, s, si);
}
if(key2==0)
delay(10);
if (key2=0)
numf++;
if (numf==60)
numf=O;
while (!key2);
display(m, ml, f, fl, s, si);
}
if(key3==0)
{
delay (10);
if(key3==0)
{
dingshi二'dingshi;
while(!key3)
display(m, ml, f, fl, s, si);
}
}
/* if(key4=0)
{
delay (10);
if(key4==0)
flag二1;
while(!key4);
display (m, ml, f, fl, s, si);
}
}*/
}
void keyscanl()
{
if(keyl==0)
{
delay 仃0);
if(keyl==0)
numns++;
if (numns=24)
numns=0;
while (!keyl);
// display (nf, nf 1, ns, nsl);
if (key2=0)
delay (10);
if(key2==0)
numnf++;
if (numnf—60)
numnf=0;
while(!key2);
// display (nf, nf 1, ns, nsl);
}
if(key3==0)
{
delay 仃0);
if(key3==0)
{
dingshi^O;
wh订e(!key3);
display (m, ml, f, fl, s, si);
}
void alramO
if((numnf==numf)&&(numns二二nums))
beep二0;
if (((numnf+l=:numf) && (numns~nums)) && (dingshi—O)) // 一分钟报
时提示
beep=l;
}
void displayO (uchar nf, uchar nf 1, uchar ns, uchar nsl)//闹钟显 示函数
{
nf=numnf%10;
nfl=numnf/10;
ns=:numns%10;
nsl 二 numns./10;
/* wela=l;
P0=0xc0; //送位选数据
wela=0;
P0二Oxff;*/wela=l;
dula=l;
PO二table[nsl];
dula=0;
PO二Oxff;
wela=l;
PO二Oxfe;
wela=0;
delay (1);
dula=l;
PO二table[ns] 0x80;
dula=0;
PO=Oxff;
wela=l;
PO二Oxfd;
wela=0;
delay (1);
dula=l;
P0=table Lnf1];
dula=0;
PO二Oxff; P0=0xff;
wela=l;
PO=Oxfb;
wela=O;
delay (1);
dula=l;
PO=table[nf];
dula=O;
PO=Oxff;
wela=l;
P0=0xf7;
wela=O;
delay (1);
}
void display(uchar m, uchar ml, uchar f, ucharfl, uchars, ucharsl) //
时间显示
{
dula=l;
PO二table [ml] ; //秒位第 1 位
dula=0;dula=l;
PO=Oxef; wela=O; delay (1);
dula=l;
Portable Im]; dula=0;
PO二Oxff; wela=l;
PO二Oxdf; wela=0;
delay (1);
dula=l;
P0=table[si];
dula=0;
PO=Oxff; wela=l;
PO二Oxfe; wela=0;
delay (1);
Portable [s] 0x80;//秒位第2位
//时位第一位 wela二0;
dula=O;
PO二Oxff;
wela=l;
PO二Oxfd;
wela=0;
delay(1);
dula=l;
P0=table [fl] : //分位第一位
dula=0;
PO=Oxff;
wela=l;
PO=Oxfb;
we la二0;
delay (1);
dula=l;
PO二table[f] 0x80;
dula=0;
PO=Oxff; wela二0;
wela=l;
P0=0xf7;
delay (1);
void T0_timer() interrupt 1
{
TH0=(65536-46080)/256 ;
TL0=(65536-46080)%256 ; num2++;
if (num2=20)
{
num++;
num2=0;
m=:num%10;
ml二num/10;
f=numf%10;
f1二numf/10;
s=nums%10;
signums/10;
if (num—59)
{
num^O;
numf++;
if(numf二二59)
numf=O;
nums++;
}
if (nums二二24) nums=O;
}
}
}
void delay(uint z)
uint x, y;
for (x=110;x>0;x--)
for (y=z;y>0;y一一);