查看: 1066|回复: 3

LCD12864指针型时钟 [复制链接]

Rank: 4

贡献值
192
金币
559
帖子
111
发表于 2012-8-22 14:16:43 |显示全部楼层
/***************************************
LCD12864(ST7920)指针型时钟,使用软件记时,
时间可调,有闹钟功能,算法值得研究
***************************************/

#include<reg52.h>
#include<stdlib.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define pi 3.14
const uchar hang5[]={" "};
const uchar hangmiao[]={"秒"};
const uchar hangfen[]={"分"};
const uchar hangshi[]={"时"};

const uchar hang_time[]={"时间"};
const uchar hang_miao[]={"调秒"};
const uchar hang_fen[]={"调分"};
const uchar hang_shi[]={"调时"};
const uchar hang_nang[]={"闹钟"};
const uchar hang_cancle[]={"取消"};

#define LCDDATA P2
sbit RS = P0^7;   
sbit RW = P0^6;  
sbit EN = P0^5;

sbit key_set_time=P1^0;
sbit key_add_time=P1^1;
sbit key_inc_time=P1^2;
sbit key_ok_time=P1^3;



sbit beep=P3^0;
/*调闹钟的初始化值*/                         //nangzhong_ok=1 确认闹钟
uchar set_nangzhong_miao,set_nangzhong_fen,set_nangzhong_shi,nangzhong_stutas,nangzhong_ok,nangzhong_clear=0;
uchar x_set_newzhong_shi,x_set_newzhong_fen,x_set_newzhong_miao,x_set_oldzhong_miao,x_set_oldzhong_fen,x_set_oldzhong_shi;
uchar y_set_newzhong_shi,y_set_newzhong_fen,y_set_newzhong_miao,y_set_oldzhong_miao,y_set_oldzhong_fen,y_set_oldzhong_shi;
/*调时的初始化值*/
uchar set,t_time;  //SET为是否进入调时状态  T_TIME为在调时调分调秒中切换  SET=0正常走动 1 调时 2 调闹钟
/*12864电子时钟的初始化值*/
uchar miao=0,fen=0,shi=0,time_miao=1,time_fen=1,time_shi=1,tt;     //状态变量
uchar x_now_miao,y_now_miao,x_now_fen,y_now_fen,x_now_shi,y_now_shi;   //此时刻的秒时分值
uchar x_miao,y_miao,x_fen,y_fen,x_shi,y_shi;                   //  上一时刻的秒时分值
void delay(uchar i)
{
for(;i>0;i--);
}
void delayms( uint i)
{ uint j;
  for(;i>0;i--)
  {  for(j=1000;j>0;j--);}
}
uchar readstatus()
{ uchar i;
  LCDDATA=0xff;
  RW=1;
  RS=0;
  EN=0;
  delay(2);
  EN=1;
  delay(3);
  i=LCDDATA;
  delay(3);
  EN=0;
  return(i);
}
void writecmd(uchar cmd)//写指令
{
while((readstatus() & 0x80)!= 0x00);
  LCDDATA=0x00;
  RW=0;
  RS=0;
  EN=0;
  LCDDATA=cmd;
  delay(2);
  EN=1;
  delay(3);
  EN=0;
}
void writedate(uchar date)
{
while((readstatus() &0x80 )!=0x00);
  LCDDATA=0x00;
  RW=0;
  RS=1;
  EN=0;
  LCDDATA=date;
  delay(2);
  EN=1;
  delay(3);
  EN=0;
}
uchar readdate()
{
   uchar i;
    while((readstatus() &0x80 )!=0x00);
    RW=1;
    RS=1;   
    EN=0;
    delay(2);
    EN=1;
    delay(3);
    i=LCDDATA;
    delay(3);
    EN=0;
  return i;  
}
/*******************************************
函数名称:LCD_init
功    能: 初始化LCD
参    数:无
返回值  :无
********************************************/
void LCD_init()
{
  writecmd(0x30);
  delayms(1);
   writecmd(0x30);
  delayms(1);
   writecmd(0x0c);
  delayms(1);
  writecmd(0x01);
  delayms(1);
  writecmd(0x06);
  delayms(1);
}
/*******************************************
函数名称:Disp_HZ
功    能:指定地址输入指定个数的字
参    数:无
返回值  :无
********************************************/
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
    uchar i;  
    writecmd(addr);
      for(i = 0;i < (num*2);i++)
     {
    writedate(*(pt++));
    delayms(1);
     }
}
void write_sfm(uchar x,uchar y,uchar shu)
{
  uchar d1,d2,add,ah;
  d1=shu/10;
  d2=shu%10;
  if(x==0)
  ah=0x80;
  else if(x==1)
  ah=0x90;
  else if(x==2)
  ah=0x88;
  else ah=0x98;
  add=ah+y;            //相当于ah+al
  writecmd(add);
  writedate( d1+'0');
  writedate( d2+'0');
}   
/*******************************************
函数名称:Clear_GDRAM
功    能:清除液晶GDRAM内部的随机数据
参    数:无
返回值  :无
********************************************/
void Clear_GDRAM(void)
{
   uchar x,y,i,j;
   
writecmd(0x34);        //打开扩展指令集        
  y=0x80;
  x=0x80;
   
  for(i=0;i<32;i++)
  {   
      writecmd(y);
    writecmd(x);
   for(j=0;j<16;j++)
   {
     writedate(0x00);
   }
   y++;
  }

  y=0x80;
     x=0x88;
   
  for(i=0;i<32;i++)
  {   
   writecmd(y);
    writecmd(x);
   for(j=0;j<16;j++)
   {
    writedate(0x00);
   }
   y++;
  }  
writecmd(0x30);        //回到基本指令集
}  
  /*******************************************
函数名称:Draw_PM
功    能:在整个屏幕上画一个图片
参    数:ptr--指向保存图片位置的指针
返回值  :无
********************************************/
void Draw_PM(uchar *ptr)
{    uchar  x,y,i,j;      
  y=0x80;
  x=0x80;   
  for(i=0;i<32;i++)
  {   
      writecmd(y);
      writecmd(x);
   for(j=0;j<16;j++)
   {
     writedate(*ptr++);
   }
   y++;
  }

  y=0x80;
     x=0x88;
   
  for(i=0;i<32;i++)
  {   
   writecmd(y);
    writecmd(x);
   for(j=0;j<16;j++)
   {
    writedate(*ptr++);
   }
   y++;
  }
}
  /*******************************************
函数名称:Draw_point
功    能:在整个屏幕上画一个点  X 0~127  Y 0~63
参    数:ptr--指向保存图片位置的指针
返回值  :无
********************************************/
void Draw_point(uchar X,uchar Y,uchar clour)  // clour为0时画点为其它清除这个点
{
     uchar x_pos,y_pos,x_bit;
     uint read_data1,read_data2,dat1,dat2;
                                         //计算LCD位置
     x_pos=X/16;                             //取16*16首地址
     if(Y>31)
  x_pos+=8;                       //计算该点所属LCD液晶中X坐标位置,上半屏0-7,下半屏8-15
     x_bit=X%16;                          //该点位于所在16bit中的第几位
     y_pos=Y%32;
  
// writecmd(0x34);   
  writecmd(0x36);
  
  writecmd(0x80+y_pos);
     writecmd(0x80+x_pos);
  readdate();               //此处为什么要中上不知道为什么????  
  read_data1 = readdate();  //高八位!
  read_data2 = readdate();  //低八位!
   
   if(x_bit<8)
   {
     if(clour==0)
  {
      dat1=read_data1|(1<<(7-x_bit));
  }
  else
  {
     dat1=read_data1&~(1<<(7-x_bit));  
  }        
     dat2=read_data2;
   }
   else
   {
      dat1=read_data1;  
  if(clour==0)
  {   
   dat2=read_data2|(1<<(15-x_bit));     
  }
  else
  {
       dat2=read_data2&~(1<<(15-x_bit));     
  }         
   }

   writecmd(0x80+y_pos);
      writecmd(0x80+x_pos);
   writedate(dat1);
   writedate(dat2);
  
   writecmd(0x30);  
}
/*******************************************
函数名称:Draw_zhi
功    能:在整个屏幕上画一条直线
参    数:
返回值  :无
********************************************/
void Draw_zhi(uchar X1,uchar X2,uchar Y,uchar clour)
{
     uchar i,temp ;
   if(X1>X2)                //X轴上,起点大于终点,交换数据
   {
     temp=X2;
     X2=X1;
     X1=temp;   
   }
    for(i=X1;i<=X2;i++)
  {
      Draw_point(i,Y,clour);
  }
}
/*******************************************
函数名称:Draw_shu
功    能:在整个屏幕上画一条竖线
参    数:
返回值  :无
********************************************/
void Draw_shu(uchar X,uchar Y1,uchar Y2,uchar clour)
{
     uchar i ,temp;  
  if(Y1>Y2)                //X轴上,起点大于终点,交换数据
   {
     temp=Y2;
     Y2=Y1;
     Y1=temp;   
   }
    for(i=Y1;i<=Y2;i++)
  {
      Draw_point(X,i,clour);
  }
}   
/*******************************************
函数名称:Draw_line
功    能:在整个屏幕上画一条线 任一的角度都可以画线!!!!
参    数:ptr--指向保存图片位置的指针
返回值  :无
********************************************/
void Draw_line(uchar x0,uchar y0,uchar x1,uchar y1,uchar clour)
{
int dx,dy;                //定义X.Y轴上增加的变量值
int sub;
int temp;                //起点、终点大小比较,交换数据时的中间变量
uchar flag;
if(x0>x1)                //X轴上,起点大于终点,交换数据
   {
   temp=x1;
   x1=x0;
   x0=temp;  
   temp=y1;
   y1=y0;
   y0=temp;   
   }

   
dx=x1-x0;                //X轴方向上的增量
dy=y1-y0;                //Y轴方向上的增量
   if(dx==0)               
   Draw_shu(x0,y0,y1,clour);
if(dy==0)                 
   Draw_zhi(x0,x1,y0,clour);


   if(dy>0)
    flag=1;
    else
    flag=0;

if((dx!=0)&&(dy!=0))
{
/* 布兰森汉姆(Bresenham)算法画线 */
if(flag==1)
{
  if(dx>=dy)                  //靠近X轴
{
   sub=2*dy-dx;              //计算下个点的位置         
   while(x0!=x1)
   {
   Draw_point(x0,y0,clour);        //画起点
     x0++;                  // X轴上加1
     if(sub>0)                // 判断下下个点的位置
     {
       y0++;                  // 为右上相邻点,即(x0+1,y0+1)
       sub+=2*dy-2*dx;
     }
     else         
       sub+=2*dy;            // 判断下下个点的位置         
   }
   Draw_point(x0,y0,clour);
}
     
   else
   {
   sub=2*dy-dx;              //靠近Y轴        
   while(y0!=y1)
     {
   Draw_point(x0,y0,clour);        //画起点
   y0++;                  
     if(sub>0)              //判断下下个点的位置

     {
       x0++;               
       sub+=2*dx-2*dy;
     }
     else
       sub+=2*dx;
     }
    Draw_point(x0,y0,clour);
   }
}
else
{
   dy=y0-y1;
   if(dx>=dy)                  //靠近X轴
{
   sub=2*dy-dx;              //计算下个点的位置         
   while(x0!=x1)
   {
   Draw_point(x0,y0,clour);        //画起点
     x0++;                  // X轴上加1
     if(sub>0)                // 判断下下个点的位置
     {
       y0--;                  // 为右上相邻点,即(x0+1,y0+1)
       sub+=2*dy-2*dx;
     }
     else         
       sub+=2*dy;            // 判断下下个点的位置         
   }
   Draw_point(x0,y0,clour);
}
else
  {
    sub=2*dx-dy;              //靠近Y轴        
   while(y0!=y1)
     {
   Draw_point(x0,y0,clour);        //画起点
     y0--;                  
     if(sub>0)              //判断下下个点的位置
     {
       x0++;               
       sub+=2*dx-2*dy;
     }
     else
       sub+=2*dx;
     }
    Draw_point(x0,y0,clour);
  }
      
}
}   
}   
/***********************************************************************************/

