📄 12887-1.c
字号:
/***************************************
时钟芯片12887
陈雷
2005--5--28
****************************************/
#include <reg51.h>
/***************************************/
unsigned char xdata *adr_12887;
/***************************************/
sbit CS_12887=P2^7;
sbit WR_12887=P3^6;
sbit RD_12887=P3^7;
sbit key0=P1^1; //设定
sbit key1=P1^2; //增加
sbit key2=P1^3; //减少
sbit P17=P1^7;
sbit load=P3^4;
sbit led1=P1^7;
sbit led2=P1^6;
sbit led3=P1^5;
/*******************************************************************************/
void write(w_sec, w_min,w_hour,w_week,w_day,w_moth,w_yera);
void read();
unsigned char key_press();
void key_con() ;
void write_key( r_sec, r_min, r_hour, r_week, r_day, r_moth, r_year);
void display();
void key_sec();
void key_min();
void key_hour();
/********************************************************************************/
unsigned char r_sec, r_min, r_hour, r_week, r_day, r_moth, r_year;
unsigned char w_sec, w_min, w_hour, w_week, w_day, w_moth, w_year;
unsigned char j;
/***************************************************/
unsigned char code Disbuf[]= {0x03,0x9f,0x25,0x0d,
0x99,0x49,0x41,0x1f,
0x01,0x09,0x11,0xc1,
0x63,0x85,0x61,0x71};
/***************************************************/
void delay()
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
/*****************************************************/
void delay1(unsigned char x)
{
unsigned char j;
while(x--)
{for (j=0;j<125;j++)
{;}
}
}
/*****************************************************/
void initial()
{
int i;
adr_12887=0X7F0B; //写寄存器B
*adr_12887=0x7fa6;
write( w_sec, w_min, w_hour, w_week, w_day, w_moth, w_year); //写时间
adr_12887=0x7f0a; //写寄存器A
*adr_12887=0x20;
adr_12887=0x7f0c; //写寄存器C
*adr_12887=0x70;
adr_12887=0x7f0d; //写寄存器D
i=*adr_12887;
adr_12887=0X7F0B; //写寄存器B
*adr_12887=0x7f26;
}
/***************************************/
void initial_key()
{
int i;
adr_12887=0X7F0B; //写寄存器B
*adr_12887=0x7fa6;
write_key( r_sec, r_min, r_hour, r_week, r_day, r_moth, r_year); //写时间
adr_12887=0x7f0a; //写寄存器A
*adr_12887=0x20;
adr_12887=0x7f0c; //写寄存器C
*adr_12887=0x70;
adr_12887=0x7f0d; //写寄存器D
i=*adr_12887;
adr_12887=0X7F0B; //写寄存器B
*adr_12887=0x7f26;
}
/**************************************/
void write(w_sec,w_min,w_hour,w_week,w_day,w_moth,w_year)
{
adr_12887=0x7f00;
*adr_12887=w_sec; //写秒
adr_12887++;
*adr_12887=0x00; //写秒报警无效
adr_12887++;
*adr_12887=w_min; //写分
adr_12887++;
*adr_12887=0x00; //写分报警无效
adr_12887++;
*adr_12887=w_hour; //写时
adr_12887++;
*adr_12887=0x00; //写时报警无效
adr_12887++;
*adr_12887=w_week; //写星期
adr_12887++;
*adr_12887=w_day; //写日
adr_12887++;
*adr_12887=w_moth; //写月
adr_12887++;
*adr_12887=w_year; //写年
}
/***************************************/
void write_key( r_sec, r_min, r_hour, r_week, r_day, r_moth, r_year)
{
adr_12887=0x7f00;
*adr_12887=r_sec; //写秒
adr_12887++;
*adr_12887=0x00; //写秒报警无效
adr_12887++;
*adr_12887=r_min; //写分
adr_12887++;
*adr_12887=0x00; //写分报警无效
adr_12887++;
*adr_12887=r_hour; //写时
adr_12887++;
*adr_12887=0x00; //写时报警无效
adr_12887++;
*adr_12887=r_week; //写星期
adr_12887++;
*adr_12887=r_day; //写日
adr_12887++;
*adr_12887=r_moth; //写月
adr_12887++;
*adr_12887=r_year; //写年
}
/**************************************/
void read()
{
unsigned char i;
adr_12887=0x7f0a; //读寄存器A
i=*adr_12887;
while(i&0x80==0x80)
{
i=*adr_12887;
}
adr_12887=0x7f00; //读秒
r_sec=*adr_12887;
adr_12887++;
adr_12887++; //读分
r_min=*adr_12887;
adr_12887++;
adr_12887++; //读时
r_hour=*adr_12887;
adr_12887++;
adr_12887++; //读星期
r_week=*adr_12887;
adr_12887++; //读日
r_day=*adr_12887;
adr_12887++; //读月
r_moth=*adr_12887;
adr_12887++; //读年
r_year=*adr_12887;
}
/****************************************/
/*
void wride_alarm()
{
adr_12887=0x01;
*adr_12887=0x09;
adr_12887=0x03;
*adr_12887=0x00;
adr_12887=0x05;
*adr_12887=0x00;
}
*/
/***************************************/
void alarm() interrupt 0
{
int i;
P17=!P17;
delay();
P17=!P17;
delay();
adr_12887=0x7f0c; //写寄存器C
i=*adr_12887;
}
/**************************************/
void key_sec()
{
while(key0==1)
{
led1=!led1;
delay();
if(key1==0)
{r_sec++;
if(r_sec==60)
r_sec=0;
while(key1==0);
}
if(key2==0)
{r_sec--;
if(r_sec==0)
r_sec=59;
while(key2==0);
}
initial_key();
display();
}
}
/**************************************/
void key_min()
{
while(key0==1)
{
led2=!led2;
delay();
if(key1==0)
{r_min++;
if(r_min==60)
r_min=0;
while(key1==0);
}
if(key2==0)
{r_min--;
if(r_min==0)
r_min=59;
while(key2==0);
}
initial_key();
display();
}
}
/**************************************/
void key_hour()
{
while(key0==1)
{
led3=!led3;
delay();
if(key1==0)
{r_hour++;
if(r_hour>=24)
r_hour=0;
while(key1==0);
}
if(key2==0)
{r_hour--;
if(r_hour==0)
r_hour=24;
while(key2==0);
}
initial_key();
display();
}
}
/**************************************/
void key_con()
{
if(key0==0)
{if(j<3)
j++;
else j=0;
}
while(key0==0);
switch(j)
{case 1: key_sec() ; break;
case 2: key_min() ; break;
case 3: key_hour(); break;
}
}
/**************************************/
void alam()
{
P17=!P17;
delay();
P17=!P17;
delay();
P17=!P17;
delay();
P17=!P17;
delay();
P17=!P17;
delay();
}
/****************************************/
void display()
{
SBUF=Disbuf[r_sec%10];while(!TI);TI=0;
SBUF=Disbuf[r_sec/10];while(!TI);TI=0;
SBUF=Disbuf[r_min%10];while(!TI);TI=0;
SBUF=Disbuf[r_min/10];while(!TI);TI=0;
SBUF=Disbuf[r_hour%10];while(!TI);TI=0;
SBUF=Disbuf[r_hour/10];while(!TI);TI=0;
load=0;
load=1;
}
/****************************************/
void main()
{
EA =1;
EX0 =1;
IT0 =1;
// initial();
while(1)
{
read();
display();
// if(r_sec==15)
// alam();
if(key0==0)
key_con();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -