第一次用C语言编程,请高手看看这样写规不规范?谢谢!

[复制链接]
 楼主| gyh974 发表于 2011-5-19 16:33 | 显示全部楼层 |阅读模式
本帖最后由 gyh974 于 2011-5-20 17:58 编辑

#include "HT46R064.h"

/************************************************
;*SUB. NAME:
;*INPUT    :
;*OUTPUT   :
;*USED RAM :
;*FUNCTION :
;***********************************************/

#define uint  unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define LED1  _pb1
#define LED2  _pb2
#define RL1   _pa1
#define RL2   _pa2
#define RL3   _pa3
#define k1    _pb3
#define k2    _pb4
uchar   close;
uchar   cnt01s,cnt05s,cnt1s,cnt4s;
uchar   key1,key2;
bit     t2ms_fg,t01s_fg,t05s_fg,t1s_fg,t4s_fg;
#pragma vector time0_isr @ 0x8
/**************************************************
; name of function:
**************************************************/
void init_system(void)
{
  _status=0x00;
  _tmr0=0x83;
  _tmr0c=0b10010110;
  _intc0=0b00000101;
  _acsr=0b00000001;

  _pa =0B00000000;
  _pac=0b00000000;
  _pa =0b00000000;
  _pb =0B00000110;
  _pbc=0b00011000;
  _pb =0b00000110;
  _pbpu=0b00011000;
  _pcc=0b00000000;
  _pc =0b00000000;
for(_mp0=0x40; _mp0<0xff; _mp0++)
   _iar0=0;
   LED1=1;
   LED2=0;
   RL1=0;
   RL2=0;
   RL3=1;
  
}
/**************************************************
; name of function:
**************************************************/
void time0_isr(void)
{

  
  _clrwdt();
  t2ms_fg=1;
  
  
  cnt01s++;
  if(cnt01s>=50)
    {
      t01s_fg=1;
      cnt01s=0;
      cnt05s++;
      if(cnt05s>=5)
      {
        t05s_fg=1;
        cnt05s=0;
      }
      cnt1s++;
      if(cnt1s>=10)
      {
        t1s_fg=1;
        cnt1s=0;
      }
      cnt4s++;
      if(cnt4s>=40)
      {
        t4s_fg=1;
        cnt4s=0;
      }
    }
}
/***********************************************/
void Delay2ms(uchar i)
{
  for(;i!=0;i--)
  {
    t2ms_fg=0;
    while(!t2ms_fg) { _nop(); }
  }
}
/************************************************/
void Delay1s(uchar i)
{
  for(;i!=0;i--)
  {
    cnt1s=0;
    t1s_fg=0;
    while(!t1s_fg) { _nop(); }
  }
}
/*************************************************/
void main(void)
{

init_system();
   
while(1)
       {

           if(k1==0)
           {        
                                            /有按键,继电器无输出
           Delay2ms(10);

           if(k1==0)
                    {

                       cnt4s=0;
                       cnt1s=0;
                       t1s_fg=0;
                       t4s_fg=0;
                       close=1;     
                       RL1=0;
                       RL2=0;
                       RL3=0;
                       
                     }
               
            
          }
         
         
        
        else if (RL1==0&&RL2==0&&RL3==0)
         {             /继电器延时1秒输出
         
              
               if(t1s_fg==1)

               {
                       t1s_fg=0;
                       if(close==0)
                          {               /有按键,继电器3动作,指示灯1亮
              
                          LED1=1;
                          LED2=0;
                          RL1=0;
                          RL2=0;
                          RL3=1;
                        
                         }
                        else
                         {                       /否则,继电继器1和2动作,指示灯2亮            
                           LED1=0;
                           LED2=1;
                           RL1=1;
                           RL2=1;
                           RL3=0;   
                          }
        
            
               }
         
         }               
        
         else if (close==1)                              /如果是按键过,延时4秒恢复初始动作
         {
               
               if(t4s_fg==1)
                 
                    {
                     close=0;
                     t1s_fg=0;
                     cnt1s=0;
                     RL1=0;
                     RL2=0;
                     RL3=0;
                   }
                  
         }
       }
}
yewuyi 发表于 2011-5-19 16:54 | 显示全部楼层
不好
 楼主| gyh974 发表于 2011-5-19 21:50 | 显示全部楼层
我就是感觉用IF真的很乱,不知道有什么好的方法可以减少这么多条件判断?具至编写的排版确实不好!
yjhon 发表于 2011-5-19 22:12 | 显示全部楼层
和泰本身资源有限呐,没法像51那么写的自在吧,个人看法,没写过C
星辰yyt 发表于 2011-5-20 16:49 | 显示全部楼层
就整体的格式提点小小的建议啊:
1、#define LED1 _Pb1之类的有用吗?下面还是使用了LED1这个变量。
2、代码可以摆整齐点哪,采用相同的格式,大括号不要一下子在代码的后面,一下子又转行在一行的开头,保持统一;
3、if语句看起来有点乱,if太多的时候可以考虑用swith语句,不行的话就摆放得有层次一点,注释标清楚。
至于代码规范方面,LZ自己就多检查检查吧,坛里好像有很多关于C语言代码规范的好文哦。
jiamingz 发表于 2011-5-20 16:59 | 显示全部楼层
本帖最后由 jiamingz 于 2011-5-20 17:08 编辑

第一次写成这样,还是很不错了。看的出来很多地方特地注意了下。但是确实有很多不够规范的地方。
例如:
1、#define uint  unsigned int最好能用大写字符定义。 #define UINT32  unsigned int  (注:32位系统)
2、整体的注释少。例如:函数的注释比较少。要写好入口参数,出口参数,返回值,程序员,日期,版本号等,以便于维护。
3、没有看到头文件的内容,不知道函数声明没有。
4、............
我不是高手,但是一眼就看出了至少10处不符合规范的地方。楼主要是看看规范文档吧。网上有很多,单片机程序我建议还是看MISRA C规范。这样写的程序可靠性比高。
 楼主| gyh974 发表于 2011-5-20 17:52 | 显示全部楼层
谢谢,特别是6楼jiaming的建议!还有谢谢星辰,对于你的第1点,LED1并不是定义变量,而是定义的IO口!
星辰yyt 发表于 2011-5-23 16:36 | 显示全部楼层
7# gyh974
是我没有注意:D

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
sysdriver 发表于 2011-5-23 21:32 | 显示全部楼层
表面的东西可以改正,但是内在的却是需要思考和领会的。
程序的目标是:稳定,方便扩展和维护,容易理解,高效简洁。

LZ的程序,你的规范是为目标服务的吗?
好的规范是需要基础的,算法和结构,程序的掌控,程序的结构,分层等,关系复杂呢。
ztb 发表于 2011-5-23 23:29 | 显示全部楼层
推荐《高质量C 编程指南(林锐)》

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
summitzhao 发表于 2011-5-24 16:45 | 显示全部楼层
不错
liang7143 发表于 2011-5-24 17:50 | 显示全部楼层
比我的第一次 好多了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

1259

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部