|
# include <reg52.h>
# define uchar unsigned char
# define uint unsigned int
sbit P_HC595_SER = P2^7; //pin 14 SER data input
sbit P_HC595_RCLK = P2^5; //pin 12 RCLk store (latch) clock
sbit P_HC595_SRCLK = P2^6; //pin 11 SRCLK Shift data clock
sbit rst = P1^0;
sbit io = P1^1;
sbit sclk = P1^2;
//uchar disp[8];
uchar code t_display[]={
// 0 1 2 3 4 5 6 7 8 9 //
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0x40}; // 斷選
uchar code wei[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; // 位選
void Send_595(uchar dat);
void init();
void write_byte(uchar date);
uchar read_byte();
void write_ds1302(uchar add, uchar date);
uchar read_ds1302(uchar add);
void set_ds1302();
void display();
void write_sfm(uchar, uchar);
void delay(uint z);
uchar shi1,shi2,fen1,fen2,miao1,miao2, miao, shi, fen;
void main()
{
init();
set_ds1302();
while(1)
{
display();
//delay(5);
}
}
void Send_595(uchar dat)
{
uint i;
for(i=0; i<8; i++)
{
if(dat & 0x80) P_HC595_SER = 1;
else P_HC595_SER = 0;
P_HC595_SRCLK = 0;
P_HC595_SRCLK = 1;
dat = dat << 1;
}
}
/***** 數(shù)碼管初始化 ***/
void init()
{
Send_595(0x00);
Send_595(0x00);
P_HC595_RCLK = 0;
P_HC595_RCLK = 1;
rst = 0;
sclk = 0;
}
/***** DS1302 寫一個(gè)字節(jié)*****/
void write_byte(uchar date)
{
uchar i, temp;
temp = date;
for(i=0; i<8; i++)
{
if((temp&0x01) == 1)
io = 1;
else
io =0;
sclk = 0;
sclk = 1;
temp >>= 1;
}
}
/***** DS1302 讀一個(gè)字節(jié)******/
uchar read_byte()
{
uchar i, temp;
for(i=0; i<8; i++)
{
temp >>= 1;
if(io == 1)
temp |= 0x01;
sclk = 1;
sclk =0;
}
return temp;
}
/****** 特定位置寫 ****/
void write_ds1302(uchar add, uchar date)
{
rst = 0;
sclk = 0;
rst =1;
write_byte(add);
write_byte(date);
sclk = 1;
rst = 0;
}
/**** 特定位置讀 ***/
uchar read_ds1302(uchar add)
{
uchar date;
rst = 0;
sclk =0;
rst = 1;
write_byte(add);
date = read_byte();
sclk = 1;
rst = 0;
return date;
}
/***** DS1302 初始化 **** */
void set_ds1302()
{
write_ds1302(0x8e, 0x00);
write_ds1302(0x80, 0x55);
write_ds1302(0x82, 0x55);
write_ds1302(0x84, 0x11);
write_ds1302(0x8e, 0x80);
}
/***** 在數(shù)碼管顯示 ***** /
void display()
{
uchar d;
write_ds1302(0x8e, 0x00);
d = read_ds1302(0x81);
miao = d;
write_sfm(6, miao);
Send_595(wei[2]);
Send_595(0x40);
P_HC595_RCLK = 0;
P_HC595_RCLK = 1;
delay(2);
d = read_ds1302(0x83);
fen = d;
write_sfm(3, fen);
Send_595(wei[5]);
Send_595(0x40);
P_HC595_RCLK = 0;
P_HC595_RCLK = 1;
delay(2);
d = read_ds1302(0x85);
shi = d;
write_sfm(0, shi);
write_ds1302(0x8e, 0x80);
}
void delay(uint z)
{
uint x, y;
for(x=z; x>0; x--)
for(y=110; y>0; y--);
}
/******* 時(shí)分秒 分離個(gè),十位 ***/
void write_sfm(uchar add, uchar date)
{
uchar shi, ge;
shi = date/10;
ge = date%10;
Send_595(wei[add]);
Send_595(t_display[shi]);
P_HC595_RCLK = 0;
P_HC595_RCLK = 1;
delay(2);
Send_595(wei[add+1]);
Send_595(t_display[ge]);
P_HC595_RCLK = 0;
P_HC595_RCLK = 1;
delay(2);
}
|
|