51单片机实现电子表的功能
废话不多说
代码如下
#include "reg52.h" //??????
typedef unsigned int u16; //??????????
typedef unsigned char u8; //???????????
#define GPIO_KEY P1
#define led P2
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
sbit beep=P1^5;
u8 code lzl[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F
u8 wei[8];
u8 weil[8];
u8 ssec,sec,min,hour;
u8 a_ssec,a_sec,a_min,a_hour;
u8 model=0; //????????
u8 sign=0; //?????????
u8 secl=50; //??????
u8 minl=12;
u8 hourl=6;
u8 a_secl=0; //??????
u8 a_minl=0;
u8 a_hourl=0;
u8 KeyValue;
/******************************
* ????
*******************************/
void delay(u16 i)
{
while(i--);
}
/******************************
* ???0?????
*******************************/
void Time0_Init()
{
TMOD|=0x01; //???????,????1
TH0=0xd8; //???????,??10ms
TL0=0xf0;
ET0=1; //?????0??
EA=1; //?????
TR0=1; //???????
}
/******************************
* ??????
*******************************/
void display()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //??,????????,
{
case(0):
LSA=1;LSB=1;LSC=1; break;
case(1):
LSA=0;LSB=1;LSC=1; break;
case(2):
LSA=1;LSB=0;LSC=1; break;
case(3):
LSA=0;LSB=0;LSC=1; break;
case(4):
LSA=1;LSB=1;LSC=0; break;
case(5):
LSA=0;LSB=1;LSC=0; break;
case(6):
LSA=1;LSB=0;LSC=0; break;
case(7):
LSA=0;LSB=0;LSC=0; break;
}
P0=wei[i]; //????
delay(100); //????????
P0=0x00;
}
}
void displayl()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //??,????????,
{
case(0):
LSA=1;LSB=1;LSC=1; break;
case(1):
LSA=0;LSB=1;LSC=1; break;
case(2):
LSA=1;LSB=0;LSC=1; break;
case(3):
LSA=0;LSB=0;LSC=1; break;
case(4):
LSA=1;LSB=1;LSC=0; break;
case(5):
LSA=0;LSB=1;LSC=0; break;
case(6):
LSA=1;LSB=0;LSC=0; break;
case(7):
LSA=0;LSB=0;LSC=0; break;
}
P0=weil[i]; //????
delay(100); //????????
P0=0x00;
}
}
/******************************
* ???????
*******************************/
void show()
{
switch(model)
{
case 0:
{
wei[2]=lzl[hour/10];
if(sign%2==0)
wei[3]=lzl[hour%10]|0x80;
else
wei[3]=lzl[hour%10];
wei[4]=lzl[min/10];
wei[5]=lzl[min%10]|0x80;
wei[6]=lzl[sec/10];
wei[7]=lzl[sec%10];
break;
}
case 1:
{
if(sign%2==0)
{
wei[2]=lzl[hour/10];
if(sign%2==0)
wei[3]=lzl[hour%10]|0x80;
else
wei[3]=lzl[hour%10];
wei[4]=lzl[min/10];
wei[5]=lzl[min%10]|0x80;
wei[6]=0x00;
wei[7]=0x00;
}
else
{
wei[2]=lzl[hour/10];
if(sign%2==0)
wei[3]=lzl[hour%10]|0x80;
else
wei[3]=lzl[hour%10];
wei[4]=lzl[min/10];
wei[5]=lzl[min%10]|0x80;
wei[6]=lzl[sec/10];
wei[7]=lzl[sec%10];
}
break;
}
case 2:
{
if(sign%2==0)
{
wei[2]=lzl[hour/10];
if(sign%2==0)
wei[3]=lzl[hour%10]|0x80;
else
wei[3]=lzl[hour%10];
wei[4]=0x00;
wei[5]=0x00|0x80;
wei[6]=lzl[sec/10];
wei[7]=lzl[sec%10];
}
else
{
wei[2]=lzl[hour/10];
if(sign%2==0)
wei[3]=lzl[hour%10]|0x80;
else
wei[3]=lzl[hour%10];
wei[4]=lzl[min/10];
wei[5]=lzl[min%10]|0x80;
wei[6]=lzl[sec/10];
wei[7]=lzl[sec%10];
}
}
break;
case 3:
{
if(sign%2==0)
{
wei[2]=0x00;
if(sign%2==0)
wei[3]=0x00|0x80;
else
wei[3]=0x00;
wei[4]=lzl[min/10];
wei[5]=lzl[min%10]|0x80;
wei[6]=lzl[sec/10];
wei[7]=lzl[sec%10];
}
else
{
wei[2]=lzl[hour/10];
if(sign%2==0)
wei[3]=lzl[hour%10]|0x80;
else
wei[3]=lzl[hour%10];
wei[4]=lzl[min/10];
wei[5]=lzl[min%10]|0x80;
wei[6]=lzl[sec/10];
wei[7]=lzl[sec%10];
}
break;
}
}
}
///////////////////////////////////
void showl()
{
switch(model)
{
case 0:
{
weil[2]=lzl[a_hour/10];
if(sign%2==0)
weil[3]=lzl[a_hour%10]|0x80;
else
weil[3]=lzl[a_hour%10];
weil[4]=lzl[a_min/10];
weil[5]=lzl[a_min%10]|0x80;
weil[6]=lzl[a_sec/10];
weil[7]=lzl[a_sec%10];
break;
}
case 1:
{
if(sign%2==0)
{
weil[2]=lzl[a_hour/10];
if(sign%2==0)
weil[3]=lzl[a_hour%10]|0x80;
else
weil[3]=lzl[a_hour%10];
weil[4]=lzl[a_min/10];
weil[5]=lzl[a_min%10]|0x80;
weil[6]=0x00;
weil[7]=0x00;
}
else
{
weil[2]=lzl[a_hour/10];
if(sign%2==0)
weil[3]=lzl[a_hour%10]|0x80;
else
weil[3]=lzl[a_hour%10];
weil[4]=lzl[a_min/10];
weil[5]=lzl[a_min%10]|0x80;
weil[6]=lzl[a_sec/10];
weil[7]=lzl[a_sec%10];
}
break;
}
case 2:
{
if(sign%2==0)
{
weil[2]=lzl[a_hour/10];
if(sign%2==0)
weil[3]=lzl[a_hour%10]|0x80;
else
weil[3]=lzl[a_hour%10];
weil[4]=0x00;
weil[5]=0x00|0x80;
weil[6]=lzl[a_sec/10];
weil[7]=lzl[a_sec%10];
}
else
{
weil[2]=lzl[a_hour/10];
if(sign%2==0)
weil[3]=lzl[a_hour%10]|0x80;
else
weil[3]=lzl[a_hour%10];
weil[4]=lzl[a_min/10];
weil[5]=lzl[a_min%10]|0x80;
weil[6]=lzl[a_sec/10];
weil[7]=lzl[a_sec%10];
}
}
break;
case 3:
{
if(sign%2==0)
{
weil[2]=0x00;
if(sign%2==0)
weil[3]=0x00|0x80;
else
weil[3]=0x00;
weil[4]=lzl[a_min/10];
weil[5]=lzl[a_min%10]|0x80;
weil[6]=lzl[a_sec/10];
weil[7]=lzl[a_sec%10];
}
else
{
weil[2]=lzl[a_hour/10];
if(sign%2==0)
weil[3]=lzl[a_hour%10]|0x80;
else
weil[3]=lzl[a_hour%10];
weil[4]=lzl[a_min/10];
weil[5]=lzl[a_min%10]|0x80;
weil[6]=lzl[a_sec/10];
weil[7]=lzl[a_sec%10];
}
break;
}
}
}
/******************************
* ???????
*******************************/
unsigned char key_scan()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
model++;
while(!k1);
if(model==4)
model=0;
}
}
if(k2==0)
{
delay(1000);
if(k2==0)
{
if(model==1) //???
{
sec++; if(sec>=60)sec=0;
}
else if(model==2) //????
{
min++; if(min>=60)min=0;
}
else if(model==3) //????
{
hour++; if(hour>=24)hour=0;
}
while(!k2);
}
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
if(model==1) //???
{
sec--; if(sec==255)sec=59;
}
else if(model==2) //????
{
min--; if(min==255)min=59;
}
else if(model==3) //????
{
hour--; if(hour==255)hour=23;
}
while(!k3);
}
}
if(k4==0)
{
delay(1000);
if(k4==0)
model=0;
while(!k4);
return 1;
}
///////////////////
return 0;
}
/////////////////////////
/******************************
* ???????
*******************************/
void alarm()
{
u8 data1;
data1 =0xfe;
if(hour==a_hour && min==a_min && sec==a_sec)
{
while(1)
{
data1 = data1<<1|0x01;
if(data1==0xff)data1=0xfe;
beep=~beep;
delay(100);
led = data1;
delay(1000);
if(k4==0)
break;
}
}
}
///////////////////////////
void KeyDownn(void)
{unsigned char ook;
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//????????
{
delay(1000);//??10ms????
if(GPIO_KEY!=0x0f)//??????????
{
//???
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//???
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //????????
{
delay(1000);
a++;
}
while(1){
displayl();
showl();
///////////////////
if(k1==0)
{
delay(1000);
if(k1==0)
{
model++;
while(!k1);
if(model==4)
model=0;
}
}
if(k2==0)
{
delay(1000);
if(k2==0)
{
if(model==1) //???
{
a_sec++; if(a_sec>=60)a_sec=0;
}
else if(model==2) //????
{
a_min++; if(a_min>=60)a_min=0;
}
else if(model==3) //????
{
a_hour++; if(a_hour>=24)a_hour=0;
}
while(!k2);
}
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
if(model==1) //???
{
a_sec--; if(a_sec==255)a_sec=59;
}
else if(model==2) //????
{
a_min--; if(a_min==255)a_min=59;
}
else if(model==3) //????
{
a_hour--; if(a_hour==255)a_hour=23;
}
while(!k3);
}
}
if(k4==0)
{
delay(1000);
if(k4==0)
model=0;
while(!k4);
break;}
////////////////////
}
}
}
}
//////////////////////////
/******************************
* ???
*******************************/
void main()
{
P0=0;
Time0_Init();
// Time1_Init();
// Int0_Init();
while(1)
{
display();
show();
key_scan();
KeyDownn();
alarm();
}
}
/******************************
* ???0????
*******************************/
void Time0() interrupt 1
{
TH0=0Xd8; //???,??10ms
TL0=0Xf0;
ssec++;
if(ssec>=100) //1s
{
ssec=0;
sec++;
sign++;
if(sign>=100)
sign=0;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=25)
hour=0;
}
}
}
}
学的数电模电都是假的,我压根全部忘记了
我是初学,嘿嘿😁