#include < reg51.h >
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar layer = 0;
uchar sign = 0;
uchar enable = 4;
uchar enabledata;
struct jigou{
uchar a;
uchar b;
uchar c;
uchar d;
}parameter[] = {{0,0,0,0},{1,1,1,1},{2,2,2,2},{3,3,3,3},{4,4,4,4},{5,5,5,5},{6,6,6,6}};
uchar LEDData[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xff};
uchar data1[4] = {0,1,2,3};
uchar dispdata[4] = {0,1,2,3};
void delay(uint ms)
{
uchar k;
while(ms--)
{
for( k = 0; k < 120; k++ );
}
}
void addparameter( uchar a )
{
switch(a)
{
case 0:
enabledata =++ parameter[sign].a;
break;
case 1:
enabledata =++ parameter[sign].b;
break;
case 2:
enabledata =++ parameter[sign].c;
break;
case 3:
enabledata =++ parameter[sign].d;
break;
default:
break;
}
}
void subparameter( uchar a ) //?layer=2?,?DOWNKEY???,???????
{
switch(a)
{
case 0:
enabledata =-- parameter[sign].a;
break;
case 1:
enabledata =-- parameter[sign].b;
break;
case 2:
enabledata =-- parameter[sign].c;
break;
case 3:
enabledata =-- parameter[sign].d;
break;
default:
break;
}
}
void copymenu() //?????? ,??esckey?
{
dispdata[0] = sign;
dispdata[1] = 10;
dispdata[2] = 10;
dispdata[3] = 10;
enabledata = sign; //??????????
}
void copy(void) //????????
{
dispdata[0] = parameter[sign].a;
dispdata[1] = parameter[sign].b;
dispdata[2] = parameter[sign].c;
dispdata[3] = parameter[sign].d;
enabledata = dispdata[enable]; //?????????
}
void copyfre(void) //???????,??????????
{
dispdata[0] = data1[0];
dispdata[1] = data1[1];
dispdata[2] = data1[2];
dispdata[3] = data1[3];
}
void esckey() //???????
{
if( layer == 0||layer == 2 ) //?????0?2?,???1layer
{
enable = 0;
layer = 1;
copymenu();
return;
}
if( layer == 1 ) //?layer?1??,??????????
{
layer=0;
enable=4;
copyfre();
}
if( layer > 1 ) //?????2?,?????????
{
layer = 1;
enable = 0;
copymenu();
}
}
void upkey() //upkey????
{
if( layer == 0 ) //??0?,?????
return ; //??1?,????1
if( layer == 1&&sign < 6 )
{
++sign;
copymenu( );
return;
}
if( layer == 2&&dispdata[enable] <9 ) //?????????,???????9,??????1
{
addparameter(enable );
copy();
}
}
void downkey()
{
if ( layer == 0 )
return;
if( layer == 1&&0 < sign )
{
--sign;
copymenu();
}
if( layer == 2&&0<dispdata[enable]&&dispdata[enable] != 10) //?????????,???????0
{
subparameter( enable );
copy();
}
}
void enterkey() //dnterkey????
{
if(layer == 0)
return; //?0?,??
if ( layer==1 ) //?1?,????????,???????
{
copy();
enable = 3;
layer = 2;
return;
}
if ( layer == 2 ) //???????
{
if(enable == 0)
{
enable = 3;
copy();
return;
}
--enable;
copy();
}
}
void scankey(void) //??????
{
uint keyvalue = P2&0x0f;
switch(~keyvalue&0x0f)
{
case 1: //?????
esckey();
break;
case 2:
upkey();
break;
case 4:
downkey();
break;
case 8:
enterkey();
break;
}
}
void keydown(void) //????????
{
P2 = 0xff;
if( P2 != 0xff )
{
scankey();
}
while ( P2 != 0xff) ;
}
void disp() //?????,????? 0-3???,????
{ uchar m,i;
uint left = 119; //???????0b00010001,????????????????!
enabledata = dispdata[enable];
for( i = 0;1;i = ~i )
{
left = 119;
if( enable != 4 )
{
dispdata[enable] = enabledata;
if( i ) //????????????
dispdata[enable] = 10;
}
for( m = 0;m <= 119;m++ )
{
left = _crol_(left,1); //????(??????)
P1 = (left&0x0f);
P0 = LEDData[dispdata[m%4]];
keydown();
delay(3);
P0 = 0xff;
}
}
}
main()
{
while(1)
{
disp();
}
}
|