#include<reg52.h>
#define unchar unsigned char
#define unint unsigned int
#define uchar unsigned char
#define uint unsigned int
sbit A0=P1^6;
sbit A1=P1^7;
sbit CLK1=P2^4; //数码管锁存
sbit CLK2=P2^5; //
sbit CLK3=P2^6; //光柱高2码位锁存
sbit CLK4=P2^7; //光柱低8位锁存
sbit key=P1^5; //键盘检测位
unsigned int adv;
unchar k=0,kk=0,f=0,k1=0,k2=0,k3=0,t=0; // k是键值 ,f、一项菜单调整值,
unchar code table[]= //8位断码 //k1,k2,k3为按键1,3、4标识位t time0中标识
{ 0x03, //0
0x9f, //1
0x25, //2
0x0d, //3
0x99, //4
0x49, //5
0x41, //6
0x1f, //7
0x01, //8
0x09, //9
0x11, //A 10
0xc1, //b 11
0xe5, //c 12
0x85, //d 13
0x61, //E 14
0x71, //F 15
0xfd //- 16
};
unchar code table1[]= //光柱高码
{
0xff, //灭
0xfe,
0xfc,
0xf8,
0xf0,
0xe0,
0xc0,
0x80,
0x00, //一段全亮
0x00
};
unchar code wei[]={10,0,2,4,3,5,6,7,1}; //数码管位
unchar code wei1[]={9,8,7,6,5,4,3,2,1,0,10}; //光柱位
void disLED(unint a,unint b); //LED声明
void disGZ(unint a); //光柱
void dely(unchar a); //延时
unchar getkey(void); //按键取值
void dealkey(unchar a);
void deal(unchar a);
void disLEDm(unchar a,unchar b);
void tongdao(unchar a);
void main(void) //主函数
{
TMOD=0x09;
TH0=0x00;
TL0=0x00;
IT0=1;
ET0=0;
EX0=1;
EA=1;
A0=0;
A1=0;
TR0=1;
while(1)
{
disLED(adv,adv); //调用显示函数
disGZ(adv); //调用光柱函数
if(k==2) //键盘取值
{
dealkey(k);
k=0;
kk=0;
}
}
}
void disLED(unint a,unint b) //数码管显示函数
{
unchar i;
unchar ma[10]; //8位需要显示值暂存数组
P0=0xff; //关光柱
CLK4=0;
CLK4=1;
CLK3=0;
CLK3=1;
ma[1]=a/1000;
ma[2]=a%1000/100;
ma[3]=a%100/10;
ma[4]=a%10;
ma[5]=b/1000;
ma[6]=b%1000/100;
ma[7]=b%100/10;
ma[8]=b%10;
for(i=1;i<9;i++) //显示
{
P0=table[ma[i]]; //通过table取显示码
CLK1=0; //锁存
CLK1=1;
P2=wei[i]; //段打开
dely(8); //延时
if(P2<4) //按键检测
{
kk=getkey();
if(kk!=0)
k=kk; //有键按下,标识一下
}
P2=wei[0]; //段关
}
}
void disGZ(unint a) //光柱显示
{
unchar i,j,t;
P0=0xff; //数码管段码关
CLK1=0;
CLK1=1;
CLK3=0;
CLK3=1;
j=a/1000; //光柱低位全亮
for(i=0;i<j;i++)
{
P0=0x00;
CLK4=0;
CLK4=1;
CLK3=0;
CLK3=1;
P2=wei1[i];
dely(10);
P2=wei1[10];
}
t=a%1000/100; //高位处理
/* switch(a)
{
case 1:P0=table1[a];CLK4=0;CLK4=1;P0=0xff;CLK3=0;CLK3=1;P2=wei1[j];dely(1);P2=wei1[10];break;
case 2:P0=table1[a];CLK4=0;CLK4=1;P0=0xff;CLK3=0;CLK3=1;P2=wei1[j];dely(1);P2=wei1[10];break;
case 3:P0=table1[a];CLK4=0;CLK4=1;P0=0xff;CLK3=0;CLK3=1;P2=wei1[j];dely(1);P2=wei1[10];break;
case 4:P0=table1[a];CLK4=0;CLK4=1;P0=0xff;CLK3=0;CLK3=1;P2=wei1[j];dely(1);P2=wei1[10];break;
case 5:P0=table1[a];CLK4=0;CLK4=1;P0=0xff;CLK3=0;CLK3=1;P2=wei1[j];dely(1);P2=wei1[10];break;
case 6:P0=table1[a];CLK4=0;CLK4=1;P0=0xff;CLK3=0;CLK3=1;P2=wei1[j];dely(1);P2=wei1[10];break;
case 7:P0=table1[a];CLK4=0;CLK4=1;P0=0xff;CLK3=0;CLK3=1;P2=wei1[j];dely(1);P2=wei1[10];break;
case 8:P0=table1[a];CLK4=0;CLK4=1;P0=0xff;CLK3=0;CLK3=1;P2=wei1[j];dely(1);P2=wei1[10];break;
case 9:P0=table1[a];CLK4=0;CLK4=1;P0=0xfe;CLK3=0;CLK3=1;P2=wei1[j];dely(1);P2=wei1[10];break;
default: break;
} */
while(t)
{
if(t!=9)
{
for(i=1;i<9;i++)
{
P0=table1[t];
CLK4=0;
CLK4=1;
P0=0xff;
CLK3=0;
CLK3=1;
P2=wei1[j];
dely(0);
P2=wei1[10];
}
}
else
{
P0=table1[t];
CLK4=0;
CLK4=1;
P0=0xfe;
CLK3=0;
CLK3=1;
P2=wei1[j];
dely(10);
P2=wei1[10];
}
break;
}
}
unchar getkey(void) //按键取值函数
{
unchar i=0,j=0;
P0=0xff; //显示关掉
CLK1=0;
CLK1=1;
CLK3=0;
CLK3=1;
CLK4=0;
CLK4=1;
for(;i<4;i++) //开始测试按键
{
P2=0x0f;
P2=P2&i;
if(key==1)
j=i+1;
}
return(j); //返回键值
}
void dealkey(unchar a) //按键处理
{
dely(300); //延时
kk=getkey(); //判断键送开
if(kk==0)
while(k1!=1) //进入一级菜单
{
kk=getkey(); //菜单内延时
if(kk==0)
switch(a) //菜单
{
case 1: k1=1;break; //退出
case 2: k2=1;break; //确认
case 3: f+=1;break; //调整
case 4: f-=1;break; //调整
default:break;
}
a=getkey(); //取按键
disLEDm(a+10,f); //显示
dely(40);
if(k2==1) //确认进入下一级
{
deal(f);
k2=0;
}
}
k1=0;
k3=0; //退出位清零
f=0; //项选择
}
void dely(unchar a) //延时函数
{
unchar i;
for(i=0;i<a;i++)
for(i=0;i<a;i++)
;
}
void deal(unchar a)
{
unchar s=0;
kk=getkey();
if(kk==0)
switch(a)
{ //项一
case 1: dely(40);kk=getkey();
if(kk==0)
while(k1!=1)
{
kk=getkey();
if(kk==0)
switch(s)
{
case 1:k1=1; break; //k1=1; break;
case 2:k2=2;t=0; TR0=0;break; //f=0;TR0=0; break;
case 3:k3=1;t=1; TR0=1;break; //f=1;TR0=1; break;
case 4:k3=2;t=2; TR0=1;break; //f=2;TR0=1; break;
default:break;
}
s=getkey();
disLEDm(1,k3);
dely(40);
}
k1=0;s=0; break;
case 2: dely(40);kk=getkey(); //项二
if(kk==0)
while(k1!=1)
{
kk=getkey();
if(kk==0)
switch(s)
{
case 1: k1=1; break; //k1=1; break;
case 2: k2=2;break; //f=0;TR0=0; break;
case 3: k3+=1;break; //f=1;TR0=1; break;
case 4: k3-=1;break; //f=2;TR0=1; break;
default:break;
}
s=getkey();
disLEDm(2,k3);
dely(40);
if(k2==2)
{
tongdao(k3-1);
k2=0;
}
}
k1=0;s=0;break;
case 3: dely(40);kk=getkey(); //项三
if(kk==0)
while(k1!=1)
{
kk=getkey();
if(kk==0)
switch(s)
{
case 1:k1=1; break; //k1=1; break;
case 2:k2=2;t=0; TR0=0;break; //f=0;T