延时函数:
void delay_us(unsigned char t)
{
while(--t);
}
void delay_ms(unsigned char t)
{
while(t--)
{
delay_us(245);
delay_us(245);
}
}
void delay_s(unsigned char t)
{
while(t--)
{
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
}
}
主文件函数:
#include <reg52.h>
#include "./delay/delay.h"
#define PORTLEN P0
#define KEYPORT P1
sbit bit_select = P2^0;
sbit seg_select = P2^1;
sbit beem = P3^2;
unsigned char code SONG_TONE[]={239,239,212,189,159,159,189,159,159,142,126,120,120,159,120,120,142,159,189,142,159,189,239,212,189,159,142,159,189,212,239};
unsigned char code SONG_LONG[]={6,6,9,3,6,6,12,6,6,6,6,6,6,12,6,6,9,3,6,6,9,3,6,3,3,6,3,3,6,6,9};
unsigned char src[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char qrc[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char second1[8];
unsigned char shi = 0;
unsigned char fen = 0;
unsigned char miao = 0;
unsigned char Dshi = 3;
unsigned char Dfen = 1;
unsigned char Dmiao = 0;
unsigned char j = 7;
unsigned char k = 0;
void timer0_init(void)
{
EA = 1;
TMOD |= 0x01;
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256;
ET0 = 1;
TR0 = 1;
}
void timer1_init(void)
{
EA = 1;
TMOD |= 0x10;
TH1 = (65536 - 1000) / 256;
TL1 = (65536 - 1000) % 256;
ET1 = 1;
TR1 = 1;
}
unsigned char key_scan(void)
{
unsigned char keyvalue;
KEYPORT = 0xf0;
if(0xf0 != KEYPORT)
{
delay_ms(10);
if(0xf0 != KEYPORT)
{
KEYPORT = 0xfe;
if(0xfe != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0;
keyvalue += 0x0e;
while(0xfe != KEYPORT);
delay_ms(10);
while(0xfe != KEYPORT);
return keyvalue;
}
KEYPORT = 0xfd;
if(0xfd != KEYPORT)
{
keyvalue = KEYPORT;
keyvalue &= 0xf0;
keyvalue += 0x0d;
while(0xfd != KEYPORT);
delay_ms(10);
while(0xfd != KEYPORT);
return keyvalue;
}
}
}
return 0xff;
}
unsigned char key_pro()
{
unsigned char keynum;
keynum = key_scan();
switch(keynum)
{
case 0x7e:return 1;break;
case 0xbe:return 2;break;
case 0xde:return 3;break;
case 0xee:return 4;break;
case 0x7d:return 5;break;
case 0xbd:return 6;break;
case 0xdd:return 7;break;
case 0xed:return 8;break;
default:return 0xff;break;
}
}
void PlayMusic(void)
{
unsigned char q=0;
unsigned char m;
unsigned char k;
while(SONG_LONG[q]!=0||SONG_TONE[q]!=0)
{
for(m=0;m<SONG_LONG[q]*20;m++)
{
beem=~beem;
for(k=0;k<SONG_TONE[q]/3;k++);
}
delay_ms(10);
q++;
}
}
void main()
{
unsigned char key;
timer1_init();
timer0_init();
while(1)
{
key = key_pro();
if(1 == key)
{
while(1 != key);
delay_ms(10);
while(1 != key);
TR0 = ~TR0;
}
if(2 == key)
{
while(2 != key);
delay_ms(10);
while(2 != key);
shi++;
second1[0] = src[shi / 10];
second1[1] = src[shi % 10];
second1[2] = 0x40;
if(24 == shi)
{
shi = 0;
}
}
if(3 == key)
{
while(3 != key);
delay_ms(10);
while(3 != key);
fen++;
second1[3] = src[fen / 10];
second1[4] = src[fen % 10];
second1[5] = 0x40;
if(60 == fen)
{
fen = 0;
}
}
if(4 == key)
{
while(4 != key);
delay_ms(10);
while(4 != key);
miao++;
second1[6] = src[miao / 10];
second1[7] = src[miao % 10];
if(60 == miao)
{
miao = 0;
}
}
if(5 == key)
{
while(5 != key);
delay_ms(10);
while(5 != key);
second1[0] = src[Dshi / 10];
second1[1] = src[Dshi % 10];
second1[2] = 0x40;
second1[3] = src[Dfen / 10];
second1[4] = src[Dfen % 10];
second1[5] = 0x40;
second1[6] = src[Dmiao / 10];
second1[7] = src[Dmiao % 10];
}
if(6 == key)
{
while(6 != key);
delay_ms(10);
while(6 != key);
Dshi++;
second1[0] = src[Dshi / 10];
second1[1] = src[Dshi % 10];
if(24 == Dshi)
{
Dshi = 0;
}
}
if(7 == key)
{
while(7 != key);
delay_ms(10);
while(7 != key);
Dfen++;
second1[3] = src[Dfen / 10];
second1[4] = src[Dfen % 10];
if(24 == Dfen)
{
Dfen = 0;
}
}
if(8 == key)
{
while(8 != key);
delay_ms(10);
while(8 != key);
Dmiao++;
second1[6] = src[Dmiao / 10];
second1[7] = src[Dmiao % 10];
if(24 == Dmiao)
{
Dmiao = 0;
}
}
if((shi == Dshi) && (fen == Dfen) && (miao == Dmiao))
{
beem = 0;
PlayMusic();
delay_ms(500);
}
}
}
void display()
{
static unsigned char i = 0;
PORTLEN = 0x0; //ÏûÖØÓ°
seg_select = 1;
seg_select = 0;
PORTLEN = 0xff;
bit_select = 1;
bit_select = 0;
PORTLEN = second1[i];
seg_select = 1;
seg_select = 0;
PORTLEN = qrc[i];
bit_select = 1;
bit_select = 0;
i++;
if(8 == i)
{
i = 0;
}
}
void timer0_isr() interrupt 1
{
static unsigned char i = 0;
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256;
i++;
if(50 == i)
{
i = 0;
miao++;
if(60 == miao)
{
miao = 0;
fen++;
if(60 == fen)
{
fen = 0;
shi++;
if(24 == shi)
{
shi = 0;
}
}
}
}
second1[0] = src[shi / 10];
second1[1] = src[shi % 10];
second1[2] = 0x40;
second1[3] = src[fen / 10];
second1[4] = src[fen % 10];
second1[5] = 0x40;
second1[6] = src[miao / 10];
second1[7] = src[miao % 10];
}
void timer1_isr() interrupt 3
{
TH1 = (65536 - 1000) / 256;
TL1 = (65536 - 1000) % 256;
display();
}