📄 12887.c
字号:
#include <reg52.h>
#include <absacc.h>
/* DS12C887 内部专用寄存器宏定义 */
#define SECOND XBYTE[0x0800]
#define MIN XBYTE[0x0802]
#define HOUR XBYTE[0x0804]
#define DAYOFWEEK XBYTE[0x0806]
#define DAYOFMONTH XBYTE[0x0807]
#define MONTH XBYTE[0x0808]
#define YEAR XBYTE[0x0809]
#define REG_A XBYTE[0x080a]
#define REG_B XBYTE[0x080b]
#define REG_C XBYTE[0x080c]
#define REG_D XBYTE[0x080d]
//****** HD7279A 指令 ******
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define SEGON 0xe0
#define CMD_READ 0x15
#define uint unsigned int
#define uchar unsigned char
sbit cs=P2^0 ;
sbit clk=P2^1 ;
sbit dat=P2^2 ;
sbit key=P3^2 ;
uchar buffer[8]={0,0,0,0,0,0,0,0};
uchar keynum,second,min,hour,dayofweek,dayofmonth,month,year;
void init_7279(void);
void init_12887(void);
void long_delay(void);
void short_delay(void);
uchar read7279(uchar command);
void write(uchar, uchar); // 写入到HD7279
uchar receive_byte(void);
void send_byte(uchar);
void settime();
void gettime();
void display();
void main(void)
{ init_12887();
settime();
gettime();
init_7279();
while(1)
{ if(!key)
{keynum=read7279(CMD_READ);}
switch(keynum)
{
case 00:
{buffer[0]=(second%10);
buffer[1]=(second/10);
buffer[2]=min%10;
buffer[3]=min/10;
buffer[4]=hour%10;
buffer[5]=hour/10;
buffer[6]= 0x0f;
buffer[7]=dayofweek;
}break;
case 01:
{
buffer[0]=dayofmonth%10;
buffer[1]=dayofmonth/10;
buffer[2]=month%10;
buffer[3]=month/10;
buffer[4]=year%10;
buffer[5]=year/10;
buffer[6]=0;
buffer[7]=2;
}break;
default:
{ }
}
display();
gettime();
}
}
void init_12887()
{/* 设置DV2、DV1、DV0为010,打开芯片DS12C877内部晶振 */
REG_A = REG_A&0xaf; // DV2=DV0=0
REG_A = REG_A|0x20; // DV1=0
REG_B = REG_B&0x7b; // SET=0,时间数据正常更新;DM=1,10进制数据模式
REG_B = REG_B|0x06; // 寄存器B的24/12位置1,24小时时间模
}
void init_7279()
{ uint i;
for(i=0;i<0x2000;i++)
send_byte(CMD_RESET);
}
void write(uchar cmd,uchar dta)
{
send_byte (cmd);
send_byte (dta);
}
uchar read7279(uchar command)
{send_byte (command);
return(receive_byte());
}
void send_byte(uchar out_byte)
{
uchar i;
cs=0;
long_delay();
for (i=0;i<8;i++)
{
if (out_byte&0x80)
{
dat=1;
}
else
{
dat=0;
}
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2;
}
dat=0;
}
uchar receive_byte(void)
{uchar i,in_byte;
dat=1;
long_delay();
for (i=0;i<8;i++)
{clk=1;
short_delay();
in_byte=in_byte*2;
if(dat)
{in_byte=in_byte|0x01;
}
clk=0;
short_delay();
}
dat=0;
return(in_byte);
}
void long_delay(void)
{
uchar i;
for (i=0;i<0x30;i++);
}
void short_delay(void)
{
uchar i;
for(i=0;i<8;i++);
}
/* 从串行口获取数据函数,数据包括:year1,month1,dayofweek1,
dayofmonth1,hour1,min1。如果获取到正确数据则返回1,否则返回0 */
/* 设置日历和时钟函数 */
void settime()
{
REG_B = REG_B|0x80; // SET=1,芯片DS12C887处于设置状态
SECOND=12;
MIN = 38;
HOUR = 15;
DAYOFWEEK = 2;
DAYOFMONTH = 10;
MONTH = 8;
YEAR = 6;
REG_B = REG_B&0x7f; // SET=0,芯片DS12C887恢复正常数据更新状态
}
/* 获取日历时钟函数 */
void gettime()
{
while ((REG_A&0x80)!=0x00) // 直到UIP=0时,才能读取日历时钟信息 {
{
second=SECOND;
buffer[0]=second%10;
buffer[1]=second/10;
min = MIN ;
buffer[2]=min%10;
buffer[3]=min/10;
hour = HOUR;
buffer[4]=hour%10;
buffer[5]=hour/10;
dayofweek= DAYOFWEEK;
buffer[6]=0x0f;
buffer[7]=dayofweek%10;
dayofmonth = DAYOFMONTH;
month= MONTH;
year = YEAR;
}
}
void display()
{ write(DECODE0,buffer[0]);
write(DECODE0+1,buffer[1]);
write(DECODE0+2,buffer[2]);
write(DECODE0+3,buffer[3]);
write(DECODE0+4,buffer[4]);
write(DECODE0+5,buffer[5]);
write(DECODE0+6,buffer[6]);
write(DECODE0+7,buffer[7]);
write(SEGON ,0x17);
write(SEGON,0x27);
write(SEGON,0x37);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -