请教一个实现指示灯控制的问题

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

请给出大概思路,我将非常非常感谢!
...全文
121 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
oo_v_oo 2008-09-11
  • 打赏
  • 举报
回复
回LS
你也不妨把我的回复先保存起来,看看
或许,你还没有领会
cnzdgs 2008-09-10
  • 打赏
  • 举报
回复
LZ和1楼都是学生?不妨把我的回复先保存起来,工作一段时间后想起来再看看。
再顺便提一下,没有窗口也可以用定时。
DJstro 2008-09-10
  • 打赏
  • 举报
回复
oo_v_oo 朋友的一个线程加一个有10个数组成员的数组非常好用
在这里再次感谢他,同时给他加分,其他参与的朋友也会有分,
谢谢你们!
gaoteng1984 2008-09-09
  • 打赏
  • 举报
回复
没有窗口的话,用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;
}

oo_v_oo 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 DJstro 的回复:]
非常感谢oo_v_oo 朋友,
你的想法非常不错,只是没啥解释,我看了半天才大概看明白,我明天去试一下.
分数先给一半,如果搞定了,剩下的明天再给你加!
请问你有过类似的经验吗?
[/Quote]

客气
DJstro 2008-09-09
  • 打赏
  • 举报
回复
不好意思,因为没有窗口,不能使用windows消息
感谢cnzdgs 的回复
DJstro 2008-09-09
  • 打赏
  • 举报
回复
非常感谢oo_v_oo 朋友,
你的想法非常不错,只是没啥解释,我看了半天才大概看明白,我明天去试一下.
分数先给一半,如果搞定了,剩下的明天再给你加!
请问你有过类似的经验吗?
oo_v_oo 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cnzdgs 的回复:]
只需要1个主线程。


[/Quote]

ls 呵呵
cnzdgs 2008-09-09
  • 打赏
  • 举报
回复
只需要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);
oo_v_oo 2008-09-09
  • 打赏
  • 举报
回复
记得给分
oo_v_oo 2008-09-09
  • 打赏
  • 举报
回复

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);
}
}

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