#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define output P1
#define input P1
typedef unsigned int u16;
typedef unsigned char u8;
enum KEY{key0,key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15}; //????16??????
uchar code table[]={ //???鶨??,????????
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned int code Freqtab[] = { //?????????????
64021,64103,64260,64400, //????3 4 5 6
64524,64580,64684,64777, //????7,????1 2 3
64820,64898,64968,65030, //????4 5 6 7
65058,65110,65157,65178}; //????1 2 3 4
uint FreqTemp;
u8 flag;
sbit SPEAK = P3^7; //???????????? J7??P37????
sbit k1=P3^2; //????P32 ????k1
unsigned int C; //???????????????
#define L1 262
#define L2 284
#define L3 311
#define L4 349
#define L5 392
#define L6 440
#define L7 494
#define Z1 523
#define Z2 587
#define Z3 659
#define Z4 698
#define Z5 784
#define Z6 880
#define Z7 987
#define H1 1046
#define H2 1174
#define H3 1318
#define H4 1396
#define H5 1567
#define H6 1760
#define H7 1975
unsigned code GP[]={Z6,Z7,H1,Z7,H1,H3,Z7,Z3,Z6,Z5,Z6,H1,Z5, //???????????
Z3,Z3,Z4,Z3,H4,H1,Z3,H1,H1,Z7,Z4,Z4,Z7,
Z7,Z6,Z7,H1,Z7,H1,H3,Z7,Z3,Z6,Z5,Z6,H1,
Z5,Z2,Z3,Z4,H1,Z7,H1,H2,H2,H3,H1,H1,Z7,
Z6,Z6,Z7,Z5,Z6,H1,H2,H3,H2,H3,H5,H2,H1,
H1,Z7,H1,H3,H3,Z6,Z7,H1,Z7,H1,H2,H1,Z5,
Z5,H4,H3,H2,H1,H3,H3,H3,H6,H6,H5,H5,H3,
H2,H1,H1,H2,H1,H2,H5,H3,H3,H6,H6,H5,H5,
H3,H2,H1,H1,H2,H1,H2,Z7,Z6,Z6,0xff};
unsigned code JP[]={4,4,/**/12,4,8,8,/**/20,8,/**/12,4,8,8, //?????????
20,4,4,/**/12,4,8,8,/**/20,4,4,/**/12,4,8,8,
/**/20,4,4,/**/12,4,8,8,/**/20,8,/**/12,4,8,8,
/**/20,4,4,/**/8,4,12,3,1,/**/12,4,12,/**/4,4,
4,4,8,8,/**/20,4,4,/**/12,4,8,8,/**/24,/**/
8,4,4,8,8,/**/24,/**/4,4,8,4,4,8,/**/12,4,12,
/**/8,8,8,4,4,/**/16,8,/**/12,4,12,4,/**/4,4,12,8,
/**/12,4,8,8,/**/16,8,/**/12,4,12,4,/**/4,4,12,8,
/**/12,4,8,3,1,/**/32};
void delay() //????????????????? ???15.6ms
{
uint i,j;
for(i=70;i>0;i--)
{for(j=110;j>0;j--);}
}
void delay1ms(uint n) //??????????? ??? 0us ,???n????
{
uint a,b,c;
for(c=n;c>0;c--)
for(b=199;b>0;b--)
for(a=1;a>0;a--);
}
void delayxiaodou(u16 i) //???????????
{
while(i--);
}
uint key_input(void) //?????????
{
uchar temp1,temp2; //????????????л?????
uchar num = 16; //??????????
output = 0x0f;
temp1 = input; //??????
if(0x0f != temp1) //????????
{
delay1ms(5); //?????????????
temp1 = input; //??ζ????
if(0x0f != temp1) //?????????????
{
temp1 = temp1 & 0x0f; //?????4λ
output = 0xf0; //????????
delay1ms(1); //?????£??????????????
temp2 = input; //???????
temp2 = temp2 & 0xf0; //?????4λ
temp1 = temp1 | temp2; //??temp1??temp2??????
}
}
switch(temp1) //?ж????λ?? switch???
{
case 0xee:num=0;break;
case 0xde:num=1;break;
case 0xbe:num=2;break;
case 0x7e:num=3;break;
case 0xed:num=4;break;
case 0xdd:num=5;break;
case 0xbd:num=6;break;
case 0x7d:num=7;break;
case 0xeb:num=8;break;
case 0xdb:num=9;break;
case 0xbb:num=10;break;
case 0x7b:num=11;break;
case 0xe7:num=12;break;
case 0xd7:num=13;break;
case 0xb7:num=14;break;
case 0x77:num=15;break;
default:break;
}
return num; //???????λ??
}
void T0_INT(void) interrupt 1 //1???ж? ??????
{
flag=1;
TL0 = FreqTemp; //???????????????
TH0 = FreqTemp >> 8;
SPEAK = ~SPEAK; //????
}
void Int0Init()
{ //???? INT0
IT0=1;//????????????????????
EX0=1;//?? INT0 ???ж??????
EA=1;//?????ж?
}
int main()
{
flag=1;
TMOD = 0X01; //?????T0????????1
EA = 1;
ET0 = 1;
TR0 = 0;
EA=1; //?????ж?
ET1=1; //??t1?ж?
Int0Init();
while(1)
{
if(flag==1)
{
uint num,temp;
TR1 = 0;
num = key_input();
temp = num;
P0 = table[num];
if(16 != num)
{
FreqTemp = Freqtab[num];
TR0 = 1;
while(0xf0 != output); //????????
TR0 = 0;
SPEAK = 1;
}
}
else if(flag==0)
{
uchar i,j;
while(1)
{ i=0;
while(GP[i]!=0xff)
{
if(flag == 1)
break;
C=460830/GP[i];
TH1=(8192-C)/32;
TL1=(8192-C)%32;
TR1=1;//???????0
for(j=0;j<JP[i];j++)
{
delay();
}
TR1=0;
i++;
}
SPEAK=0;
flag = 1;
break;
}
}
}
return 0;
}
void T1_time()interrupt 3 //?????????????
{
TR1=0;
SPEAK=!SPEAK;
TH1=(8192-C)/32;
TL1=(8192-C)%32;
TR1=1;
}
void Int0Init1()interrupt 0 //?????????????
{
delayxiaodou(1000) ;
if(k1==0)
{
flag=!flag;
}
}
|