单片机数码管显示时钟程序

  • 格式: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一一);