去了新公司看到源代码,看到这些时,我无法理解.

2020-01-23 14:30发布

        最近跳槽,新进一家公司有两个月了,然后今天上头弄了一份代码给我看,说熟悉下。
        我在程序里面看到了这些,以下是示例
        void keyscan()
        {
        if(K1==0)
          {       
           delayms(20);
           if(K1==0)//确认动作,执行程序
                {
                动作程序;
                }
        }
        }

        main()
        {
        delayms(100);//等上电稳定,时钟稳定
        各种初始化;
        while()
        {
        清看门狗;
        各种子程序;
        delayms(300);
        }
        }
       
       我看到的表情是 ,不过比起我在上一家公司好多了,上一家公司是这么写的。
        void ISR()//中断服务子程序,中断法(按键接在中断脚上)
        {
        if(K1==0)
          {       
           delayms(20);
           if(K1==0)//确认动作,执行程序
                {
                while(!K1);//等待按键松开
                动作程序;
                }
        }
        }
     那是我的表情是 ,这也能行。。。,后来我改掉了那个公司所有子程序。
       
    其实我看到这些,我现在更大的不知何去何从.  我无法理解,目前看到的代码,除了唯一看到一个采用定时器轮询法扫按键(本坛的状态机法等不包括在内),其它一律用delay();甚至中断while()等待松键
   有时庆兴自己啊,在这里泡了两年。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
ijlc1314
1楼-- · 2020-02-02 15:28
shower.xu 发表于 2014-7-2 15:17
我一般优先delay,timer没中断,还要自己去查,够用就行。优先宏而不是call子程序,因为没堆栈,跳转入栈出 ...

什么芯片啊?
xpxp
2楼-- · 2020-02-02 16:48
这是我编写某单总线发送数据、接收数据并进行响应的函数。你看看你用定时器,是不是更乱。
发送:
void HDQ_WRITE(uchar val)  //写一个字节,低位在前发送,正确无误无需再检查2014.01.16
{
        uchar i;
        uchar temp;
        Delay10us(7);     //如果直接发送的话,寄存器地址的第8个数字脉冲没有足够延时
        for(i=0;i<8;i++)  //导致从低电平变成高电平的时间只有数us。所以延时70us
        {
           temp=val>>i;
           temp&=0x01;
                   HDQ_TXD=1;
           Delay10us(3);      //30us
           if(temp)HDQ_TXD=0;
           Delay10us(8);     //80us
                   HDQ_TXD=0;
           Delay10us(8);     //80us
        }
}
接收并响应:
void exint1() interrupt 2       //INT1中断入口,读取总线数据的寄存器地址。无误无需再检查2014.01.16
{
    uchar TMPH,TMPL;
    TMPH=0;     //高电平计数器
   TMPL=0;     //低电平计数器
   _nop_();
    _nop_();
    _nop_();
   while(HDQ_RXD==0)   //进中断后,等待第一个低电平结束,准备测量下一个高电平有效数据的宽度
  {
       Delay10us(1);
      TMPL++;
      if(TMPL>25)break;  //为防止长时间失去响应设置的中断点
  }
    _nop_();             //进中断的低电平是TBR信号产生的,注意反向
   _nop_();
    _nop_();
  while(HDQ_RXD)       //对高电平的宽度进行测量,以10us进行计数
  {
         Delay10us(1);
         TMPH++;
         if(TMPH>25)break;    //为防止长时间失去响应设置的中断点
  }
  if(TMPH<6)ADDR=ADDR|(0x01<<STEP);    //如果测得的宽度小于60us则数据位是1
  STEP++;
  if(STEP==8)          //第8个高电平后发送对应的数据
  {
                 EX1=0;          //关闭中断1
                 if(ADDR==0x3)M37512=0;    //判断不是M37512芯片
         if(ADDR==0x2)M37512=0;
         if(ADDR==0x5)M37512=0;
         if(ADDR==0x17)M37512=0;         
         HDQ_WRITE(Pana_data[ADDR]);  //根据主机发来的寄存器地址,发出对应的数据
           Delay10us(8);            
         STEP=0;
         ADDR=0;
                 IE1=0;         //清除中断1标志位
           EX1=1;          //使能中断1
     }
  if(TMPH>25||TMPL>25)STEP=0;      //如果不是正常进入的中断,则清除计数以便从头再来
}
shower.xu
3楼-- · 2020-02-02 18:49
 精彩回答 2  元偷偷看……
majianjia1991
4楼-- · 2020-02-02 21:47
一般来说中断不能用延时嘛。。这种想法是正确滴,
但是反过来说,中断中是不是一定不能用延时,对延时函数对简单的单片机本身来说木有啥区别。
系统对实时性要求不高,对运行效率没要求,中断直接延时看起来程序简单,也没啥不行的。
4058665
5楼-- · 2020-02-03 02:25
玩的深   未必赚的也深
rom
6楼-- · 2020-02-03 03:36
就是新手写的代码而已,有啥?

一周热门 更多>