#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
/***********************************************************/
sbit E=P2^5;
sbit RW=P2^6;
sbit RS=P2^7;
#define lcd_bus P0
#define lcd_clear_display 0x1
#define lcd_funtion_base 0x30
#define lcd_set_ddram_address 0x80
/*****************************键盘定义*******************************/
#define dataport P1
uchar sum;
bit flagg=0;
uchar ip;
/*************************温度传感器18B20********************/
sbit DQ=P3^5;
uchar temp[4];
uchar flag=0;
/************************************************************/
sbit T_IO = P2^2; /*实时时钟数据线引脚 */
sbit T_CLK = P2^3; /*实时时钟时钟线引脚 */
sbit T_RST = P2^4; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
uchar code s[]={"0"};
#define ds1302_second 0x80 //秒 秒地址为0x80
#define ds1302_minute 0x82 //分 分地址为0x82
#define ds1302_hour 0x84 //时 时间地址为0x84
#define ds1302_day 0x86 //日 日期地址为0x86
#define ds1302_week 0x8a //星期 星期地址为0x8a
#define ds1302_month 0x88 //月 月地址为 0x88
#define ds1302_year 0x8c //年 年地址为 0x8c
void lcd_write_string(uchar x,uchar y,uchar *s);
/*************************************************************************/
void delay(int time1)
{
int i, j;
for(i=time1;i>0;i--)
for(j=110;j>0;j--);
}
/*************************************************************************/
/*************************************************************************/
void lcd_check_busy(void) //判断LCD忙程序
{
uchar signalbuff;
RS=0;
RW=1; //读状态
do{
lcd_bus=0xff; //端口电平全部拉高
E=1; //开始读取LCD内部状态
signalbuff=lcd_bus;
E=0;
} //停止读取
while(signalbuff&0x80); //判断P2_7是否为0(液晶内部是否忙),如果为0,则跳出循环
}
/**********************************************************************************/
/**********************************************************************************/
void WRI(char instru)
{
lcd_check_busy();
RS = 0 ; //显示指令
RW = 0 ; //写
lcd_bus = instru;
E = 1 ;
E = 0 ;
}
/*********************************************************************************/
/*********************************************************************************/
void WRD(char lcddata)
{
lcd_check_busy();
RS = 1 ; //显示数据
RW = 0 ; //写
lcd_bus = lcddata;
E = 1 ; //下降沿触发
E = 0 ;
}
/**********************************************************************************/
/***********************************************************************************/
void lcd_set_xy(uchar x,uchar y)
{
uchar address;
switch(y){
case 0:
address = 0x80 + x;
break;
case 1:
address = 0x90 + x;
break;
case 2:
address = 0x88 + x;
break;
case 3:
address = 0x98 + x;
break;
default:address = 0x80 + x;}
WRI(lcd_set_ddram_address|address);
}
/*******************************************************************************/
/*******************************************************************************/
void initialcd()
{
WRI(0x30); //基本指令集
WRI(0x0c); //显示打开,光标关,反白显示关
WRI(0x06); //DDRAM的地址计数器(AC)加1
WRI(0x01); //清除屏幕显示,将DDRAM的地址计数器归零
delay(100);
// key1=1;
// key2=1;
// key3=1;
// key4=1;
// key5=1; //等待初始化结束
}
/**************************************************************************************/
/**************************************************************************************/
void lcd_write_string(uchar x,uchar y,uchar *s)
{
WRI(lcd_funtion_base);
lcd_set_xy(x,y);
while (*s!='\0') //字符串最后面都有个'\0'表示字符串的结束,所以实际上字符串占的内存单元要
{ //比串中字符数多1个 ''后面没有\0
WRD(*s);
s++;
}
}
/***************************************************************************************/
/***************************************************************************************/
void write_time(unsigned char x,unsigned char y,uchar time)
{
uchar shi,ge;
shi=time/10;
ge=time%10;
WRI(lcd_funtion_base);
lcd_set_xy(x,y);
WRD(0x30+shi);
WRD(0x30+ge);
}
/***************************************************************************************
void write_time1(unsigned char x,unsigned char y,uchar time)
{
uchar shi,ge;
shi=time/100;
ge=time%100;
WRI(lcd_funtion_base);
lcd_set_xy(x,y);
WRD(0x30+shi);
WRD(0x30+ge);
}
/***************************************************************************************/
void write_date(uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
WRI(lcd_funtion_base);
WRD(0x30+shi);
WRD(0x30+ge);
}
/***************************************************************************************/
/***************************************************************************************/
void v_WTInputByte(uchar ucDa)
{
uchar i;
ACC= ucDa;
for(i=8; i>0; i--)
{
T_IO = ACC0; //*相当于汇编中的 RRC
T_CLK = 1;
T_CLK = 0;
ACC =ACC>> 1;
}
}
/***************************************************************************************/
/***************************************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC>>1; //*相当于汇编中的 RRC
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/*******************************************************************************************/
/**************************************写入数据*****************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
v_WTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
/*******************************************************************************************/
/*****************************************读出数据**************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}
/*****************************************************************************************/
/*****************************************************************************************/
void time_stop()
{
v_W1302(0x8e,0x00);
v_W1302(0x80,0x80+uc_R1302(0x81));
v_W1302(0x8e,0x80);
}
/*****************************************************************************************/
/*****************************************************************************************/
void time_star()
{
v_W1302(0x8e,0x00);
v_W1302(0x80,uc_R1302(0x81)-0x80);
v_W1302(0x8e,0x80);
}
/****************************************************************************************/
/*******************************初始时间设置为2009-08-08 08时08分08秒*星期五*/
void init_time(void)
{
v_W1302(0x8e,0x00);
v_W1302(0x80,0x00); //秒 秒地址为0x80
v_W1302(0x82,0x55); //分 分地址为0x82
v_W1302(0x84,0x21); //时 时间地址为0x84
v_W1302(0x86,0x26); //日 日期地址为0x86
v_W1302(0x88,0x09); //月 月地址为 0x88
v_W1302(0x8a,0x06); //星期 星期地址为0x8a
v_W1302(0x8c,0x