二.一下为使用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);
}