[AVR单片机] maga128控制灯的一个问题

[复制链接]
2098|5
 楼主| cyun0223 发表于 2012-7-10 11:00 | 显示全部楼层 |阅读模式
控制元器件:矩阵键盘、八个指示灯、数码管

工作:按下按键1,第一位数码管显示1,第一个指示灯亮 (且灯亮2秒);
        按下按键2,第二位数码管显示2,第二个指示灯亮(且灯亮2秒);
        依此类推,按下按键8时,又回到第一位数码管显示8,第一个指示灯亮(且灯亮2秒);

待解决问题:例如按下1时,一灯亮。再接着快速按下2时,2灯亮,1灯还会亮一会。此
                 时如何控制?我现在只能做到按下2时,1灯就灭了。

求大侠指点,万分感谢!!!!!
 楼主| cyun0223 发表于 2012-7-10 11:07 | 显示全部楼层
也即是要满足,每个灯单独控制,灯亮的时间又不影响程序的运行.

刚学着写一些程序,求帮助
joyme 发表于 2012-7-10 14:29 | 显示全部楼层
取决于你控制灯的硬件接法,只是硬件上要保证每个灯能单独控制亮或灭
最简单的是不同的灯用不同的IO口控制,程序上,每个灯定义一个字节,第八位表示状态,低七位是个计数器
e.g. 定义一个函数
uchar       b_ledcnt[8] = {0}
void         LEDCtrl(void)
{
       uchar      i;
       for(i=0;i<8;i++)
       {
                if((b_ledcnt[i] & 0x80) !=0)
                {
                       b_ledcnt[i]++;
                       if((b_ledcnt[i] & 0x7f) >= 20)   
                        {
                                b_ledcnt[i]  = 0;
                                clr_led(i);                       
                        }
                }
        }
}
b_ledcnt[i] 在灯点亮(即按下响应按键时)设置为 0x80; 主循环里每100ms调用一次这个函数就能完成定时2s后灭灯
joyme 发表于 2012-7-10 14:31 | 显示全部楼层
每次按键控制亮灯函数可以这么写
void     Light_LED(uchar    index)
{
       set_led(index);
       b_ledcnt[index] = 0x80;
}
 楼主| cyun0223 发表于 2012-7-10 15:16 | 显示全部楼层
3# joyme



clr_led(i);
是什么函数啊?是关灯?
真是感谢,马上试试
 楼主| cyun0223 发表于 2012-7-10 15:29 | 显示全部楼层
4# joyme



B口控制8个灯,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

40

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部