您当前的位置:五五电子网电子知识电子制作自动控制-单片机128X64LCD万年历(网友作品) 正文
128X64LCD万年历(网友作品)

128X64LCD万年历(网友作品)

点击数:7851 次   录入时间:03-04 11:52:37   整理:http://www.55dianzi.com   自动控制-单片机
//延时(LCM占用)
void delaynms(unsigned int di) {
 unsigned int da,db;
  for(da=0;da<di;da++);
     for(db=0;db<10;db++);
}
 
/*****************************************************************************/
//清屏函数
void lcm_clr(void){
 lcm_w_test(0,0x01);
 delaynms(40); //启动等待,等LCM讲入工作状态

}

/*****************************************************************************/
//向LCM发送一个字符串,长度64字符之内。
//应用:lcm_w_word("您好!");
void lcm_w_word(unsigned char *str){
  while(*str != '\0'){
   lcm_w_test(1,*str++);
        }
  *str = 0;
}
/******************************************************************************/
void Delay(int num)//延时函数
{
 while(num--) ;

/******************************************************************************/
void Init_DS18B20(void)//初始化ds1820
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 Delay(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 Delay(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 Delay(14);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 Delay(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void)//读一个字节
{
 unsigned char i=0;
 unsigned char dat = 0;
 for (i=8;i>0;i--)
 {
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
  dat|=0x80;
  Delay(4);
 }
 return(dat);
}

/******************************************************************************/
void WriteOneChar(unsigned char dat)//写一个字节
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  Delay(5);
  DQ = 1;
  dat>>=1;
 }
}
/******************************************************************************/
unsigned int ReadTemperature(void)//读取温度
{
 unsigned char a=0;
 unsigned char b=0;
 unsigned int t=0;
 float tt=0;
 Init_DS18B20();
 WriteOneChar(0xCC); // 跳过读序号列号的操作
 WriteOneChar(0x44); // 启动温度转换
 Init_DS18B20();
 WriteOneChar(0xCC); //跳过读序号列号的操作
 WriteOneChar(0xBE); //读取温度寄存器
 a=ReadOneChar();  //读低8位
 b=ReadOneChar(); //读高8位
 t=b;
 t<<=8;
 t=t|a;
 tt=t*0.0625;
 t= tt*10+0.5; //放大10倍输出并四舍五入
 return(t);
}
/*****************************************************************************/
//声明
void lcm_w_ss(void);void lcm_w_mm(void);
void lcm_w_hh(void);void lcm_w_dd(void);
void lcm_w_mo(void);void lcm_w_yy(void);void lcm_w_xq(void);
unsigned char clock_in(void);
void clock_out(unsigned char dd);
void Init_1302(void);
unsigned char read_clock(unsigned char ord);
void read_clockS(void);
void Set_time(unsigned char sel);
void write_clock(unsigned char ord, unsigned char dd);
void updata (void);
/*****************************************************************************/
//常用时钟数据读取
void read_clockS(void){
 ss = read_clock(0x81);//读取秒数据
 mm = read_clock(0x83);//读取分钟数据
 hh = read_clock(0x85);//小时
 dd = read_clock(0x87);//日
 mo = read_clock(0x89);//月
 xq = read_clock(0x8b);//星期
 yy = read_clock(0x8d);//年
}
/*****************************************************************************/
//调时用加1程序
void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302
  signed char address,item;
  signed char max,mini;
  lcm_w_test(0,0x9a);
  lcm_w_word("调整");
  //if(sel==6)  {lcm_w_word("秒钟");address=0x80; max=0;mini=0;}     //秒7
  if(sel==5)  {lcm_w_word("分钟");address=0x82; max=59;mini=0;}    //分钟6
  if(sel==4)  {lcm_w_word("小时");address=0x84; max=23;mini=0;}    //小时5
  if(sel==3)  {lcm_w_word("星期");address=0x8a; max=7;mini=1;}    //星期4 
  if(sel==2)  {lcm_w_word("日期");address=0x86; max=31;mini=1;}    //日3
  if(sel==1)  {lcm_w_word("月份");address=0x88; max=12;mini=1;}    //月2
  if(sel==0)  {lcm_w_word("年份");address=0x8c; max=99; mini=0;}    //年1
 
  //读取1302某地址上的数值转换成10进制赋给item
  item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  if(KEY_2 == 0){
   item++;//数加 1 
  }
  if(KEY_4 == 0){
   item--;//数减 1
  }
  if(item>max) item=mini;//查看数值有效范围  
  if(item<mini) item=max;          
  write_clock(0x8e,0x00);//允许写操作
  write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  write_clock(0x8e,0x80);//写保护,禁止写操作
  updata (); //刷新数据
  lcm_w_mm();//刷新 分
}
/*****************************************************************************/
//设置1302的初始时间
void Init_1302(void){//(2007年1月1日00时00分00秒星期一)
 write_clock(0x8e,0x00);//允许写操作

 write_clock(0x8c,0x07);//年
 write_clock(0x8a,0x01);//星期
 write_clock(0x88,0x01);//月
 write_clock(0x86,0x01);//日
 write_clock(0x84,0x00);//小时
 write_clock(0x82,0x00);//分钟
 write_clock(0x80,0x00);//秒
 write_clock(0x90,0xa5);//充电 
 write_clock(0x8e,0x80);//禁止写操作
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char ord, unsigned char dd){
 clock_clk=0;
 clock_Rst=0;
 clock_Rst=1;
 clock_out(ord);
 clock_out(dd);
 clock_Rst=0;
 clock_clk=1;
}
/*****************************************************************************/
//1302驱动程序(底层协议)
void clock_out(unsigned char dd){
 ACC=dd;
 clock_dat=a0; clock_clk=1; clock_clk=0;
 clock_dat=a1; clock_clk=1; clock_clk=0;
 clock_dat=a2; clock_clk=1; clock_clk=0;
 clock_dat=a3; clock_clk=1; clock_clk=0;
 clock_dat=a4; clock_clk=1; clock_clk=0;
 clock_dat=a5; clock_clk=1; clock_clk=0;
 clock_dat=a6; clock_clk=1; clock_clk=0;
 clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
unsigned char clock_in(void){
 clock_dat=1;
 a0=clock_dat;
 clock_clk=1; clock_clk=0; a1=clock_dat;
 clock_clk=1; clock_clk=0; a2=clock_dat;
 clock_clk=1; clock_clk=0; a3=clock_dat;
 clock_clk=1; clock_clk=0; a4=clock_dat;
 clock_clk=1; clock_clk=0; a5=clock_dat;
 clock_clk=1; clock_clk=0; a6=clock_dat;
 clock_clk=1; clock_clk=0; a7=clock_dat;
 return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char ord){

上一页  [1] [2] [3] [4] [5]  下一页


本文关键字:万年历  自动控制-单片机电子制作 - 自动控制-单片机

上一篇:电子万年历