mega8与74HC165通讯有关问题

mega8与74HC165通讯问题

图如上,程序如下
C/C++ code
void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0xAC;
}

void spi_init(void)
{
 SPCR = 0x60; //setup SPI
 SPSR = 0x00; //setup SPI
}

unsigned char read165(void) //读74HC165函数
{ 
  PORTC &= ~0x01;//PC0输出一个负脉冲
  PORTC |= 0x01; //刷新74HC165的数据
  SPDR=DATA_74HC165; //载入74HC595最后一次的数据,目的是读取74HC165
  [color=#FF0000]while(!(SPSR &amp; (1&lt;<spif))); 等待发送接收结束[/color]



现在程序停在红字的位置了,硬件是没问题的

------解决方案--------------------
这个给你几个建议

(1). 量一下PC0的信号有了么, 如果没有可能是PC0口配置有问题

(2). 量一下SCK输出了么, 如果没有输出,可能是SPI没启动,比如说SPI的时钟给了么

(3). 量一下MISO上有数据么,如果没数据, 可能是165上有问题

(4). 建议你循环里加一个计数超时,并返回读165的正确错误状态, 这样的程序更安全一些
------解决方案--------------------
你的SPCR设置的有问题吧, 设成从机了,看一下datasheet吧,那里面有例子
------解决方案--------------------
按键去抖的简单方法:
1)按键一般都是定时读取,例如每隔20毫秒~50毫秒以上读取一次;
2)如果连续多次读到按键按下(例如2~5次以上),才认为是一次按键按下。
------解决方案--------------------
同意楼上意见,一般按键的抖动20~200ms,普通的按键一般最多延时50ms就够了,某些机械按键延时可能就得多一点了。普通按键一次按下的过程最短可能也要超过300ms。按键释放时同样也有抖动问题。
如果想做的简单点,可以延时50ms(普通按键)采集一次,如果连续两次检测到同一按键按下,就认为有按键,这样操作绝大多数不会采集错,不过如果对按键按下的正确率要求100%,可能就得将采集时间设短点,多采集几次了。