要写一个控制8个指示灯的函数,要有三种状态: 1> 长亮状态;2> 1秒亮1秒灭的慢闪状态; 3>0.2秒亮0.2秒灭的快闪状态.
指示灯的高低电平是用一个函数来控制:SetElec(),该函数的一个参数是BYTE类型,它的8个bit位控制八个指示灯的高低电平;如0x03控制一二路的电平为高,对应的二个提示灯就会亮,否则就会灭;
请问: 如何设置线程来控制这8个指示灯,来达到我想要某个灯是什么状态就可以让它处于某种状态.需要多少个线程控制?请给出大概思路,我将非常非常感谢!
指示灯的高低电平是用一个函数来控制:SetElec(),该函数的一个参数是BYTE类型,它的8个bit位控制八个指示灯的高低电平;如0x03控制一二路的电平为高,对应的二个提示灯就会亮,否则就会灭;
请问: 如何设置线程来控制这8个指示灯,来达到我想要某个灯是什么状态就可以让它处于某种状态.需要多少个线程控制?请给出大概思路,我将非常非常感谢!
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);
}
}
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);
你的想法非常不错,只是没啥解释,我看了半天才大概看明白,我明天去试一下.
分数先给一半,如果搞定了,剩下的明天再给你加!
请问你有过类似的经验吗?
感谢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;
}
在这里再次感谢他,同时给他加分,其他参与的朋友也会有分,
谢谢你们!