按键可调ds1302时钟显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按键可调ds1302时钟显示(亲测可用)
* 实验说明:本例程为四键控制时钟,k1键按下后进入时钟的调整状态,k2按下时钟上* * k3按下时钟下调,调好设定的时钟后按下k4时钟进入走时状态* *****************************************************************************/ #include
#include
sbit SCK=P3^6; //时钟
sbit SDA=P3^4; //数据
sbit RST = P3^5;// DS1302复位
sbit k1=P1^0; //
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit LS138A=P2^2; //
sbit LS138B=P2^3;
sbit LS138C=P2^4;
bit ReadRTC_Flag;//定义读DS1302标志
bit mie;
unsigned char x,t1,xuan,shan;
unsigned char l_tmpdate[7];
unsigned char l_tmpdisplay[8];
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
//共阴数码管0-9 '-' '熄灭‘表
/******************************************************************/
/* 函数声明*/
/******************************************************************/
void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void Read_RTC(void);//read RTC
void Set_RTC(void); //set RTC
void InitTIMER0(void);//inital timer0
void tiao_time(); //时间调整
unsigned char key(); //按键函数
void shanshuo(); // 闪烁函数
/******************************************************************/
/* 主函数*/
/******************************************************************/
void main(void)
{
InitTIMER0(); //初始化定时器0
//Set_RTC(); //写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽
while(1)
{
if(ReadRTC_Flag)
{
ReadRTC_Flag=0;
tiao_time();
if(x==0) Read_RTC(); //
l_tmpdisplay[0]=l_tmpdate[2]/16; //数据的转换,因我们采用数码管0~9的显示,将数据分开
l_tmpdisplay[1]=l_tmpdate[2]&0x0f;
l_tmpdisplay[2]=10; //加入"-"
l_tmpdisplay[3]=l_tmpdate[1]/16;
l_tmpdisplay[4]=l_tmpdate[1]&0x0f;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[0]/16;
l_tmpdisplay[7]=l_tmpdate[0]&0x0f;
if(shan==1) // 进入调整状态后闪烁
{
shanshuo(); //调用闪烁函数
if(mie==1) //闪烁就是亮灭相间
switch(xuan) //判断哪位闪烁{
case 1:l_tmpdisplay[7]=11,l_tmpdisplay[6]=11;break;
case 2:l_tmpdisplay[4]=11,l_tmpdisplay[3]=11;break;
case 3:l_tmpdisplay[1]=11,l_tmpdisplay[0]=11;break;
}
}
}
}
}
/******************************************************************/
/* 时间调整函数*/
/******************************************************************/
void tiao_time()
{ unsigned char miao,fen,shi,y;
switch(key()) //判断哪个键按下
{
case 1: x=1;y++;xuan++; //k1按下后进入调整状态并且计数应该调整哪位
if(y>2) y=2;
if(y==1) Read_RTC();
if(xuan>3) xuan=1;
miao=l_tmpdate[0];
shan=1; break; //调整时该位闪烁case 2: //k2按下为时钟上调
switch(xuan) //判断调整哪位
{ case 1: //按k1一次调秒
miao++;
if((miao%16)>=10) miao=miao+6; //由于显示处理时是以十六进制处理而miao++是十进制需要出来才能正常显示
if(miao==96) miao=0; //加到59后重为0
l_tmpdate[0]=miao; break;
case 2: //按k1两次调分
fen++;
if((fen%16)>=10) fen=fen+6;
if(fen==96) fen=0;
l_tmpdate[1]=fen; break;
case 3: //按k1三次调时
shi++;
if((shi%16)>=10) shi=shi+6;
if(shi==36) shi=0; //加到23重为0
l_tmpdate[2]=shi; break;
}
break;
case 3: //按下k3时钟下调
switch(xuan)
{
case 1: //调秒
miao--;
if((miao%16)>=10) miao=miao-6;