/*画圆算法*/

/***********************************************************************************/
void Draw_yuan(uchar x0,uchar y0,uchar r)
{
int a,b;

int di;

a=0;

b=r;  //a=0,与b=r为圆的起始点!!然后往下走!!

di=3-2*r;             //判断下个点位置的标志   ??

while(a<=b)          //里面执行完了说明八分之一个圆画完啦!

{

  Draw_point(x0-b,y0-a,0);             //3           

  Draw_point(x0+b,y0-a,0);             //0           

  Draw_point(x0-a,y0+b,0);             //1      

  Draw_point(x0-b,y0-a,0);             //7           

  Draw_point(x0-a,y0-b,0);             //2            

  Draw_point(x0+b,y0+a,0);             //4               

  Draw_point(x0+a,y0-b,0);             //5

  Draw_point(x0+a,y0+b,0);             //6

  Draw_point(x0-b,y0+a,0);            

  a++;

  /***使用Bresenham算法画圆**/     
  if(di<0)

  di +=4*a+6;

  else
  {
    di+=10+4*(a-b);   
    b--;
  }
  Draw_point(x0+a,y0+b,0);           //可在此处做想法!!!
  }


}


/***********************************************************************************/

/*函数值为半径长和角度返回的是X的值*/

/***********************************************************************************/
uchar Draw_time_x(uchar girth,uchar angle)   //长度角度返回X
{
   uchar x;
   if((angle>0)&&(angle<=15))
   {  
     x=64+girth*(sin(pi*angle/30));   
   }
   else if(angle>15&&angle<=30)   
   {  
      x=64+girth*cos((pi*angle)/30-(pi/2));


   }
   else if(angle>30&&angle<=45)
   {
       x=64-girth*sin((pi*angle)/30-pi);
   }
   else
   {
         x=64-girth*cos((pi*angle)/30-((3*pi)/2));
   }  
    return x;
}

