按键可调ds1302时钟显示

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档