?? 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 + -