/***********************************************************************************/

/*函数值为半径长和角度返回的是Y的值*/

/***********************************************************************************/
uchar Draw_time_y(uchar girth,uchar angle)   //长度角度返回Y
{
uchar y;
   if((angle>0)&&(angle<=15))
   {     
  y=32-girth*(cos(pi*angle/30));
   }
   else if(angle>15&&angle<=30)   
   {  
  y=32+girth*sin((pi*angle)/30-(pi/2));

   }
   else if(angle>30&&angle<=45)
   {
  y=32+girth*cos((pi*angle)/30-pi);
   }
   else
   {
    y=32-girth*sin((pi*angle)/30-((3*pi)/2));  
   }  
return y;
}
/***********************************************************************************/

/*画出秒时分三条直线*/

/***********************************************************************************/
void Draw_all_line()
{
    if(time_miao)
    {
       time_miao=0;
    x_miao=x_now_miao;
       y_miao=y_now_miao;  
    if(set!=2)
       {Draw_line(x_miao,y_miao,64,32,1);}  //清除上线画的直线  
    x_now_miao=Draw_time_x(24,miao);       //算出X
       y_now_miao=Draw_time_y(24,miao);       //算出Y  
      
    }  
      if(time_fen)
    {
       time_fen=0;
    x_fen=x_now_fen;
       y_fen=y_now_fen;  
    if(set!=2)
      { Draw_line(x_fen,y_fen,64,32,1);}  //清除上线画的直线  
    x_now_fen=Draw_time_x(19,fen);       //算出X
       y_now_fen=Draw_time_y(19,fen);       //算出Y  
      
    }
      if(time_shi)
    {
       time_shi=0;
    x_shi=x_now_shi;
       y_shi=y_now_shi;  
    if(set!=2)
       {Draw_line(x_shi,y_shi,64,32,1);}  //清除上线画的直线  
    x_now_shi=Draw_time_x(14,shi);       //算出X
       y_now_shi=Draw_time_y(14,shi);       //算出Y
      
    }
    write_sfm(0,1,miao);       //显示秒
   write_sfm(1,1,fen);      //显示分
   write_sfm(2,1,shi/5);     //显示时
if(set!=2)
    {
      Draw_line(x_now_miao,y_now_miao,64,32,0);   //画线
   Draw_line(x_now_fen,y_now_fen,64,32,0);   //画线
    Draw_line(x_now_shi,y_now_shi,64,32,0);   //画线
    }
}
/***********************************************************************************/

