ds1302 +ds18b20+LCD1602完整程序docWord格式.docx
《ds1302 +ds18b20+LCD1602完整程序docWord格式.docx》由会员分享,可在线阅读,更多相关《ds1302 +ds18b20+LCD1602完整程序docWord格式.docx(25页珍藏版)》请在冰豆网上搜索。
sbitwireless_3=P3^2;
sbitwireless_4=P3^3;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;
//秒,分,时到日,月,年位闪的计数
sbitSet=P2^0;
//模式切换键
sbitUp=P2^1;
//加法按钮
sbitDown=P2^2;
//减法按钮
sbitout=P2^3;
//立刻跳出调整模式按钮
sbitDQ=P1^0;
//温度传送数据IO口
chardone,count,temp,flag,up_flag,down_flag;
uchartemp_value;
//温度值
ucharTempBuffer[5],week_value[2];
voidshow_time();
//液晶显示程序
/***********1602液晶显示部分子程序****************/
//PortDefinitions**********************************************************
sbitLcdRs=P2^5;
sbitLcdRw=P2^6;
sbitLcdEn=P2^7;
sfrDBPort=0x80;
//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
//内部等待函数**************************************************************************
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)
LcdRs=style;
LcdRw=0;
_nop_();
DBPort=input;
//注意顺序
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()
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;
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_RST=1;
DS1302InputByte(ucAddr);
//地址,命令
DS1302InputByte(ucDa);
//写1Byte数据
}
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&
Re