关于12864显示器的SPI串行驱动问题的研究,AVR处理器(2)

二.一下为使用AVR处理器自身SPI接口的程序使用,已验证通过。

#ifndef SPI12864_H
#define SPI12864_H


//包含所需头文件
#include <avr/io.h>
#include <avr/interrupt.h>
#include<util/delay.h>
#include"Date.h"

/*------引脚定义------*/

#define CS_H PORTB|=(1<<PB0)
#define CS_L PORTB&=~(1<<PB0)
#define SCLK 7
#define SID 5

 

/*------函数定义------*/
//SPI函数
void spi_write(uchar sData);
uchar spi_read(void);

 


//端口初始化
void SPI12864port_init(void)
{
PORTB = 0xB0;
DDRB |= BIT(PB0)|BIT(SID)|BIT(SCLK)|BIT(PB4);//防止主从机转换
}


void spi_init(void)
{
//spi初始化
SPCR |= BIT(SPE)|BIT(MSTR)|BIT(SPR1)|BIT(CPOL)|BIT(CPHA);
SPSR |= BIT(SPI2X);
}


//功能:使用SPI发送一个字节
void spi_write(uchar sData)
{
SPDR = sData;
while(!(SPSR & BIT(SPIF)));
//sData=SPDR;//读从机发回来的数据
}


//功能:使用SPI接收一个字节
uchar spi_read(void)
{
SPDR = 0x00;
while(!(SPSR & BIT(SPIF)));
return SPDR;
}


void write_date(uchar date)
{
uchar date_h,date_l;
date_h=0xf0&date;//取高四位
date_l=0x0f&date;//取低四位
date_l<<=4;
CS_H;
spi_write(0xfa); //写数据
spi_write(date_h);
spi_write(date_l);
CS_L;
}

void write_com(uchar com)
{
uchar com_h,com_l;
com_h=0xf0&com;//取高四位
com_l=0x0f&com;//取低四位
com_l<<=4;
CS_H;
_delay_us(1);
spi_write(0xf8); //写指令
spi_write(com_h);
spi_write(com_l);
CS_L;
}

void DS12864_init()//初始化12864
{
CS_L;
write_com(0x30);
_delay_ms(15);
write_com(0x30);
_delay_ms(15);
write_com(0x0f);
_delay_us(5);
write_com(0x01);
_delay_us(5);
write_com(0x02);
_delay_us(5);
}

posted @ 2013-03-01 14:46  丁洋  阅读(752)  评论(0编辑  收藏  举报