#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
//位选段选
#define we_set PORTA|=BIT(0)//
#define we_clr PORTA&=~BIT(0)//
#define du_set PORTA|=BIT(1)//
#define du_clr PORTA&=~BIT(1)//
//1302端口定义
#define clk_set PORTB|=BIT(0)
#define clk_clr PORTB&=~BIT(0)
#define clk_OUT DDRB|=BIT(0)//
#define io_set PORTB|=BIT(1)//
#define io_clr PORTB&=~BIT(1)//
#define io_OUT DDRB|=BIT(1)//
#define io_IN DDRB&=~BIT(1)//
#define io_r PINB&BIT(1)//
#define rst_set PORTB|=BIT(2)//
#define rst_clr PORTB&=~BIT(2)//
#define rst_OUT DDRB|=BIT(2)//
void write_ds1302_byte(uchar dat);//单字节写
void write_ds1302(uchar add,uchar dat);//多字节写
uchar read_ds1302(uchar add);
uchar const table_we[]={0xDF,0xef,0xf7,0xfb,0xfd,0xfe};
uchar const table_du[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar disp[8];
uchar i;
uchar time_date[7]={12,1,11,23,12,02,02};//年周月日时分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写年月日地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读比写多1
void set_rtc(void);//对时间
void read_rtc(void);//读时间
void time_pros(void);//处理函数
void dispiay(void); //显示函数
void delay(uint xms)//延时函数
{
uint n,m;
for(n=xms;n>0;n--)
for(m=124;m>0;m--);
}
void duanko(void)//端口初始化
{
DDRA=0XFF;
PORTA=0XFF;
DDRC=0XFF;
PORTC=0Xff;
}
void write_ds1302_byte(uchar dat)//单字节写
{
io_OUT;
for(i=0;i<8;i++)
{
clk_clr;
if(dat&0x01)
io_set;
else
io_clr;
clk_set;
clk_clr;
dat=dat>>1;
}
}
void write_ds1302(uchar add,uchar dat)//写多个字节
{
rst_clr;
clk_clr;
rst_set;
write_ds1302_byte(add);//写地址
write_ds1302_byte(dat);//写数据
rst_clr;
//io_set;
//clk_set;
}
uchar read_ds1302(uchar add)//读地址
{
uchar value;
rst_clr;
clk_clr;
rst_set;
write_ds1302_byte(add);//写地址
io_IN;
for(i=0;i<8;i++)
{
value=value>>1;
if(io_r)
value=value|0x80;
clk_set;
clk_clr;
}
rst_clr;
return value;
}
void set_rtc(void)//对时间
{
uchar k;
for(i=0;i<7;i++)
{
k=time_date
/10;
time_date=time_date%10;
time_date=time_date+k*16;
}
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add,time_date);
}
write_ds1302(0x8e,0x80);//加写保护
}
void read_rtc(void)//读出对的时间
{
for(i=0;i<7;i++)
{
time_date=read_ds1302(read_add);
}
}
void time_pros(void)//处理
{
disp[0]=time_date[6]%16;
disp[1]=time_date[6]/16;
disp[2]=time_date[5]%16;
disp[3]=time_date[5]/16;
disp[4]=time_date[4]%16;
disp[5]=time_date[4]/16;
}
void display(void)//显示函数
{
uchar j;
for(j=0;j<6;j++)
{
we_set;
PORTC=table_we[j];
we_clr;
du_set;
PORTC=table_du[disp[j]];
du_clr;
delay(5);
}
}
void main(void)
{
duanko();
clk_OUT;
rst_OUT;
set_rtc();
while(1)
{
read_rtc();//读出对的时间
time_pros();//处理
for(i=0;i<40;i++)
{
display();//显示函数
}
}
}
此帖出自小平头技术问答
一周热门 更多>