/*时钟表初始化函数*/

/***********************************************************************************/
void Draw_time_init()
{
  uchar i,j;
  Clear_GDRAM();
  Draw_yuan(64,32,31);
  for(i=0;i<60;i++)
  {
      if(i%5!=0)
    {Draw_point(Draw_time_x(28,i),Draw_time_y(28,i),0); }
  }
    for(j=0;j<12;j++)
  {
    Draw_point(Draw_time_x(26,5*j),Draw_time_y(26,5*j),0);
  }
}
void keyscan_nangzhong()
{
    if(key_inc_time==0)     //因只有四个键所以这里把减的这个键作为一个状态键
   {
       delayms(5);
    if(key_inc_time==0)
    {
     nangzhong_stutas++;
     if(nangzhong_stutas==3)
     {nangzhong_stutas=0;}
    }
   }



         if(key_ok_time==0)
            {
              delayms(5);
           if(key_ok_time==0)
     {
       nangzhong_ok++;
       if(nangzhong_ok==2)
       {
         nangzhong_ok=0;
       }
     }
      }



    if(key_add_time==0)
   {
       delayms(5);
    if(key_add_time==0)
    {
     if(nangzhong_stutas==0)
   {
    set_nangzhong_miao++;
    if(set_nangzhong_miao==60)
    {set_nangzhong_miao=0;}
   }


   if(nangzhong_stutas==1)
   {
     set_nangzhong_fen++;
      if(set_nangzhong_fen%12==0)
              {
                 set_nangzhong_shi++;
         
              if(set_nangzhong_shi==60)
                  set_nangzhong_shi=0;
              }
             if(set_nangzhong_fen==60)
             {  set_nangzhong_fen=0;}
   }


   if(nangzhong_stutas==2)
   {
       set_nangzhong_shi=set_nangzhong_shi+5;
      if(set_nangzhong_shi>=60)
              {  
                  set_nangzhong_shi=set_nangzhong_shi-60;
      }
   }
   nangzhong_clear=1;

    }
   }

}
void Draw_nangzhong_all_line()
{
  if(nangzhong_clear)
  {
   nangzhong_clear=0;

   write_sfm(0,6,set_nangzhong_miao);       //显示秒
   write_sfm(1,6,set_nangzhong_fen);          //显示分
   write_sfm(2,6,set_nangzhong_shi/5);

   x_set_oldzhong_miao=x_set_newzhong_miao;
   y_set_oldzhong_miao=y_set_newzhong_miao;
   x_set_oldzhong_fen=x_set_newzhong_fen;
   y_set_oldzhong_fen=y_set_newzhong_fen;
   x_set_oldzhong_shi=x_set_newzhong_shi;
   y_set_oldzhong_shi=y_set_newzhong_shi;




   Draw_line(x_set_oldzhong_miao,y_set_oldzhong_miao,64,32,1);
   Draw_line(x_set_oldzhong_fen,y_set_oldzhong_fen,64,32,1);
   Draw_line(x_set_oldzhong_shi,y_set_oldzhong_shi,64,32,1);

   x_set_newzhong_miao=Draw_time_x(24,set_nangzhong_miao);       //算出X
   y_set_newzhong_miao=Draw_time_y(24,set_nangzhong_miao);
   x_set_newzhong_fen=Draw_time_x(19,set_nangzhong_fen);       //算出X
   y_set_newzhong_fen=Draw_time_y(19,set_nangzhong_fen);
   x_set_newzhong_shi=Draw_time_x(14,set_nangzhong_shi);      
   y_set_newzhong_shi=Draw_time_y(14,set_nangzhong_shi);


   Draw_line(x_set_newzhong_miao,y_set_newzhong_miao,64,32,0);   //画线
   Draw_line(x_set_newzhong_fen,y_set_newzhong_fen,64,32,0);   //画线
   Draw_line(x_set_newzhong_shi,y_set_newzhong_shi,64,32,0);   //画
  }
}
void nangzhong_cometrue()
{
    Draw_nangzhong_all_line();
if(nangzhong_ok)
{     if(set==2)
           { Disp_HZ(0x9e,hang_cancle,2);}
    else
      {Disp_HZ(0x9e,hang_nang,2);}  
    if((miao==set_nangzhong_miao)&&(fen==set_nangzhong_fen)&&(set_nangzhong_shi==shi))
      {
     beep=0;
   }
     if((miao==set_nangzhong_miao+5)&&(fen==set_nangzhong_fen)&&(set_nangzhong_shi==shi))
      {
     beep=1;
   }
}
  
}
/***********************************************************************************/

