发新帖我要提问
12
返回列表
打印

一个时钟程序写了大半天,求批判

[复制链接]
楼主: 雷影少年
手机看帖
扫描二维码
随时随地手机跟帖
21
雷影少年|  楼主 | 2012-6-30 19:16 | 只看该作者 回帖奖励 |倒序浏览
谢谢斑竹~:)
我好好揣摩下~:D
第一次知道程序可以这样写~:(

使用特权

评论回复
22
sedatefire| | 2012-6-30 21:55 | 只看该作者
本帖最后由 sedatefire 于 2012-7-3 23:27 编辑

void clock_update(void)
{
#define     TIMER_UNIT           (10)  /* 本函数挂载的时间点 */
      static  uint_fast8_t  sec = 0;
      static  uint_fast8_t  min = 0;
      static  uint_fast8_t  hour = 0;
      static  unt_fast8_t   sec_cnt = 0;
      if (++sec_cnt >= (1000/TIMER_UNIT))     
      {
             sec_cnt = 0;
                        
             if (++sec  >=  60)
             {
                     sec=0;
                     if (++min  >=  60)
                    {
                            min=0;
                            if  (++hour >= 24)
                           {
                                   hour=0;
                           }
                    }
             }   
             clock_display(sec, min, hour);  /* 调用显示函数更新显示内容*/
       }
}

使用特权

评论回复
23
sedatefire| | 2012-6-30 22:03 | 只看该作者
void clock_update(void)
{
#define     TIMER_UINT           (10)  /* 本函数挂载的时间点 */
      static  uint_fast8_t  sec = 0;
      static  uint_fast8_t  min = 0;
      static  uint_fast8_t  hour = 0 ...
sedatefire 发表于 2012-6-30 21:55

去参阅 《高质量C/C++编程规范》前面六章,作者林锐,上海贝尔公司用的内部规范,网上可以搜索得到,这样你的代码的格式就会写得漂亮一些

使用特权

评论回复
24
雷影少年|  楼主 | 2012-7-1 09:20 | 只看该作者
去参阅 《高质量C/C++编程规范》前面六章,作者林锐,上海贝尔公司用的内部规范,网上可以搜索得到,这样你的代码的格式就会写得漂亮一些
sedatefire 发表于 2012-6-30 22:03

已经搜到了~正在看:shutup:

使用特权

评论回复
25
sedatefire| | 2012-7-3 14:40 | 只看该作者
尽快学好,期待你修改后的新程序

使用特权

评论回复
26
雷影少年|  楼主 | 2012-7-3 16:14 | 只看该作者
还有许多不明白~

使用特权

评论回复
27
雷影少年|  楼主 | 2012-7-3 16:25 | 只看该作者
比如说:
程序中有时会遇到if/else/return 的组合,应该将如下不良风格的程序
if (condition)
return x;
return y;
改写为
if (condition)
{
return x;
}
else
{
return y;
}
或者改写成更加简练的
return (condition ? x : y);
第一种写法有什么不好?我挺喜欢的
第二种写法太麻烦了
我记得在哪看到过说第三种写法比较赞资源

使用特权

评论回复
28
雷影少年|  楼主 | 2012-7-3 23:23 | 只看该作者
纠结了,看了几天书,几天试着写下外部程序还是写不好请各位大神指点下

下面是源程序:

/*数字时钟程序*/
#include<reg51.h>
#include"display.c"   //显示子程序
#include"time.c"   //时钟更新子程序
u8 count;

void main(void)
{
EA =1;      //开中断
ET0 =1;
TMOD =0x01;
TH0 =-(50000/256);
TL0 =-(50000%256);
TR0 =1;
while (1)
{
//  count=time(count);  //调用时中更新子程序
  time(count);
  delay(10);    //延时
}
}
void time50() interrupt 1       //每50ms中断一次
{
TH0=-(50000/256);
TL0=-(50000%256);
count++;
}
  


/*时钟显示子模块*/
typedef unsigned char u8 ;
/*初始化数组 时间显示
    选择数码管位(从左至右)
    数码管显示缓冲*/
u8 code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
u8 code wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8   seg1[]={0,1,2,3,4,5,6,7};

/*延时子程序*/
void delay(u8 x)
{
u8 a,b;
for (a=x;a>0;a--)
  for (b=100;b>0;b--);

}

/*显示子程序*/
void display(u8 sec,min,hour)
{
u8 i;
seg1[7] =sec%10;    //将时间放至缓冲区
seg1[6] =sec/10;
seg1[5]=10;
seg1[4] =min%10;
seg1[3] =min/10;
seg1[2]=10;
seg1[1] =hour%10;
seg1[0] =hour/10;
for (i=0;i<8;i++)  // 动态显示
{
  P0 =0xff;
  P2 =wei[i];
  P0 =seg[seg1[i]];
  delay(10);
}
}




/*时间更新模块*/
//u8 time(count)
void time(count)
{
static u8 sec =50;  //装载时钟秒初始值
static u8 min =59;  //装载分初始值
static u8 hour =23;  //装载时初始值

if (count==20)
{
  count =0;
  if ( ++sec>=60)   //秒更新
  {
   sec=0;
   if (++min>=60)   //分更新
   {
    min =0;
    if (++hour>=23)   //时更新
    hour =0;
   }
  }
}   
   display(sec,min,hour);    //调用显示子程序
// return count;      //返回count值
}


count我定义的是全局变量,在调用time子程序的时如果子程序的count发生变化,主程序中的count为什么不变化啊?

如果把//return count这句取消注释,后时钟能够走时、进位,但是速度大约是正常时间的1/15;实在不明白是为什么?

求各位大神指点啊~









unt我定义

使用特权

评论回复
29
雷影少年|  楼主 | 2012-7-3 23:24 | 只看该作者
本帖最后由 雷影少年 于 2012-7-3 23:31 编辑

开新帖吧~给大神们送点分

使用特权

评论回复
30
zhaoleira| | 2012-7-5 09:45 | 只看该作者
学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则