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

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()等待松键
   有时庆兴自己啊,在这里泡了两年。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
100条回答
xpxp
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;      //如果不是正常进入的中断,则清除计数以便从头再来
}

一周热门 更多>