/*按键函数调时功能这里没做减的功能 因为是一样的做法*/

/***********************************************************************************/
void keyscan()
{
   if(key_set_time==0)
     {
     delayms(5);
  if(key_set_time==0)
  {
    set++;
       if(set==3)
    {
      set=0;
   t_time=0;
    }

    if(set==0)
    {  
         if(nangzhong_ok==0)
      {
       Disp_HZ(0x86,hang5,1);      //
          Disp_HZ(0x96,hang5,1);
       Disp_HZ(0x8e,hang5,1);
    Disp_HZ(0x9e,hang5,1);
    Disp_HZ(0x9f,hang5,1);
      }
  
             Draw_line(x_set_newzhong_miao,y_set_newzhong_miao,64,32,1);   
                Draw_line(x_set_newzhong_fen,y_set_newzhong_fen,64,32,1);   
                Draw_line(x_set_newzhong_shi,y_set_newzhong_shi,64,32,1);   
      
    }
       if(set==2)
    {
       nangzhong_clear=1;
       Draw_line(x_now_miao,y_now_miao,64,32,1);   //除去
       Draw_line(x_now_fen,y_now_fen,64,32,1);   //
        Draw_line(x_now_shi,y_now_shi,64,32,1);   //
    }  
  

  }
   
  }
   
   
if(set==1)
{   
      EA=0;
   if(key_inc_time==0)
   {
     delayms(5);
   if(key_inc_time==0)
   {
     t_time++;
     if(t_time==3)
      t_time=0;
   }
   }

   if(key_add_time==0)
   {
       delayms(5);
    if(key_add_time==0)
    {
      if(t_time==0)
   {
       miao++;
       time_miao=1;
      if(miao==60)
              {  
                  miao=0;
      }
   }
   if(t_time==1)
   {
       fen++;
       time_fen=1;
    time_shi=1;
       if(fen%12==0)
              {
                 shi++;
         
              if(shi==60)
                  shi=0;
              }
             if(fen==60)
               fen=0;
   }


     if(t_time==2)
   {
       shi=shi+5;
       time_shi=1;
      if(shi>=60)
              {  
                  shi=shi-60;
      }
   }

    }

   }

}

   if(set==2)
      {
     EA=1;
        keyscan_nangzhong();
      }


}
void Time_init()
{
    TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
TR0=1;
ET0=1;
}

