📄 1302.c
字号:
{
uchar i,dat;
DATA = 1;
for(i=0;i<7;i++)
{
CLK = 0;
if(DATA == 1)
dat |=0x80;
else
dat &=0x7F;
CLK = 1;
dat=dat>>1;
}
return (dat);
}
/**************************************************************************
函数描述:往ds1302的某个地址写入数据
入口参数:addr:要写入的寄存器地址
出口参数:dat:要写入的数据
*****************************************************************************/
void write_1302(uchar addr,uchar dat)
{
CLK = 0;
RESET = 1;
write_dat(addr);
write_dat(dat);
CLK = 0;
RESET = 0;
}
/****************************************************************************
函数描述:从ds1302的某个地址读出一字节数据
入口参数:addr:所读的寄存器的地址
出口参数:无
*****************************************************************************/
uchar read_1302(uchar addr)
{
uchar dat;
CLK = 0;
RESET = 1;
write_dat(addr);
dat = read_dat();
CLK = 0;
RESET = 0;
return (dat);
}
/****************************************************************************
函数描述:从ds1302寄存器中读出时间值或数据
入口参数:addr:所读寄存器起始地址
str:存放数据的起始地址
num:要读数据的个数
出口参数:无
*****************************************************************************/
void read_time(uchar addr,uchar *str,uchar num)
{
for(;num>0;num--)
{
*str++ = read_1302(addr);
addr = addr+2;
}
}
/****************************************************************************
函数描述:设置ds1302寄存器的值
入口参数:addr:要设置的寄存器起始地址
str:存放所设数据的起始地址
num:要设置寄存器的个数
出口参数:无
*****************************************************************************/
void set_1302(uchar addr,uchar *str,uchar num)
{
write_1302(0x8e,0x00);
for(;num>0;num--)
{
write_1302(addr,*str++);
addr = addr+2;
}
write_1302(0x8e,0x80);
}
void init_1302()
{
RESET = 0;
CLK = 0;
write_1302(0x80,0x00);
write_1302(0x90,0xa6); //一个二极管+4K电阻充电
set_1302(0x80,init,7); //写入初始值
write_1302(0x8e,0x80); //写保护控制字,禁止写
}
/************************************************************************************
函数描述:把从ds1302读出的数据转换为ascii码
入口参数:instr: 指向要转换数据的指针
出口参数: outstr: 指向转换后的数据的指针
**************************************************************************************/
void change_time(uchar *instr,uchar *outstr)
{ uchar i;
uchar j;
j = 0;
for(i=0;i<8;i++)
{ outstr[j] = '0'+((instr[i]&0xf0)>>4);
j++;
outstr[j] = '0'+(instr[i]&0x0f);
j++;
}
}
/*************************************************************************************
函数描述:在lcd上显示日期,时间值
入口参数:str:指向要显示值的指针
出口参数:无
***************************************************************************************/
void lcd_time(uchar *str)
{ write_str3(1,1,str[12]) ;//年
write_str3(1,2,str[13]) ;
write_str3(1,4,str[8]) ;//月
write_str3(1,5,str[9]) ;
write_str3(1,7,str[6]) ;//日
write_str3(1,8,str[7]) ;
write_str3(1,16,str[11]);//星期
write_str3(2,7,str[4]) ;//时
write_str3(2,8,str[5]) ;
write_str3(2,10,str[2]) ;//分
write_str3(2,11,str[3]) ;
write_str3(2,13,str[0]) ;//秒
write_str3(2,14,str[1]) ;
}
/*********************************************************************************************
函数描述:在lcd的第2行地9,12列的位置交替显示':'和' ' ,以形成闪动效果
入口参数:无
出口参数:无
***********************************************************************************************/
void flash()
{ if(flag)
{ write_str3(2,9,':');
write_str3(2,12,':');
}
else
{ write_str3(2,9,0x20);
write_str3(2,12,0x20);
}
}
/*************************************************************************************************
函数描述:中断处理
入口参数:无
出口参数:无
全局变量:flag
***************************************************************************************************/
void time0(void) interrupt 1 using 0
{ TH0 = 0x4C;
TL0 = 0x00;
inter++;
if(inter>10)
{ flag = ~flag;
inter=0;
}
if(inter1>4)
{ flag1 = ~flag1;
inter1 = 0 ;
}
}
void main()
{
uchar str2[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//
uchar str3[8] = {0x01,0x1b,0x00,0x19,0x1d,0x1b,0x01,0x00};
uchar str4[8] = {0x31,0x31,0x35,0x34,0x35,0x37,0x39,0x37};
uchar nian,yue,ri,xingqi,shi,fen,miao,cont;
TMOD = 0x11;
TH0 = 0x4C;
TL0 = 0x00;
EA = 1;
ET0 =1;
TR0 = 1;
ET1 =1;
TR1 = 1;
init_lcd();
writetab(1,tab);
init_1302();
write_str1(1,1,str,16);
write_str1(2,1,str1,16);
while(1)
{ read_time(0x81,init1,8);
change_time(init1,init2);
lcd_time(init2);
flash();
ok = 0;
if(!K3) //按下K3键进行时间设置
{ delay1(20);
write_1302(0x8e,0x00);
write_1302(0x80,0x80);
nian = 1;
time[0] = init2[12]-0x30;
time[1] = init2[13]-0x30;
write_str3(2,9,':');
write_str3(2,12,':');
while(nian) //设置年
{ key_set(1,1,99);
if(ok)
{
nian = 0;
yue = 1;
ok = 0;
cont = (time[0]<<4)+time[1];
write_1302(0x8c,cont);
}
//delay1(10);
}
time[0] = init2[8]-0x30;
time[1] = init2[9]-0x30;
while(yue) //设置月
{ key_set(1,4,12);
if(ok)
{
yue = 0;
ri = 1;
ok = 0;
cont = (time[0]<<4)+time[1];
write_1302(0x88,cont);
}
//delay1(10);
}
time[0] = init2[6]-0x30;
time[1] = init2[7]-0x30;
while(ri) //设置日
{ key_set(1,7,31);
if(ok)
{
ri = 0;
xingqi = 1;
ok = 0;
cont = (time[0]<<4)+time[1];
write_1302(0x86,cont);
}
//delay1(10);
}
week = init2[11]-0x30;
while(xingqi) //设置星期
{ key_set_xq(1,16);
if(ok)
{
xingqi = 0;
shi = 1;
ok = 0;
write_1302(0x8a,week);
}
// delay1(10);
}
time[0] = init2[4]-0x30;
time[1] = init2[5]-0x30;
while(shi) //设置时
{ key_set(2,7,23);
if(ok)
{
shi = 0;
fen = 1;
ok = 0;
cont = (time[0]<<4)+time[1];
write_1302(0x84,cont);
}
//delay1(10);
}
time[0] = init2[2]-0x30;
time[1] = init2[3]-0x30;
while(fen) //设置分
{ key_set(2,10,59);
if(ok)
{
fen = 0;
miao = 1;
ok = 0;
cont = (time[0]<<4)+time[1];
write_1302(0x82,cont);
}
//delay1(10);
}
time[0] = init2[0]-0x30;
time[1] = init2[1]-0x30;
while(miao) //设置秒
{ key_set(2,13,59);
if(ok)
{
miao = 0;
ok = 0;
cont = (time[0]<<4)+time[1];
write_1302(0x80,cont);
}
// delay1(20);
}
write_1302(0x8e,0x80);
}
if(!K2) //按下K2键使能或取消报警功能
{ delay1(20);
alarm_flag = ~alarm_flag;
if(alarm_flag)
{ xianshitab(2,16,1);
}
else
write_str3(2,16,0x20);
}
if(!K1)
{ delay1(10);
if(!K4) //按下K1与K4键,设置报警时间
{ delay1(10);
set_alarm_time();
}
if(!K2)
{ see_alarm_time(); //按下K1与K2键,查看报警时间
}
}
time_campare();
}
}
/***************************************************************************************
函数描述:在设置数据过程中显示所设置的数据
出口参数:row:显示的行
col:显示的列
出口参数:无
全局变量:time[0],time[1]
调用模块:key_set(),key_set_xq
*******************************************************************************************/
void set_flash(uchar row,uchar col)
{ if(flag)
{ write_str3(row,col,'0'+time[0]);
write_str3(row,col+1,'0'+time[1]);
}
else
{ write_str3(row,col,0x20);
write_str3(row,col+1,0x20);
}
}
/*********************************************************************************************
函数描述:对所设数据加一,减一
入口参数:row:所设数据显示位置的行
col:所设数据显示位置的列
max:所设数据的最大值
出口参数:无
全局变量:time[0],time[1]
调用模块:main(),set_alarm_time()
***********************************************************************************************/
void key_set(uchar row,uchar col,uchar max)
{ uchar temp,max0,max1 ;
max0 = max/10;
max1 = max%10;
temp = time[0]*10+time[1];
delay1(20);
if(!K1)
{ if(temp <= 0)
{ time[1] = max1;
time[0] = max0;
}
else
{ if(time[1]==0)
{ time[0] = time[0]-1;
time[1] = 9;
}
else
time[1] = time[1]-1;
}
}
if(!K2)
{
if(temp>=max)
{ time[0] = 0;
time[1] =1;
}
else
{ if(time[1]==9)
{ time[0] = time[0]+1;
time[1] = 0;
}
else
time[1] = time[1]+1;
}
}
set_flash(row,col);
if(!K3)
{ ok = 1;
delay1(10);
write_str3(row,col,'0'+time[0]);
write_str3(row,col+1,'0'+time[1]);
}
}
/*********************************************************************************************
函数描述:设置星期的值
入口参数:row:星期显示位置的行
col:星期显示位置的列
出口参数:无
全局变量
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -