打印
[AVR单片机]

MEGA32下的HC595驱动,已测试

[复制链接]
1474|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
icecoffelin|  楼主 | 2009-4-27 23:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MEGA32下的HC595驱动,已测试

#ifndef _HC595_H
#define _HC595_H

//SPI initialize
// clock rate: 250000hz
void spi_init(void)
{
DDRB |= (1<<PB5) | (1<<PB7) | (1<<PB4);   /* 设置MOSI 和SCK 为输出,其他为输入 */
SPCR = (1<<SPE) | (1<<MSTR)
   | (1<<SPR1) | (1<<SPR0);   /* 使能SPI主机模式,设置时钟速率为fck/128 */
}

#pragma interrupt_handler spi_stc_isr:13
void spi_stc_isr(void)
{
//byte in SPDR has been sent/received

}


/*SPI数据发送*/
void SPI_MasterTransmit(unsigned char i) 
{

SPDR = i;        /* 启动数据传输 */
while (!(SPSR & (1<<SPIF))); /* 等待传输结束 */
}
/*595数据输出*/
void SPI_595_Out(unsigned int i)
{
    uint j;
PORTB &= ~(1 << 4);      /*准备锁存*/
SPI_MasterTransmit(i>>8);
SPI_MasterTransmit(i);
PORTB |= (1 << 4);      /*锁存数据*/  
}
/*
void write595(unsigned char DATA) //写数据到74HC595函数
{
uchar i;
SPDR=DATA; //开始发送数据
//while((SPSR>>7)==0); //等待发送接收结束
while(!(SPSR & (1<<SPIF))) ;
i=SPDR; //读,是为了清零中断标志

*/


void TurnOnDigitalOutput(uchar n)
{
    if ( n>16 ) return;
DigitalOutputStatus[n] = 1;
DATA_74HC595 |= (0x0001<<n);
SPI_595_Out(DATA_74HC595);
}

void TurnOffDigitalOutput(uchar n)
{
    if ( n>16 ) return;
DigitalOutputStatus[n] = 0;
DATA_74HC595 &= ~(0x0001<<n);
SPI_595_Out(DATA_74HC595);
}
#endif

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

19

帖子

0

粉丝