74hc595检测按键
我用mega16驱动hc595检测7个按键,按下一个按键点亮一个led,如图:http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_599985JXE5US.jpg
(原文件名:未命名1.jpg)
下面是我的代码:
#include "iom16v.h"
#include <macros.h>
void delay(void)
{
unsigned int i;
for(i=0;i<141;i++)
;
}
void delay_ms(unsigned int b)
{
unsigned int a;
for(a=0;a<b;a++)
delay();
}
void Spi_int(void)
{
DDRB|=(1<<PB5)|(1<<PB7)|(1<<PB4);//PB4为RCL信号
SPCR|=(1<<SPE)|(1<<MSTR);// 使能SPI 主机模式
}
unsigned int get_key()
{
unsigned int i;
for (i=0; i<=6; i++)
{
/* Start transmission */
SPDR =(1<<i);
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
PORTB&=~(1<<4); //RCLK拉低
NOP ();
PORTB|=(1<<4); //RCLK拉高 锁存
if ((PINB&0x08))//判断&&与&的区别
{
PORTB&=~(1<<3);//清除上次状态
return (1<<i);
}
}
return 0x00;
}
void main()
{
DDRA=0xfe;
PORTA=0xfe;
DDRB=0xf7;
PORTB=0xf7;//PB3为输入 且为高阻态
DDRC=0xff;
PORTC=0x00; //不点亮LED
DDRD=0xff;
PORTD=0xff;
Spi_int();
while(1)
{
PORTC=get_key();
delay_ms(100);
PORTC=0x00;
}
}
当我随便按下一个按键后,相应的led会点亮一下,但松开按键后第一个LED会一直亮着,为什么啊?
不知道问题出在什么地方,请指教 谢谢 请看datasheet,74hc595不可能检测到按键,请用74hc165. "不知道问题出在什么地方,"
you need to have a clue about what you are doing. 既然PORTB=0xf7;//PB3为输入 且为高阻态 ,那么PORTB&=~(1<<3);//清除上次状态 有何用?
给PORTB3加一个下拉电阻试试看 程序就不看了,正如1楼推荐的,用于输入的并转串用74xx164、165为宜。
当然LZ这么做用595也不是不可以,但要注意现在的电路有点问题:①.多键同时按下时会短路595的输出;②.LED不能没有限流电阻。 本帖最后由 haolaishi 于 2013-1-17 17:45 编辑
不知道楼主的问题有没有解决,我也遇到了类似的问题需要帮助,不知道是不是所存导致的问题,希望能给点意见
http://www.amobbs.com/forum.php?mod=viewthread&tid=4497539&highlight=595%2B%E6%8C%89%E9%94%AE
这里
页:
[1]