void main()
{
   Time_init();
   LCD_init();
   Draw_time_init();
   Disp_HZ(0x80,hangmiao,1);
   Disp_HZ(0x90,hangfen,1);
   Disp_HZ(0x88,hangshi,1);
   while(1)
   {  
     keyscan();  
  Draw_all_line();   
  nangzhong_cometrue();  
  if(set==0)
   {  Disp_HZ(0x98,hang_time,2);}
  else if(set==1)
   {
     if(t_time==0)
  { Disp_HZ(0x98,hang_miao,2);}
  else if(t_time==1)
  { Disp_HZ(0x98,hang_fen,2);}
  else
  { Disp_HZ(0x98,hang_shi,2);}
   }
  else
  {
    Disp_HZ(0x98,hang_nang,2);
   if(nangzhong_ok==0)
   {
    if(nangzhong_stutas==0)
    {Disp_HZ(0x9e,hang_miao,2);}
    else if(nangzhong_stutas==1)
    {Disp_HZ(0x9e,hang_fen,2);}
    else
    {Disp_HZ(0x9e,hang_shi,2);}
   }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
  }
      
   }
}

void exter0() interrupt 1
{              
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
  time_miao=1;
  tt=0;
  miao++;
  if(miao==60)
  {  
    miao=0;
    time_fen=1;
    fen++;
     if(fen%12==0)
    {
       shi++;
   time_shi=1;
   if(shi==60)
     shi=0;
    }
  if(fen==60)
   fen=0;
   
  }

}


}



LCD12864指针型时钟.rar (4.94 KB, 下载次数: 10)



12864+ds1302+ds18b20实现指针时钟,数字时钟,温度,日期同步显示
基于80C51的LED灯模拟表盘时钟设计
LCD12864指针型时钟

举报

Rank: 1

贡献值
1
金币
3
帖子
2
发表于 2012-10-17 11:48:00 |显示全部楼层
谢谢分享!下来参考一下!

Rank: 5Rank: 5

贡献值
639
金币
3334
帖子
1121
发表于 2012-10-17 16:33:54 |显示全部楼层
看不懂呀

Rank: 1

贡献值
1
金币
2
帖子
1
发表于 2018-1-2 10:46:11 |显示全部楼层
厉害了,真需要
您需要登录后才可以回帖 登录 | 注册

免责声明|Archiver| OFweek论坛 ( 粤ICP备06087881号-1 )   

GMT+8, 2018-2-19 19:26 , Processed in 0.896446 second(s), 34 queries .

Powered by OFweek中国高科技行业门户