智能电子钟LCD显示ds1302芯片Word文档格式.docx
- 文档编号:16345976
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:20
- 大小:76.32KB
智能电子钟LCD显示ds1302芯片Word文档格式.docx
《智能电子钟LCD显示ds1302芯片Word文档格式.docx》由会员分享,可在线阅读,更多相关《智能电子钟LCD显示ds1302芯片Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
i--)
for(j=x;
j>
j--);
}
voidbeep()
{
di=1;
delayms(400);
di=0;
/*************************
*名称:
数码管显示
*************************/
xianshi(ucharshi1,ucharshi2,ucharfen1,ucharfen2,ucharmiao1,ucharmiao2)
Date=table[shi1];
com=0xfe;
delayms(10);
Date=table[shi2];
com=0xfd;
Date=table[fen1];
com=0xfb;
Date=table[fen2];
com=0xf7;
Date=table[miao1];
com=0xef;
Date=table[miao2];
com=0xdf;
/***********1602液晶显示部分子程序*********/
sbitLcdRs=P2^5;
sbitLcdRw=P2^6;
sbitLcdEn=P2^7;
sfrDBPort=0x80;
//内部等待函数****************
unsignedcharLCD_Wait(void)
{LcdRs=0;
LcdRw=1;
_nop_();
LcdEn=1;
LcdEn=0;
returnDBPort;
}
//向LCD写入命令或数据******************
#defineLCD_COMMAND0//Command
#defineLCD_DATA1//Data
#defineLCD_CLEAR_SCREEN0x01//清屏
#defineLCD_HOMING0x02//光标返回原点
voidLCD_Write(bitstyle,unsignedcharinput)
{LcdEn=0;
LcdRs=style;
LcdRw=0;
DBPort=input;
//注意顺序
LcdEn=1;
_nop_();
LcdEn=0;
LCD_Wait();
//设置显示模式***********************
#defineLCD_SHOW0x04//显示开
#defineLCD_HIDE0x00//显示关
#defineLCD_CURSOR0x02//显示光标
#defineLCD_NO_CURSOR0x00//无光标
#defineLCD_FLASH0x01//光标闪动
#defineLCD_NO_FLASH0x00//光标不闪动
voidLCD_SetDisplay(unsignedcharDisplayMode)
{LCD_Write(LCD_COMMAND,0x08|DisplayMode);
//设置输入模式****************************
#defineLCD_AC_UP0x02
#defineLCD_AC_DOWN0x00//default
#defineLCD_MOVE0x01//画面可平移
#defineLCD_NO_MOVE0x00//default
voidLCD_SetInput(unsignedcharInputMode)
{LCD_Write(LCD_COMMAND,0x04|InputMode);
//初始化LCD*************************
voidLCD_Initial()
{LcdEn=0;
LCD_Write(LCD_COMMAND,0x38);
//8位数据端口,2行显示,5*7点阵
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);
//开启显示,无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);
//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);
//AC递增,画面不动
//液晶字符输入的位置************************
voidGotoXY(unsignedcharx,unsignedchary)
{if(y==0)LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}//将字符输出到液晶显示
voidPrint(unsignedchar*str)
{while(*str!
='
\0'
)
{LCD_Write(LCD_DATA,*str);
str++;
}}
/***********DS1302时钟部分子程序*********/
typedefstruct__SYSTEMTIME__
unsignedcharSecond;
unsignedcharMinute;
unsignedcharHour;
unsignedcharWeek;
unsignedcharDay;
unsignedcharMonth;
unsignedcharYear;
unsignedcharDateString[11];
unsignedcharTimeString[9];
}SYSTEMTIME;
//定义的时间类型
SYSTEMTIMECurrentTime;
#defineAM(X)X
#definePM(X)(X+12)//转成24小时制
#defineDS1302_SECOND0x80//时钟芯片的寄存器位置,存放时间
#defineDS1302_MINUTE0x82
#defineDS1302_HOUR0x84
#defineDS1302_WEEK0x8A
#defineDS1302_DAY0x86
#defineDS1302_MONTH0x88
#defineDS1302_YEAR0x8C
voidDS1302InputByte(unsignedchard)
{//实时时钟写入一字节(内部函数)
unsignedchari;
ACC=d;
for(i=8;
{DS1302_IO=ACC0;
//相当于汇编中的RRC
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>
>
1;
}}
unsignedcharDS1302OutputByte(void)
{//实时时钟读取一字节(内部函数)
unsignedchari;
{ACC=ACC>
1;
//相当于汇编中的RRC
ACC7=DS1302_IO;
DS1302_CLK=0;
}
return(ACC);
voidWrite1302(unsignedcharucAddr,unsignedcharucDa)
{DS1302_RST=0;
DS1302_RST=1;
DS1302InputByte(ucAddr);
//地址,命令
DS1302InputByte(ucDa);
//写1Byte数据
DS1302_RST=0;
}
unsignedcharRead1302(unsignedcharucAddr)
{//读取DS1302某地址的数据
unsignedcharucData;
DS1302InputByte(ucAddr|0x01);
//地址,命令
ucData=DS1302OutputByte();
//读1Byte数据
return(ucData);
voidDS1302_GetTime(SYSTEMTIME*Time)
{//获取时钟芯片的时钟数据到自定义的结构型数组
unsignedcharReadValue;
ReadValue=Read1302(DS1302_SECOND);
Time->
Second=((ReadValue&
0x70)>
4)*10+(ReadValue&
0x0F);
ReadValue=Read1302(DS1302_MINUTE);
Minute=((ReadValue&
ReadValue=Read1302(DS1302_HOUR);
Hour=((ReadValue&
ReadValue=Read1302(DS1302_DAY);
Day=((ReadValue&
ReadValue=Read1302(DS1302_WEEK);
Week=((ReadValue&
ReadValue=Read1302(DS1302_MONTH);
Month=((ReadValue&
ReadValue=Read1302(DS1302_YEAR);
Year=((ReadValue&
voidDateToStr(SYSTEMTIME*Time)
{//将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
if(hide_year<
2)
{Time->
DateString[0]='
2'
;
DateString[1]='
0'
DateString[2]=Time->
Year/10+'
DateString[3]=Time->
Year%10+'
else{Time->
'
DateString[2]='
DateString[3]='
DateString[4]='
/'
if(hide_month<
2)
{Time->
DateString[5]=Time->
Month/10+'
DateString[6]=Time->
Month%10+'
DateString[5]='
DateString[6]='
DateString[7]='
if(hide_day<
DateString[8]=Time->
Day/10+'
DateString[9]=Time->
Day%10+'
else{Time->
DateString[8]='
Time->
DateString[9]='
if(hide_week<
2){
//星期的数据另外放到week_value[]数组里,,因为等一下要在最后显视
week_value[0]=Time->
Week%10+'
else{week_value[0]='
week_value[1]='
DateString[10]='
//字符串末尾加'
判断结束字符
voidTimeToStr(SYSTEMTIME*Time)
{if(hide_hour<
TimeString[0]=Time->
Hour/10+'
TimeString[1]=Time->
Hour%10+'
TimeString[0]='
TimeString[1]='
TimeString[2]='
:
'
if(hide_min<
2){Time->
TimeString[3]=Time->
Minute/10+'
TimeString[4]=Time->
Minute%10+'
else{Time->
TimeString[3]='
TimeString[4]='
TimeString[5]='
if(hide_sec<
TimeString[6]=Time->
Second/10+'
TimeString[7]=Time->
Second%10+'
TimeString[6]='
TimeString[7]='
voidInitial_DS1302(void)//时钟芯片初始化
{unsignedcharSecond=Read1302(DS1302_SECOND);
if(Second&
0x80)//判断时钟芯片是否关闭
{Write1302(0x8e,0x00);
//写入允许
Write1302(0x8c,0x07);
//
Write1302(0x88,0x07);
Write1302(0x86,0x25);
Write1302(0x8a,0x07);
Write1302(0x84,0x23);
Write1302(0x82,0x59);
Write1302(0x80,0x55);
Write1302(0x8e,0x80);
//禁止写入
voidDelay1ms(unsignedintcount)
{unsignedinti,j;
for(i=0;
i<
count;
i++)
for(j=0;
j<
20;
j++);
/*延时子程序*/
voidmdelay(uintdelay)
{uinti;
for(;
delay>
delay--){for(i=0;
62;
i++)//1ms延时.
{;
}}}
voidoutkey()//跳出调整模式,返回默认显示
{ucharSecond;
if(out==0){mdelay(8);
count=0;
hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
Second=Read1302(DS1302_SECOND);
Write1302(0x8e,0x00);
Write1302(0x80,Second&
0x7f);
Write1302(0x8E,0x80);
done=0;
while(out==0);
}}
///////////////////////////////////////////////////////////////////////////////
voidUpkey()//升序按键
{Up=1;
if(Up==0)
{
mdelay(8);
switch(count)
{case1:
temp=Read1302(DS1302_SECOND);
//读取秒数
temp=temp+1;
//秒数加1
up_flag=1;
//数据调整后更新标志
if((temp&
0x7f)>
0x59)//超过59秒,清零
temp=0;
break;
case2:
temp=Read1302(DS1302_MINUTE);
//读取分数
//分数加1
up_flag=1;
if(temp>
0x59)//超过59分,清零
temp=0;
break;
case3:
temp=Read1302(DS1302_HOUR);
//读取小时数
temp=temp+1;
//小时数加1
0x23)//超过23小时,清零
break;
case4:
temp=Read1302(DS1302_WEEK);
//读取星期数
temp=temp+1;
//星期数加1
if(temp>
0x7)
temp=1;
break;
case5:
temp=Read1302(DS1302_DAY);
//读取日数
temp=temp+1;
//日数加1
0x31)
case6:
temp=Read1302(DS1302_MONTH);
//读取月数
//月数加1
0x12)
case7:
temp=Read1302(DS1302_YEAR);
//读取年数
temp=temp+1;
//年数加1
0x85)
temp=0;
default:
while(Up==0);
voidDownkey()//降序按键
{Down=1;
if(Down==0)
{mdelay(8);
switch(count)
{case1:
temp=temp-1;
//秒数减1
down_flag=1;
if(temp==0x7f)//小于0秒,返回59秒
temp=0x59;
case2:
temp=Read1302(DS1302_MINUTE);
temp=temp-1;
//分数减1
if(temp==-1)
temp=0x59;
//小于0秒,返回59秒
case3:
//小时数减1
temp=0x23;
case4:
//星期数减1
if(temp==0)
temp=0x7;
//日数减1
if(te
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 电子钟 LCD 显示 ds1302 芯片