要写一个控制8个指示灯的函数,要有三种状态: 1> 长亮状态;2> 1秒亮1秒灭的慢闪状态; 3>0.2秒亮0.2秒灭的快闪状态.
指示灯的高低电平是用一个函数来控制:SetElec(),该函数的一个参数是BYTE类型,它的8个bit位控制八个指示灯的高低电平;如0x03控制一二路的电平为高,对应的二个提示灯就会亮,否则就会灭;
请问: 如何设置线程来控制这8个指示灯,来达到我想要某个灯是什么状态就可以让它处于某种状态.需要多少个线程控制?请给出大概思路,我将非常非常感谢!

解决方案 »

  1.   


    unsigned char LedStatus[10];
    void SetLedStatus(unsigned char lIndex,unsigned char status) {
       unsigned char ucTmp = 0x01;
       unsigned char i;
       if(lIndex > 7) lIndex = lIndex % 8;
       ucTmp = ucTmp << lIndex;
       switch(status) {
       case 1:
         for(i=0;i<10;i++)
            LedStatus[i] = LedStatus[i] | ucTmp;
         break;
       case 2:
         for(i=0;i<5;i++) {
            LedStatus[i] = LedStatus[i] | ucTmp;
            LedStatus[i+5] = LedStatus[i+5] & (~ucTmp);
         }
         break;
       case 3:
         for(i=0;i<5;i++) {
            LedStatus[2*i] = LedStatus[2*i] | ucTmp;
            LedStatus[2*i+1] = LedStatus[2*i+1] & (~ucTmp);
         }
         break;
       }
    }//一个线程
    void DisplayLed() {
      unsigned char i;
      i=0;
      while(1) {
        SetElec(LedStatus[i]);
        i++;
        if(i>9) i=0;
        sleep(200);
      }
    }
      

  2.   

    只需要1个主线程。窗口类中定义一些成员变量:
    BYTE m_Lamps; // 表示8个灯的高低电平状态
    BYTE m_Status[8]; // 表示各个灯的状态
    DWORD m_Count; //计数器窗口初始化时:
    m_Lamps = 0;
    memset(m_Status, 0, sizeof(m_Status));
    m_Count = 0;
    SetTimer(1, 200, NULL);响应WM_TIMER消息,在OnTimer函数中:
    m_Count++;
    BYTE b = 0x01;
    for (int i=0; i<8; i++)
    {
     switch (m_Status[i])
     {
     case 1:
      m_Lamps |= b;
      break;
     case 2:
      if ((m_Count / 5) % 2)
       m_Lamps |= b;
      else
       m_Lamps &= ~b;
      break;
     case 3:
      if (m_Count % 2)
       m_Lamps |= b;
      else
       m_Lamps &= ~b;
      break;
     }
     b <<= 1;
    }
    SetElec(m_Lamps);
      

  3.   

    非常感谢oo_v_oo 朋友,
    你的想法非常不错,只是没啥解释,我看了半天才大概看明白,我明天去试一下.
    分数先给一半,如果搞定了,剩下的明天再给你加!
    请问你有过类似的经验吗?
      

  4.   

    不好意思,因为没有窗口,不能使用windows消息
    感谢cnzdgs 的回复
      

  5.   

    没有窗口的话,用2个线程就可以了,主线程用来接受输入,子线程用来定期刷新指示灯。cnzdgs老师的代码改成以下,就好了:全局变量: 
    BYTE m_Lamps; // 表示8个灯的高低电平状态 
    BYTE m_Status[8]; // 表示各个灯的状态 
    DWORD m_Count; //计数器 主程序: 
    m_Lamps = 0; 
    memset(m_Status, 0, sizeof(m_Status)); 
    m_Count = 0; 
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CheckFunc, NULL, 0, NULL); //创建子线程
    while(1)
    {
        scanf("%d", &id);
        scanf("%d", &newStatus);
        m_Status[id] = newStatus;    
    }子线程:
    DWORD CheckFunc(LPVOID param)
    {
    while(true)
    {
        m_Count++; 
        BYTE b = 0x01; 
        for (int i=0; i <8; i++) 
        { 
            switch (m_Status[i]) 
            { 
                case 1: 
                    m_Lamps |= b; 
                    break; 
                case 2: 
                    if ((m_Count / 5) % 2) 
                        m_Lamps |= b; 
                    else 
                        m_Lamps &= ~b; 
                    break; 
                case 3: 
                    if (m_Count % 2) 
                       m_Lamps |= b; 
                    else 
                       m_Lamps &= ~b; 
                    break; 
           } 
            b < <= 1; 
        } 
        SetElec(m_Lamps);
        Sleep(200); // 睡眠0.2秒
    }
    return 0;
    }
      

  6.   

    oo_v_oo 朋友的一个线程加一个有10个数组成员的数组非常好用
    在这里再次感谢他,同时给他加分,其他参与的朋友也会有分,
    谢谢你们!