b1为选择时分秒的个位和十位的选择键;b2为加时键;b3为减时键;b4为完成键(即停止闪烁);
#include<reg52.h>
#define u8 unsigned int
#define u16 unsigned char
#define duan P1
sbit c=P0^0;
sbit b=P0^1;
sbit a=P0^2;
sbit b1=P2^0;
sbit b2=P2^1;
sbit b3=P2^2;
sbit b4=P2^3;
sbit b5=P2^4;
sbit b6=P2^5;
u16 code table[]={0x3f,
0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,
0x67,0x00};
u8 shi=0,fen=0,miao=0,timer=0,i=0,x=0,temp1=0,y=1,z=1;
u8 a1=0,a2=0,a3=0,a4=0,a5=0,a6=0;
void shine()//每隔500ms闪烁一次
{
if(z==1)
{
if(timer<=500&&timer>=0)
{
y=0;
}
else y=1;
}
}
```c
int exchange()//每按一次独立按键向向左移动选择
{
if(b1==0)
{
delay(10);
if(b1==0)
{
temp1=0;
x++;
}
while(!b1);
}
if(x>6)
x-=6;
return x;
}
```c
void display()//动态数码管动态扫描展示
{
i=timer%8;
switch(i)
{
case(0):a=1,b=1,c=1;if(y==0&&x==1)duan=0x00;else duan=table[a1];break;
case(1):a=1,b=1,c=0;if(y==0&&x==2)duan=0x00;else duan=table[a2];break;
case(2):a=1,b=0,c=1;duan=0x40;break;
case(3):a=1,b=0,c=0;if(y==0&&x==3)duan=0x00;else duan=table[a3];break;
case(4):a=0,b=1,c=1;if(y==0&&x==4)duan=0x00;else duan=table[a4];break;
case(5):a=0,b=1,c=0;duan=0x40;break;
case(6):a=0,b=0,c=1;if(y==0&&x==5)duan=0x00;else duan=table[a5];break;
case(7):a=0,b=0,c=0;if(y==0&&x==6)duan=0x00;else duan=table[a6];break;
}
sdelay(10);
duan=0x00;
}
心得:1.用一个变量记录选择的位置;
2.若要在选择时闪烁,用两个变量分别记录是否要闪烁和在哪一位闪烁;
以上为部分部分部分代码,希望与大家一起讨论!