jhjkdz 发表于 2013-12-16 21:52:41

74HC164驱动LED,怎样能让它闪呢

ATMEG8串行,时钟两线连接74HC164,74HC164连接一个个led。电路图如下:单独让灯亮或灭。都可以做到,怎样做能让它闪呢?哪位大虾讲讲思路啊!

gentlerain 发表于 2013-12-16 22:03:24

晕,一会亮一会灭不就是闪吗,这么简单的问题还问.

kelos3000 发表于 2013-12-16 22:15:57

支持楼上…

四轴飞行器 发表于 2013-12-16 22:19:34

感觉这个我有发言权,前段时间刚刚研究了164,能够做到2个164驱动8个数码管,同时还有8个按键这个很简单的,164是移位寄存器,   想让他闪很简单的
//CLK接 PD3
//DAT 接 PD4
void send(uchar byte)
        {
           uchar i = 0;
           for(i = 0;i<8;i++)
                           {
                        CLK = 0;   CLK = 0;CLK = 0;_nop_(); _nop_(); _nop_(); _nop_();       
                        if((byte&0X80)==0x80)        DAT = 1;
                                else   DAT = 0;
                        CLK = 1;   CLK = 1;CLK = 1;           
                        byte <<= 1;_nop_(); _nop_(); _nop_(); _nop_();
                        }
        }
void main()
{
send(0XFF);
delay(500); //延时500ms在发送
send(0);
delay(500);//延时500ms在发送
延时500ms在发送
}

四轴飞行器 发表于 2013-12-16 22:20:34

还得注意下电流的大小,别超过芯片的承受能力就行。

yyts 发表于 2013-12-16 22:21:51

闪就是你让它亮一下灭一下亮一下灭一下.......

jhjkdz 发表于 2013-12-16 22:26:44

如果不用延时呢?让灯闪?

jhjkdz 发表于 2013-12-16 22:28:27

用延时的话,如果还有按键扫描,那按键就不灵了吧?

skyxjh 发表于 2013-12-16 22:32:46

你的定时器拿来做什么用的?延时就只知道空循环在哪傻等吗?

tenx 发表于 2013-12-16 22:34:04

用定期刷新状态的方法就可以,状态机吧

jhjkdz 发表于 2013-12-16 22:38:03

tenx 发表于 41&nbsp;秒前 static/image/common/back.gif
用定期刷新状态的方法就可以,状态机吧

定期怎么实现呢?思路能否再详细一点?

weijia 发表于 2013-12-16 22:45:30

是要你用定时中断加状态机。

llb126yx 发表于 2013-12-16 22:51:47

定时的给OE引脚方波信号

四轴飞行器 发表于 2013-12-17 00:15:48

jhjkdz 发表于 2013-12-16 22:28
用延时的话,如果还有按键扫描,那按键就不灵了吧?

我的代码是给你讲解怎么用的,你可以放在中断里发送数据给164,164的反映速度很快

jhjkdz 发表于 2013-12-17 00:20:03

四轴飞行器 发表于 2&nbsp;分钟前 static/image/common/back.gif

我的代码是给你讲解怎么用的,你可以放在中断里发送数据给164,164的反映速度很快

谢谢!.....

cc1987 发表于 2013-12-17 08:09:33

mark
{:smile:}

xiaodao35 发表于 2013-12-17 08:37:04

开个定时器,设定为最小闪烁频率,然后设定个输出表数据,根据中断次数输出数据到164!
如设定10Ms定时,led的效果为亮40MS,灭10Ms!
lightlab[]=
{
        0x01,0x01,0x01,0x01,0x00,       
        0x01,0x01,0x01,0x01,0x00,                                                               
};
这种时可以调节频率的,修改相应的数据表就可以,如果是10MS亮,10MS灭就改为
lightlab[]=
{
        0x01,0x00,0x01,0x00,0x01,       
        0x00,0x01,0x00,0x01,0x00,                                                                       
};

astankvai 发表于 2013-12-17 09:05:13

呵呵,关键是要闪得多快?渐变的闪(频率比较高)可能比较难做.

jhjkdz 发表于 2013-12-17 11:27:49

xiaodao35 发表于 2013-12-17 08:37
开个定时器,设定为最小闪烁频率,然后设定个输出表数据,根据中断次数输出数据到164!
如设定10Ms定时,le ...

谢谢!看来实现的思路还是有不同的方法啊!

jhjkdz 发表于 2013-12-17 11:44:48

我要求的频率是500ms,假如74HC164连接是8个LED,现在要求其中一个亮,某位清零的方法发送数据。比如原来的数据是发送Dat5,那现在要求其中一个亮,不改变其它灯状态,于是我就发送Dat5 = Dat5 & 0x08(某位清零)。要让这个灯熄灭。我就发送数据Dat5 = Dat5 | 0xfd.(某位置1)现在要让它闪,怎么做。假如已经开500ms定时器。
if(Time_500ms_ok)
{
...这里怎么填?
}

xiaodao35 发表于 2013-12-17 12:08:10

if(Time_500ms_ok)
{
       num++;
       if(num&0x01)
       Dat5 = Dat5 & 0x08;
       else
       Dat5 = Dat5 | 0xfd;

}
其实查表最简单

jhjkdz 发表于 2013-12-17 12:15:53

xiaodao35 发表于 2013-12-17 12:08
if(Time_500ms_ok)
{
       num++;


多谢,晚上回去试试,可行的话,就是最佳答案了!

jhjkdz 发表于 2013-12-17 12:18:09

xiaodao35 发表于 2013-12-17 12:08
if(Time_500ms_ok)
{
       num++;


问一下大虾,num这个变量的作用?

xiaodao35 发表于 2013-12-16 21:52:42

你不是要定时闪烁吗,定义个全局变量num,然后每500ms+1,根据num的计数确定现在该亮或灭!

jhjkdz 发表于 2013-12-17 12:38:27

那假如现在要求就是亮500ms灭500ms(闪烁),那我要判断num是奇数或偶数吗?

dushanwu522 发表于 2013-12-17 14:20:22

不要用164了,换HC595吧 ! 164不带锁存信号,LED多了会闪,595带OE、锁存信号,效果要好多了!!!

jhjkdz 发表于 2013-12-17 16:12:56

dushanwu522 发表于 2013-12-17 14:20
不要用164了,换HC595吧 ! 164不带锁存信号,LED多了会闪,595带OE、锁存信号,效果要好多了!!! ...

学习了!。。。
页: [1]
查看完整版本: 74HC164驱动LED,怎样能让它闪呢