📄 c21-2.c
字号:
#include <REG51.H>
#include <intrins.H>
#define uchar unsigned char
#define uint unsigned int
#define STATUS_KEY 0xdf
#define INC_KEY 0xfb
#define DEC_KEY 0xf7
#define OK_KEY 0xef
#define ON 0
#define OFF 1
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ACT[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
sbit SDA=P3^7;
sbit SCL=P3^6;
sbit OUT=P1^0;
uchar cnt1,cnt2,sec,min,hour,status;
uchar set1_m,set1_h,set2_m,set2_h;
uchar bdata com_data;
sbit mos_bit=com_data^7;
sbit low_bit=com_data^0;
bit set1_flag,set2_flag;
//==============================================================================
void pout(void);
uchar scan_key(void);
uchar rd_2401(char a);
void wr_2401(char a,uchar b);
void ic_delay(uint n);
void delay(uint k);
//==============================================================================
void initial(void)
{
uchar rd_val;
rd_val=rd_2401(100);
if(rd_val==88)
{
set1_m=rd_2401(80);ic_delay(250);
set1_h=rd_2401(81);ic_delay(250);
set2_m=rd_2401(90);ic_delay(250);
set2_h=rd_2401(90);ic_delay(250);
set1_flag=rd_2401(70);ic_delay(250);
set2_flag=rd_2401(71);ic_delay(250);
}
TMOD=0x11;
TH0=-(50000/256);
TL0=-(50000%256);
TR0=1;ET0=1;
TH1=-(1000/256);
TH1=-(1000%256);
TR1=1;ET1=1;EA=1;
}
//===============================================================================
void main(void)
{
uchar key_val;
initial();
for(;;)
{
pout();
key_val=scan_key();
if(key_val==STATUS_KEY)
{
status++;
if(status==5)
{
status=0;
EA=0;
wr_2401(80,set1_m);ic_delay(250);
wr_2401(81,set1_h);ic_delay(250);
wr_2401(90,set2_m);ic_delay(250);
wr_2401(91,set2_h);ic_delay(250);
wr_2401(70,set1_flag);ic_delay(250);
wr_2401(71,set2_flag);ic_delay(250);
wr_2401(100,88);ic_delay(250);
EA=1;
}
delay(300);
}
/********************************************************************************/
if(key_val==INC_KEY)
{
switch(status)
{
case 1:if(set1_m<59)set1_m++;delay(300);break;
case 2:if(set1_h<23)set1_h++;delay(300);break;
case 3:if(set2_m<59)set2_m++;delay(300);break;
case 4:if(set2_h<23)set2_h++;delay(300);break;
default:break;
}
}
/********************************************************************************/
if(key_val==DEC_KEY)
{
switch(status)
{
case 1:if(set1_m>0)set1_m--;delay(300);break;
case 2:if(set1_h>0)set1_h--;delay(300);break;
case 3:if(set2_m>0)set2_m--;delay(300);break;
case 4:if(set2_h>0)set2_h--;delay(300);break;
default:break;
}
}
/********************************************************************************/
if(key_val==OK_KEY)
{
if((status==1)||(status==2))set1_flag=~set1_flag;delay(300);
if((status==3)||(status==4))set2_flag=~set2_flag;delay(300);
}
}
}
//================================================================================
uchar scan_key(void)
{
uchar temp;
P3=0xff;
temp=P3;
if(temp!=0xff)
{
delay(30);
temp=P3;
if(temp!=0xff)
return temp;
}
return 0;
}
//=================================================================================
void pout(void)
{
if(set1_flag)
{
if((min==set1_m)&&(hour==set1_h))OUT=ON;
else OUT=OFF;
}
if(set2_flag)
{
if((min==set2_m)&&(hour==set2_h))OUT=ON;
else OUT=OFF;
}
}
//=================================================================================
void serve1(void) interrupt 1
{
TH0=-(50000/256);
TL0=-(50000%256);
cnt1++;
if(cnt1>=20){sec++;cnt1=0;}
if(sec>=60){min++;sec=0;}
if(min>=60){hour++;min=0;}
if(hour>=24)hour=0;
}
//================================================================================
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}
}
}
//=================================================================================
void serve_2(void) interrupt 3
{
static bit bit_flag;
TH1=-(1000/256);
TL1=-(1000%256);
cnt2++;
if(status==0){if(cnt2>5)cnt2=0;}
else {if(cnt2>29)cnt2=0;}
if(status==0)
{
switch(cnt2)
{
case 0:P0=SEG7[sec%10];P2=ACT[0];break;
case 1:P0=SEG7[sec/10];P2=ACT[1];break;
case 2:P0=SEG7[min%10];P2=ACT[2];break;
case 3:P0=SEG7[min/10];P2=ACT[3];break;
case 4:P0=SEG7[hour%10];P2=ACT[4];break;
case 5:P0=SEG7[hour/10];P2=ACT[5];break;
default:break;
}
}
/**********************************************************************************/
if(status==1)
{
switch(cnt2)
{
case 0:P0=SEG7[status];P2=ACT[0];break;
case 1:if(set1_flag)P0=0x01;
else P0=0x00;P2=ACT[1];break;
case 2:P0=SEG7[set1_m%10];P2=ACT[2];break;
case 3:P0=SEG7[set1_m/10];P2=ACT[3];break;
case 4:P0=SEG7[set1_h%10];P2=ACT[4];break;
case 5:P0=SEG7[set1_h/10];P2=ACT[5];break;
default:if(bit_flag){P0=SEG7[set1_m%10];P2=ACT[2];bit_flag=~bit_flag;}
else {P0=SEG7[set1_m/10];P2=ACT[3];bit_flag=~bit_flag;}break;
}
}
/**********************************************************************************/
if(status==2)
{
switch(cnt2)
{
case 0:P0=SEG7[status];P2=ACT[0];break;
case 1:if(set1_flag)P0=0x01;
else P0=0x00;P2=ACT[1];break;
case 2:P0=SEG7[set1_m%10];P2=ACT[2];break;
case 3:P0=SEG7[set1_m/10];P2=ACT[3];break;
case 4:P0=SEG7[set1_h%10];P2=ACT[4];break;
case 5:P0=SEG7[set1_h/10];P2=ACT[5];break;
default:if(bit_flag){P0=SEG7[set1_h%10];P2=ACT[4];bit_flag=~bit_flag;}
else {P0=SEG7[set1_h/10];P2=ACT[5];bit_flag=~bit_flag;}break;
}
}
/**********************************************************************************/
if(status==3)
{
switch(cnt2)
{
case 0:P0=SEG7[status];P2=ACT[0];break;
case 1:if(set2_flag)P0=0x01;
else P0=0x00;P2=ACT[1];break;
case 2:P0=SEG7[set2_m%10];P2=ACT[2];break;
case 3:P0=SEG7[set2_m/10];P2=ACT[3];break;
case 4:P0=SEG7[set2_h%10];P2=ACT[4];break;
case 5:P0=SEG7[set2_h/10];P2=ACT[5];break;
default:if(bit_flag){P0=SEG7[set2_m%10];P2=ACT[2];bit_flag=~bit_flag;}
else {P0=SEG7[set2_m/10];P2=ACT[3];bit_flag=~bit_flag;}break;
}
}
/*********************************************************************************/
if(status==4)
{
switch(cnt2)
{
case 0:P0=SEG7[status];P2=ACT[0];break;
case 1:if(set2_flag)P0=0x01;
else P0=0x00;P2=ACT[1];break;
case 2:P0=SEG7[set2_m%10];P2=ACT[2];break;
case 3:P0=SEG7[set2_m/10];P2=ACT[3];break;
case 4:P0=SEG7[set2_h%10];P2=ACT[4];break;
case 5:P0=SEG7[set2_h/10];P2=ACT[5];break;
default:if(bit_flag){P0=SEG7[set2_h%10];P2=ACT[4];bit_flag=~bit_flag;}
else {P0=SEG7[set2_h/10];P2=ACT[5];bit_flag=~bit_flag;}break;
}
}
}
//================================================================================
void start(void)
{
SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//================================================================================
void stop(void)
{
SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//================================================================================
void ack(void)
{
SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//================================================================================
void shift8(uchar a)
{
uchar data i;
com_data=a;
for(i=0;i<8;i++)
{
SDA=mos_bit;
SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
com_data=com_data*2;
}
}
//================================================================================
uchar rd_2401(char a)
{
uchar data i,command;
SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
start();
command=160;
shift8(command);
ack();
shift8(a);
ack();
start();
command=161;
shift8(command);
ack();
SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
for(i=0;i<8;i++)
{
com_data=com_data*2;
SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
low_bit=SDA;
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
stop();
return com_data;
}
//=================================================================================
void wr_2401(char a,uchar b)
{
uchar data command=160;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
start();
shift8(command);
ack();
shift8(a);
ack();
shift8(b);
ack();
stop();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//=================================================================================
void ic_delay(uint n)
{
uint i;
for(i=0;i<n;i++)
{;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -