#ifndef __SPITFT_h__
#define __SPITFT_h__
/*****************************************************
*
* DEFINE AREA
*
*****************************************************/
#define SET_SS() PORTB |= (1<<_BV(PB0))
#define CLR_SS() PORTB &= ~(1<<_BV(PB0))
#define SET_SCK() PORTB |= (1<<_BV(PB1))
#define CLR_SCK() PORTB &= ~(1<<_BV(PB1))
#define SET_SDA() PORTB |= (1<<_BV(PB2))
#define CLR_SDA() PORTB &= ~(1<<_BV(PB2))
#define SET_RS() PORTB |= (1<<_BV(PB3)) //数据/命令选择
#define CLR_RS() PORTB &= ~(1<<_BV(PB3))
#define SET_RST() PORTB |= (1<<_BV(PB4)) //复位脚
#define CLR_RST() PORTB &= (1<<_BV(PB4))
/*****************************************************
*
* FUNCTION STATAMENT
*
*****************************************************/
void TFT_INI(void);
void intspiinit(void);
void Senddata(unsigned char data);
void LCD_data(uint16_t colornum);
void Sendcommand(unsigned char cmd);
void Setsingle(unsigned int x_start,unsigned int y_start,uint16_t color);
#endif
File TFTISP.c
#include "SPITFT.h"
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#define uint unsigned int
void intspiinit(void)
{
/* 设置MOSI和SCK为输出,其他为输入 */
DDRB = (_BV(PB0))|(_BV(PB1))|(_BV(PB2));
/* 使能SPI主机模式,设置时钟速率为fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);//高位在前
/* 设置ss为高电平*/
SET_SS();
}
void Senddata(unsigned char data)
{
unsigned char i;
CLR_SS();
SET_RS();
CLR_SCK();
for(i=8; i>0; i--)
{
if((data&0x80)==0x80)
{
SET_SDA();
}
else
{
CLR_SDA();
}
data = data<<1;
SET_SCK();
}
SET_SS(); //写完一个直接数据把SS置位
}
void Sendcommand(unsigned char cmd)
{
unsigned char i;
CLR_SS();
CLR_RS(); //写命令时置0
CLR_SCK();
for(i=8; i>0; i--)
{
if((cmd&0x80)==0x80)
{
SET_SDA();
}
else
{
CLR_SDA();
}
cmd = cmd<<1;
SET_SCK();
}
SET_SS(); //写完一个直接数据把SS置位
}
void LCD_data(uint16_t colornum)
{
unsigned char i;
CLR_SS();
SET_RS();
CLR_SCK();
for(i=16; i>0; i--)
{
if((colornum&0x8000)==0x8000)
{
SET_SDA();
}
else
{
CLR_SDA();
}
colornum = colornum<<1;
SET_SCK();
}
SET_SS(); //写完一个直接数据把SS置位
}
void TFT_INI(void)
{
/**************复位***************/
CLR_RST(); //低电平有效
_delay_ms(300);
SET_RST(); //通信时处于高电平
_delay_ms(300);
/**************Sleep out***************/
Sendcommand(0x11); //退出睡眠
_delay_ms(300); //切换指令延时不低于120ms
/**************GAMMA SET***************/
Sendcommand(0x26); //设置伽马曲线
_delay_ms(300);
Senddata(0x08); //设置GC3
/**************DISPLAY ON***************/
Sendcommand(0x29); //开显示
_delay_ms(300);
}
void Setsingle(unsigned int x_start,unsigned int y_start,uint16_t color)
{
Sendcommand(0x2A); //0<XS[15:0]<XE[15:0]<127(007Fh)) MV=0
_delay_ms(300);
Senddata(0x00);
Senddata(x_start);//列地址
Sendcommand(0x2B); //0<YS[15:0]<YE[15:0]<159(009Fh)) MV=0
_delay_ms(300);
Senddata(0x00);
Senddata(y_start);//行地址
Sendcommand(0X2C);
LCD_data(color); //SINGLE RED
}
这段程序有什么问题,请指教。
qq:1526429990
用户1632368 2011-7-8 16:01