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

12864显示器的SPI串行驱动问题,可以使用模拟或AVR处理器自身的SPI接口,以下为已经成功运行的代码,现贴出共同学习。

一.以下是使用模拟SPI时序的程序,这点好处是在没有SPI接口的处理器中模拟使用,缺点是速度较慢

#ifndef AVR12864_H_
#define AVR12864_H_
#include <avr/io.h>
#include <avr/delay.h>

#define uchar unsigned char
#define uint unsigned int
//clk---en sid---rw cs---rs
#define clk0 PORTA &= ~(1<<0)
#define clk1 PORTA |= (1<<0)
#define cs0 PORTA &= ~(1<<2)
#define cs1 PORTA |= (1<<2)
#define sid0 PORTA &= ~(1<<1)
#define sid1 PORTA |= (1<<1)

void write_byte(uchar dat)
{
uchar i;
for (i=0;i<8;i++)
{
if(dat&0x80)
sid1;
else
sid0;
clk1;
dat<<=1;
clk0;
}
}
void write_com(uchar dat)
{
cs1;
write_byte(0xf8);
write_byte(dat & 0xf0);
write_byte(dat << 4);
cs0;
}
void write_dat(uchar dat)
{
cs1;
write_byte(0xfa);
write_byte(dat & 0xf0);
write_byte(dat << 4);
cs0;
}
void init_12864()
{
DDRA = 0x07;
_delay_ms(50*8);
write_com(0x30);
_delay_ms(30);
write_com(0x30);
_delay_ms(30);
write_com(0x0c);
_delay_ms(30);
write_com(0x01);
_delay_ms(1);
write_com(0x06);
_delay_ms(1);
write_com(0x34);
_delay_ms(2);
}
void display_string(uchar *p,uchar add,uchar n)
{
char i=0;
write_com(add);
for(i=0;i<n;i++,p++)
{
write_dat(*p);
_delay_ms(10);
}
}

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