#include <REGX51.H>
typedef unsigned int u16;
typedef unsigned char u8;
sbit key=P1^0;
u8 code number[]={0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};
#define key_0 0
#define key_1 1
#define key_2 2
#define key_3 3
#define key_no 0
#define key_click 1
#define key_double 2
#define key_long 3
u8 cnt=0,flag;
u8 ajfh(void)
{
static u8 key_cnt = 0;
static u8 key_xz = key_0;
u8 key_return = key_no;
switch(key_xz)
{
case key_0:
if(!key)
{
key_xz=key_1;
}break;
case key_1:
if(!key)
{
key_xz=key_2;
key_cnt=0;
}
else
{
key_xz=key_0;
}break;
case key_2:
if(key)
{
key_return = key_click;
key_xz=key_0;
}
else if(++key_cnt >= 100)
{
key_return = key_long;
key_xz=key_3;
}break;
case key_3:
if(key)
{
key_xz=key_0;
}break;
}
return key_return;
}
u8 key_smg(void)
{
static key_xz = key_0;
static key_cnt = 0;
u8 key_return = key_no;
u8 aj;
aj=ajfh();
switch(key_xz)
{
case key_0:
if(aj == key_click)
{
key_cnt=0;
key_xz=key_1;
}
else
{
key_return = aj;
}break;
case key_1:
if(aj == key_click)
{
key_xz=key_0;
key_return = key_double;
}
else if(++key_cnt >= 50)
{
key_xz=key_0;
key_return= key_click;
}break;
}
return key_return;
}
void main()
{
u8 aj=0;
TMOD &= 0xF0; //???????
TL0 = 0xCD; //??????
TH0 = 0xD4; //??????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
EA=ET0=1;
while(1)
{
if(flag)
{
flag=0;
aj=key_smg();
switch(aj)
{
case key_click:P2=0X7F;P0=number[1];break;
case key_double:P2=0x7f;P0=number[2];break;
case key_long:P2=0x7f;P0=number[3];break;
default :break;
}
}
}
}
void Timer0Init(void) interrupt 1 //1??@11.0592MHz
{
TL0 = 0xCD; //??????
TH0 = 0xD4; //??????
if(++cnt>=10){cnt=0;flag=1;}
}
|