基于单片机与DS时钟芯片和LCD液晶显示的数字时钟Word文档下载推荐.docx
《基于单片机与DS时钟芯片和LCD液晶显示的数字时钟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机与DS时钟芯片和LCD液晶显示的数字时钟Word文档下载推荐.docx(9页珍藏版)》请在冰点文库上搜索。
while
(1)
{
DS1302_GetTime(&
CurrentTime);
TimeToStr(&
GotoXY(6,1);
Print(CurrentTime.TimeString);
Delay1ms(400);
}
#ifndefLCD_CHAR_1602_2005_4_9
#defineLCD_CHAR_1602_2005_4_9
intrins.h>
//PortDefinitions**********************************************************
sbitLcdRs =P2^0;
sbitLcdRw =P2^1;
sbitLcdEn =P2^2;
sfrDBPort =0x80;
//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
//内部等待函数**************************************************************************
unsignedcharLCD_Wait(void)
LcdRs=0;
LcdRw=1;
_nop_();
LcdEn=1;
//while(DBPort&
0x80);
//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&
0x80==0x80
//实际硬件时打开此语句
LcdEn=0;
returnDBPort;
//向LCD写入命令或数据************************************************************
#defineLCD_COMMAND 0//Command
#defineLCD_DATA 1//Data
#defineLCD_CLEAR_SCREEN 0x01//清屏
#defineLCD_HOMING 0x02//光标返回原点
voidLCD_Write(bitstyle,unsignedcharinput)
LcdRs=style;
LcdRw=0;
_nop_();
DBPort=input;
//注意顺序
LCD_Wait();
//设置显示模式************************************************************
#defineLCD_SHOW 0x04//显示开
#defineLCD_HIDE 0x00//显示关
#defineLCD_CURSOR 0x02 //显示光标
#defineLCD_NO_CURSOR 0x00//无光标
#defineLCD_FLASH 0x01//光标闪动
#defineLCD_NO_FLASH 0x00//光标不闪动
voidLCD_SetDisplay(unsignedcharDisplayMode)
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
//设置输入模式************************************************************
#defineLCD_AC_UP 0x02
#defineLCD_AC_DOWN 0x00//default
#defineLCD_MOVE 0x01//画面可平移
#defineLCD_NO_MOVE 0x00//default
voidLCD_SetInput(unsignedcharInputMode)
LCD_Write(LCD_COMMAND,0x04|InputMode);
//移动光标或屏幕************************************************************
/*
#defineLCD_CURSOR 0x02
#defineLCD_SCREEN 0x08
#defineLCD_LEFT 0x00
#defineLCD_RIGHT 0x04
voidLCD_Move(unsignedcharobject,unsignedchardirection)
if(object==LCD_CURSOR)
LCD_Write(LCD_COMMAND,0x10|direction);
if(object==LCD_SCREEN)
LCD_Write(LCD_COMMAND,0x18|direction);
*/
//初始化LCD************************************************************
voidLCD_Initial()
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++;
voidLCD_LoadChar(unsignedcharuser[8],unsignedcharplace)
unsignedchari;
LCD_Write(LCD_COMMAND,0x40|(place*8));
i<
8;
i++)
LCD_Write(LCD_DATA,user[i]);
#endif
#ifndef_REAL_TIMER_DS1302_2003_7_21_
#define_REAL_TIMER_DS1302_2003_7_21_
sbitDS1302_CLK=P1^6;
//实时时钟时钟线引脚
sbitDS1302_IO=P1^7;
//实时时钟数据线引脚
sbitDS1302_RST=P1^5;
//实时时钟复位线引脚
sbitACC0=ACC^0;
sbitACC7=ACC^7;
typedefstruct__SYSTEMTIME__
unsignedcharSecond;
unsignedcharMinute;
unsignedcharHour;
unsignedcharWeek;
unsignedcharDay;
unsignedcharMonth;
unsignedcharYear;
unsignedcharDateString[9];
unsignedcharTimeString[9];
}SYSTEMTIME;
//定义的时间类型
#defineAM(X) X
#definePM(X) (X+12) //转成24小时制
#defineDS1302_SECOND 0x80
#defineDS1302_MINUTE 0x82
#defineDS1302_HOUR 0x84
#defineDS1302_WEEK 0x8A
#defineDS1302_DAY 0x86
#defineDS1302_MONTH 0x88
#defineDS1302_YEAR 0x8C
#defineDS1302_RAM(X) (0xC0+(X)*2) //用于计算DS1302_RAM地址的宏
voidDS1302InputByte(unsignedchard) //实时时钟写入一字节(内部函数)
{
unsignedchari;
ACC=d;
for(i=8;
i>
0;
i--)
{
DS1302_IO=ACC0;
//相当于汇编中的RRC
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>
>
1;
}
unsignedcharDS1302OutputByte(void) //实时时钟读取一字节(内部函数)
1;
//相当于汇编中的RRC
ACC7=DS1302_IO;
return(ACC);
voidWrite1302(unsignedcharucAddr,unsignedcharucDa) //ucAddr:
DS1302地址,ucData:
要写的数据
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr);
//地址,命令
DS1302InputByte(ucDa);
//写1Byte数据
DS1302_CLK=1;
}
unsignedcharRead1302(unsignedcharucAddr) //读取DS1302某地址的数据
unsignedcharucData;
DS1302InputByte(ucAddr|0x01);
//地址,命令
ucData=DS1302OutputByte();
//读1Byte数据
return(ucData);
voidDS1302_SetProtect(bitflag)//是否写保护
if(flag)
Write1302(0x8E,0x10);
else
Write1302(0x8E,0x00);
voidDS1302_SetTime(unsignedcharAddress,unsignedcharValue)//设置时间函数
DS1302_SetProtect(0);
Write1302(Address,((Value/10)<
<
4|(Value%10)));
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[0]=Time->
Year/10+'
0'
;
DateString[1]=Time->
Year%10+'
DateString[2]='
-'
DateString[3]=Time->
Month/10+'
DateString[4]=Time->
Month%10+'
DateString[5]='
DateString[6]=Time->
Day/10+'
DateString[7]=Time->
Day%10+'
DateString[8]='
voidTimeToStr(SYSTEMTIME*Time)
TimeString[0]=Time->
Hour/10+'
TimeString[1]=Time->
Hour%10+'
TimeString[2]='
:
'
TimeString[3]=Time->
Minute/10+'
TimeString[4]=Time->
Minute%10+'
TimeString[5]='
TimeString[6]=Time->
Second/10+'
TimeString[7]=Time->
Second%10+'
voidInitial_DS1302(void)
unsignedcharSecond=Read1302(DS1302_SECOND);
if(Second&
0x80)
DS1302_SetTime(DS1302_SECOND,0);
/********************************************************************************
voidBurstWrite1302(unsignedchar*pWClock) //往DS1302写入时钟数据(多字节方式)
Write1302(0x8e,0x00);
//控制命令,WP=0,写操作?
DS1302InputByte(0xbe);
//0xbe:
时钟多字节写命令
for(i=8;
i--) //8Byte=7Byte时钟数据+1Byte控制
DS1302InputByte(*pWClock);
//写1Byte数据
pWClock++;
}
voidBurstRead1302(unsignedchar*pRClock) //读取DS1302时钟数据(时钟多字节方式)
DS1302InputByte(0xbf);
//0xbf:
时钟多字节读命令
for(i=8;
i--)
*pRClock=DS1302OutputByte();
//读1Byte数据
pRClock++;
voidDS1302_TimeStop(bitflag)//是否将时钟停止
unsignedcharData;
Data=Read1302(DS1302_SECOND);
Write1302(DS1302_SECOND,Data|0x80);
Write1302(DS1302_SECOND,Data&
0x7F);
********************************************************************************/