📄 1302.c
字号:
#include <iom16v.h>
#include <macros.h>
//#define ds1302_rst PC0
//#define ds1302_io PC1
//#define ds1302_sclk PC6
#define set_ds1302_rst_ddr() DDRC|=0x01
#define set_ds1302_rst() PORTC|=0x01
#define clr_ds1302_rst() PORTC&=~0x01
#define set_ds1302_io_ddr() DDRC|=0x80
#define set_ds1302_io() PORTC|=0x80
#define clr_ds1302_io() PORTC&=~0x80
#define clr_ds1302_io_ddr() DDRC&=~0x80
#define in_ds1302_io() PINC&0x80
#define set_ds1302_sclk_ddr() DDRC|=0x40
#define set_ds1302_sclk() PORTC|=0x40
#define clr_ds1302_sclk() PORTC&=~0x40
#define ds1302_sec_reg 0x80 //宏定义
#define ds1302_min_reg 0x82
#define ds1302_hr_reg 0x84
#define ds1302_date_reg 0x86
#define ds1302_month_reg 0x88
#define ds1302_day_reg 0x8a
#define ds1302_year_reg 0x8c
#define ds1302_control_reg 0x8e
#define ds1302_charger_reg 0x90
#define ds1302_clkburst_reg 0xbe
#define uchar unsigned char
#define uint unsigned int
#define clk0 PORTB|=0x02//时钟宏定义port2接clk
#define clk1 PORTB&=~0x02
#define data1 PORTB|=0x01//数字宏定义port1接data
#define data0 PORTB&=~0x01
uchar table[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//数字编码
uchar table1[10]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};//带点编码
uchar pata[4]={0,0,0,0};//显存
uchar year,month,day,week,hour,minute,second;
void delay(uint n)//10us延时函数
{
uint i,j;
for(i=0;i<n;i++)
{
;
//for(j=0;j<1000;j++){;}
}
}
void delay_ms(uint n)//10us延时函数
{
uint i,j;
for(i=0;i<n;i++)
{
for(j=0;j<1000;j++){;}
}
}
void neirong1(int n)//此法优于上面的列表法
{
uint ge,shi,bai,qian;
ge=n%10;//取n的各位个位
shi=n/10%10;//十位
bai=n/100%10;//百位
qian=n/1000;//千位
pata[0]=table[ge];//数字查表为该字符编码
pata[1]=table[shi];
pata[2]=table[bai];
pata[3]=table[qian];
}
void display(uchar p[]) //数字显示程序...不含显示小数点且不累集
{
uint i,j;
for(j=0;j<4;j++)
{for(i=0;i<8;i++)//八位全部显示完毕
{
if(p[j]&0x01)
data1;
else
data0;
clk0;//产生时钟脉冲
clk1;
p[j]=p[j]>>1;//右移以便取下一位
}
}
}
void convert_dianya(float adc)
{
float temp;//未实际电压值
float xiaoshu;//小数
int zhenshu,t1;//t存储小数部分乘以十;整数;
// temp=adc*5.03/1024.0;//转化为电压
temp=adc;
zhenshu=(int)temp;//取整数部分
xiaoshu=temp-zhenshu;
t1=xiaoshu*100;//江小树转换为整数
pata[3]=table[zhenshu/10];
pata[2]=table1[zhenshu%10];
pata[1]=table[t1/10];
pata[0]=table[t1%10];
}
void convert_riqi(uchar fen,uchar miao)
{
uchar fen1,miao1;
uchar t1,t2,t3,t4;
fen1=fen;miao1=miao;
t1=(fen1>>4)&0x07;
t2=(miao1>>4);//&0x07;
t3=(fen&0x0f);
t4=(miao&0x0f);
pata[3]=table[t1];
pata[2]=table1[t3];
pata[1]=table[t2];
pata[0]=table[t4];
}
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
void ds1302_write(uchar reg,uchar data)
{
uchar i=0;
set_ds1302_io_ddr(); //输出
// asm("nop");
// asm("nop");
clr_ds1302_rst(); //为邻近之操作
// asm("nop");
//asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
set_ds1302_rst(); //唯一允许
asm("nop");
asm("nop");
for(i=8;i>0;i--) //先写寄存器
{
if(reg&0x01)
set_ds1302_io();
else
clr_ds1302_io();
asm("nop");
asm("nop");
set_ds1302_sclk(); //时钟下降元输入数据
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
reg>>=1;
}
asm("nop");
// asm("nop");
for(i=8;i>0;i--) //再写数据
{
if(data&0x01)
set_ds1302_io();
else
clr_ds1302_io();
asm("nop");
asm("nop");
set_ds1302_sclk();
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
data>>=1;
}
asm("nop");
clr_ds1302_rst();
asm("nop");
asm("nop");
// clr_ds1302_io_ddr(); //调用写完毕,转入读
// asm("nop");
// asm("nop");
}
uchar ds1302_read(uchar reg)
{
uchar data=0;
uchar i=0;
reg+=1;//读标志
set_ds1302_io_ddr();
asm("nop");
asm("nop");
clr_ds1302_rst();
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
set_ds1302_rst();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
if(reg&0x01)
set_ds1302_io();
else
clr_ds1302_io();
asm("nop");
asm("nop");
set_ds1302_sclk();
asm("nop");
asm("nop");
if(i>1)
{
clr_ds1302_sclk(); //这个循环确保第八个周期的下降元开始正确读书
asm("nop");
asm("nop");
}
else
asm("nop");
asm("nop");
reg>>=1;
}
clr_ds1302_io_ddr();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
data>>=1;
asm("nop");
clr_ds1302_sclk(); ////it'ok now!!!!,是始终下降延给出数据
asm("nop");//必须延时以便于pinc读入
if(in_ds1302_io())
data|=0x80;
asm("nop");
asm("nop");
set_ds1302_sclk();
asm("nop");
asm("nop");
}
clr_ds1302_rst();
asm("nop");
asm("nop");
return(data);
}
uchar check_ds1302(void)
{
ds1302_write(ds1302_control_reg,0x80);
if(ds1302_read(ds1302_control_reg)==0x80)
return 1;
else
return 0;
}
void ds1302_read_time(void)
{
year=ds1302_read(ds1302_year_reg); //年
month=ds1302_read(ds1302_month_reg);//月
day=ds1302_read(ds1302_date_reg); //日
week=ds1302_read(ds1302_day_reg); //周
hour=ds1302_read(ds1302_hr_reg); //时
minute=ds1302_read(ds1302_min_reg); //分
second=ds1302_read(ds1302_sec_reg); //秒
}
void ds1302_write_time(void)
{
ds1302_write(ds1302_control_reg,0x00); //关闭写保护
//ds1302_write(ds1302_sec_reg,0x80); //暂停
ds1302_write(ds1302_charger_reg,0xf0); //无涓流充电
ds1302_write(ds1302_year_reg,year); //年
ds1302_write(ds1302_month_reg,month); //月
ds1302_write(ds1302_date_reg,day); //日
ds1302_write(ds1302_day_reg,week); //周
ds1302_write(ds1302_hr_reg,hour); //时
ds1302_write(ds1302_min_reg,minute); //分
ds1302_write(ds1302_sec_reg,second); //秒
//ds1302_write(ds1302_sec_reg,0x00);
ds1302_write(ds1302_control_reg,0x80); //打开写保护
}
void init_time(void)
{
// uchar year,month,day,week,hour,minute,second;
year=0x07;
month=0x07;
day=0x20;
week=0x01;
hour=0x11;
minute=0x44;
second=0x00;
}
void main(void)
{
// uchar riqi[7]={0,0,0,0,0,0,0};//存放日期值
uchar t;//t验证是否为写保护,1无,0有
port_init();
set_ds1302_io_ddr();
clr_ds1302_rst();
delay_ms(300);
DDRC=0xff;
DDRB=0xff;
PORTB=0x00;
init_time();
ds1302_write_time();
while(1)
{
// minute=ds1302_read(ds1302_year_reg); //分
second=ds1302_read(ds1302_sec_reg); //秒
// convert_riqi(0x00,minute);
neirong1(second);
// neirong1(minute);
display(pata);
delay(100);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -