| 这是我以前用的,传给你参考一下 
 //------------------------------------------------------
 // spi_led_send
 //------------------------------------------------------
 //
 // 向74HC595发送一个字节
 // 注: 74HC595速度很快,MCU应用一般不需要做任何延时,移位时
 // 钟与输出锁存时钟均为上升沿触发(高,低电平或下降沿均无效)
 //
 void spi_led_send(U8 byte)
 {
 U8 i;
 
 //-------------------------------------
 // 负逻辑
 #if _74HC595_NEGATIVE_LOGIC_OUT_EN
 byte = ~byte;
 #endif
 
 
 #if _74HC595_CLK_IDLE == 0
 SPI_CLK  = 0;       // 准备上升沿
 SPI_LATCH = 0;      // 准备上升沿
 
 for(i=8; i; i--){
 byte <<= 1;
 SPI_MOSI = CY;
 SPI_CLK  = 1;   // 上升沿发送数据(置于此处更合理)
 SPI_CLK  = 0;   // 准备上升沿
 }
 
 //-------------------------------------
 // 使能输出
 SPI_LATCH = 1;      // 上升沿将数据送到输出锁存器
 SPI_MOSI  = 1;      // 复位SPI_MOSI(省电)
 SPI_LATCH = 0;      // 准备上升沿
 
 #else   // _74HC595_CLK_IDLE == 1(推荐使用这种方案)
 
 for(i=8; i; i--){
 SPI_CLK  = 0;   // 准备上升沿
 byte <<= 1;
 SPI_MOSI = CY;  // 准备数据
 SPI_CLK  = 1;   // 上升沿发送数据(置于此处更合理)
 }
 
 //-------------------------------------
 // 使能输出
 SPI_LATCH = 0;      // 准备上升沿
 SPI_MOSI  = 1;      // 复位SPI_MOSI(省电)
 SPI_LATCH = 1;      // 上升沿将数据送到输出锁存器
 #endif
 }
 |