一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4057|回复: 6

[其他综合] 发个这几天做的时钟

[复制链接]
发表于 2011-12-7 20:16 | 显示全部楼层 |阅读模式
本帖最后由 WOSS1001 于 2011-12-7 20:19 编辑

首先感谢坛上的考拉等各位朋友。断断续续学了几个月的C语言,总体感觉C比汇编强大,但写出来的程序比汇编的臃肿。
这个是我做的第一个用C编程的实物。相机不在身边照片发不了。程序写的也乱,大家就当看个热闹吧。压缩文件中有仿真和源程序。 2HC5958x8.rar (78.47 KB, 下载次数: 591) 捕捉-2.jpg
DS1302.C是STC的
#include<reg52.h>
#include"ds1302.c"
#define un8 unsigned char
#define un16  unsigned int
#define row P0    //行
sbit Press_key = P1^0;//按键的I/O
sbit Press_key1 = P1^1;
sbit Press_key2 = P1^2;
sbit st = P3^2; //595第12脚(正脉冲更新输出内容)
//sbit oe_h=P3^4;
//sbit oe_m=P3^5;
un8 bdata Control_Port;     // 声明一个可位寻址的字节变量
sbit     new_value = Control_Port^1;   // 引用该字节变量的某一位
sbit     old_value = Control_Port^2;
sbit     new_value1 = Control_Port^3;   // 引用该字节变量的某一位
sbit     old_value1 = Control_Port^4;
sbit     new_value2 = Control_Port^5;   // 引用该字节变量的某一位
sbit     old_value2 = Control_Port^6;
sbit     ds= Control_Port^7;
code un8 tab[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //行扫描
//code un8 tab[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};  //行扫描
un8 code tab1[]={0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60, //0-9
                 0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,
     0x60,0x90,0x10,0x20,0x40,0x80,0x80,0xf0,
     0x60,0x90,0x10,0x20,0x10,0x10,0x90,0x60,
     0x20,0x20,0x40,0x90,0x90,0xf0,0x10,0x10,
     0xf0,0x80,0x80,0xe0,0x10,0x10,0x90,0x60,
     0x60,0x90,0x80,0xe0,0x90,0x90,0x90,0x60,
     0xf0,0x90,0x10,0x20,0x40,0x40,0x40,0x40,
     0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,
     0x60,0x90,0x90,0x90,0x70,0x10,0x90,0x60
                 };
un8 code tab2[]={0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00};
void delay(un8 xms);
un8 adj;

main()
{
   un8 x,place1,place2,place3,y,z,temp1,temp2;//place位置 从右到左place1,place2,place3,place4
      EA=1;
   ET0=1;
   TMOD|=0X01;
   TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1;
   SCON=0X00;  //工作方式0
   ES=0;         //禁止串行中断
  DS1302_Initial();
  while(1)
     {
        
   for(y=8;y>0;y--)
    {
      z=10;  
      while(z--)
      {
       DS1302_GetTime(now);// 读取当前时间
     for(x=0;x<8;x++)
      {
      if(1==ds&1==adj){ds=0;DS1302_WriteData(0x8e, 0x00);DS1302_WriteData(0x82, HEX2BCD(minute));DS1302_WriteData(0x8e, 0x80);} //分写入
       if(1==ds&2==adj){ds=0;DS1302_WriteData(0x8e, 0x00);DS1302_WriteData(0x84, HEX2BCD(hour));DS1302_WriteData(0x8e, 0x80);}//时写入
      minute = BCD2HEX(now[1]);
      hour  = BCD2HEX(now[2]);
         row = tab[x];         //行
                     
      if(hour<10){place2=0x00;}
      else{place2=tab1[8*(hour/10)+x];}
       place1=tab1[8*(hour%10)+x];
      if(1==adj){SBUF=0x00;}
      else{SBUF=(place1>>4|place2)>>y;}
   
                     while(!TI);
      TI=0;
          st=1;  //更新显示
          st=0;
       delay(10);
         
      SBUF=0x00;  //防残影
               while(!TI);
      TI=0;
          st=1;  
          st=0;
     }
    }
   }  
   ////////////////////
   for(y=0;y<25;y++)
    {
      z=10;    //调走动速度
      while(z--)
      {
        DS1302_GetTime(now);
      
     for(x=0;x<8;x++)
      {
               
       if(1==ds&1==adj){ds=0;DS1302_WriteData(0x8e, 0x00);DS1302_WriteData(0x82, HEX2BCD(minute));DS1302_WriteData(0x8e, 0x80);}
       if(1==ds&2==adj){ds=0;DS1302_WriteData(0x8e, 0x00);DS1302_WriteData(0x84, HEX2BCD(hour));DS1302_WriteData(0x8e, 0x80);}
      minute = BCD2HEX(now[1]);
      hour  = BCD2HEX(now[2]);
      
      row = tab[x];               //行
                  
      if(y<5)
      {
          place3=tab2[x]>>(7-y);
       if(hour<10){place2=0x00;}
       else{place2=tab1[8*(hour/10)+x];}
           place1=tab1[8*(hour%10)+x];
       if(1==adj){temp1=0x00;}
       else{temp1=(place1>>4|place2)<<y;}
             SBUF=temp1|place3;
      }
         else
      {
       if(y<8)
                            {
        place3=tab2[x]>>(7-y);
           if(hour<10){place2=0x00;}
           else{place2=tab1[8*(hour/10)+x];}
        place1=tab1[8*(hour%10)+x];
        if(1==adj){temp1=0x00;}
           else{temp1=(place1>>4|place2)<<y;}
              temp1|=place3;
              
           place2=tab1[8*(minute/10)+x];
               place1=tab1[8*(minute%10)+x];
        if(2==adj){temp2=0x00;}
        else{temp2=(place1>>4|place2)>>(12-y);}  
        SBUF=temp1|temp2;
       }
       else
       {
        if(y<13)
        {
         place3=tab2[x]<<(y-7);
         
         place2=tab1[8*(minute/10)+x];
                   place1=tab1[8*(minute%10)+x];
         if(2==adj){temp2=0x00;}
         else{temp2=(place1>>4|place2)>>(12-y);}  
            SBUF=temp2|place3;  
        }
        else
        {
         place2=tab1[8*(minute/10)+x];
                   place1=tab1[8*(minute%10)+x];
         if(2==adj){SBUF=0x00;}
         else{SBUF=(place1>>4|place2)<<(y-12);}
        }
       }
          }
       while(!TI);
       TI=0;
           st=1;  //更新显示
           st=0;
        delay(10);
      
       SBUF=0x00;  //防残影
                while(!TI);
          TI=0;
           st=1;  //更新显示
           st=0;
      }
       }
      }
  }
}
void delay(un8 xms)
{
  un8 i,j;
  for(i=xms;i>0;i--)
     for(j=120;j>0;j--);
}
void Timer0_interrupt() interrupt 1 using 2
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  new_value =Press_key;
     if(!new_value && old_value)//识别按键。(按下即有效)
  {
          ds=1;
    switch(adj)
    {
     case 0x01:  minute++;if(60==minute){minute=0;}break;
     case 0x02:  hour++;if(60==hour){hour=0;};break;   
     default:  break;
    }
  }
     old_value = new_value;

       new_value1 =Press_key1;
     if(!new_value1 && old_value1)//识别按键。
  {
          ds=1;
    switch(adj)
    {
     case 0x01:  minute--;if(255==minute){minute=59;};break;
     case 0x02:  hour--;if(255==hour){hour=23;};break;   
     default:  break;
    }           
  }
     old_value1 = new_value1;
   new_value2 =Press_key2;
     if(!new_value2 && old_value2)//识别按键。
  {
          adj++;
          if(3==adj)
    {
       adj=0;
   }                  
  }
     old_value2 = new_value2;
}

评分

参与人数 1一乐金币 +3 收起 理由
希望 + 3 不错,做的很好.

查看全部评分

 楼主| 发表于 2011-12-7 20:23 | 显示全部楼层
本帖最后由 WOSS1001 于 2011-12-7 20:24 编辑

595的输出口每个脚都串有150的电阻,仿真中没画的
回复

使用道具 举报

发表于 2011-12-7 20:33 | 显示全部楼层
路过支持下   
回复

使用道具 举报

发表于 2011-12-7 20:39 | 显示全部楼层
本帖最后由 山水2000 于 2011-12-7 20:51 编辑

很好,点阵的时钟就是好看,再加上年月日和温度就好了,多加两个点阵能显示多点信息,看起来也好看。补充一点,设置时,流动应该停止,只显示被设置数。
回复

使用道具 举报

发表于 2011-12-10 18:20 | 显示全部楼层
我喜欢有时间玩玩
回复

使用道具 举报

发表于 2012-2-10 18:27 | 显示全部楼层
这个不错的,应该很好玩,想抄一下玩玩.
回复

使用道具 举报

发表于 2012-2-11 21:24 | 显示全部楼层
做得不错。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-4 19:59 , Processed in 0.036279 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表