请帮我看看spi不工作,再而三的检查也没找出问题!
#include <STC8H.H>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
#define red 0xf800 //红色
#define blue 0x001f //蓝色
#define green 0x07e0 //绿色
#define white 0xffff //白色
#define black 0x0000 //黑色
sbit bl = P1^7; //BLK;背光
sbit rs = P1^6; //DC;数据/命令选择,低电平命令,高电平数据
sbit scl = P1^5; //SCL;时钟信号输入端口
sbit reset = P1^4; //RST;复位,低电平使能
sbit sda = P1^3; //SDA;SPI数据输入端口
sbit cs = P1^2; //CS;片选,低电平使能
/******************************************************************************
函数说明: 系统延时函数
******************************************************************************/
void delay_ms(u8 ms)
{
u16 i;
do{
i = MAIN_Fosc / 6000;
while(--i);
}while(--ms);
}
/******************************************************************************
硬件SPI数据传送函数
/******************************************************************************/
void SPI_WriteData(unsigned char data1)
{
cs=0;
SPDAT=data1; //待发送数据存入数据寄存器
while(SPIF == 0) ; //等待写入完成
SPSTAT=0xC0; //SPIF=1,WCOL=1清除标志
cs=1;
}
/******************************************************************************
硬件SPI初始化(SPI速率(speed值取:0/1/2/3,分别对应晶振的:4/16/64/128分频))
*******************************************************************************/
void SPI_init(u8 speed)
{
P_SW1=0x00; //spi口在P1 //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5,
//2: P5.4 P4.0 P4.1 P4.3, 3: P3.5 P3.4 P3.3 P3.2
SPDAT=0; //数据寄存器清0
SPSTAT=0xC0; //清SPI状态SPIF和WCOL写1清0
SPCTL=0xD3; //1101 11xx 主模式,使能,先传数据最高位,前时钟为下降沿,并在下降沿驱动数据,上升沿检测数据
}
/******************************************************************************
函数说明:LCD复位时序函数
******************************************************************************/
void Reset(void)
{
reset=0;
delay_ms(100);
reset=1;
delay_ms(100);
}
/******************************************************************************
函数说明:LCD写入8位指令
******************************************************************************/
void Lcd_WriteIndex(u8 Data)
{
rs=0; //DC引脚;0=写命令
SPI_WriteData(Data);
}
/******************************************************************************
函数说明:LCD写入8位数据
******************************************************************************/
void Lcd_WriteData(u8 Data)
{
rs=1; //DC引脚;1=写数据
SPI_WriteData(Data);
}
/******************************************************************************
函数说明:LCD写入16位数据
******************************************************************************/
void Lcd_WriteData_16(unsigned int Data)
{
//cs=0;
rs=1;
SPI_WriteData(Data>>8);
SPI_WriteData(Data);
//cs=1;
}
/******************************************************************************
函数说明:LCD初始化 ST7735
******************************************************************************/
void lcd_initial(void)
{
Reset();//Reset before LCD Init.
//1.44Inch LCD Panel with ST7735R.
Lcd_WriteIndex(0x11);//Sleep exit
delay_ms(120);
//ST7735R Frame Rate
Lcd_WriteIndex(0xB1);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteIndex(0xB2);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteIndex(0xB3);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteIndex(0xB4); //Column inversion
Lcd_WriteData(0x07);
//ST7735R Power Sequence
Lcd_WriteIndex(0xC0);
Lcd_WriteData(0xA2);
Lcd_WriteData(0x02);
Lcd_WriteData(0x84);
Lcd_WriteIndex(0xC1);
Lcd_WriteData(0xC5);
Lcd_WriteIndex(0xC2);
Lcd_WriteData(0x0A);
Lcd_WriteData(0x00);
Lcd_WriteIndex(0xC3);
Lcd_WriteData(0x8A);
Lcd_WriteData(0x2A);
Lcd_WriteIndex(0xC4);
Lcd_WriteData(0x8A);
Lcd_WriteData(0xEE);
Lcd_WriteIndex(0xC5); //VCOM
Lcd_WriteData(0x0E);
Lcd_WriteIndex(0x36); //MX, MY, RGB mode
Lcd_WriteData(0xc8); //A0横屏
//ST7735R Gamma Sequence
Lcd_WriteIndex(0xe0);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x1a);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x18);
Lcd_WriteData(0x2f);
Lcd_WriteData(0x28);
Lcd_WriteData(0x20);
Lcd_WriteData(0x22);
Lcd_WriteData(0x1f);
Lcd_WriteData(0x1b);
Lcd_WriteData(0x23);
Lcd_WriteData(0x37);
Lcd_WriteData(0x00);
Lcd_WriteData(0x07);
Lcd_WriteData(0x02);
Lcd_WriteData(0x10);
Lcd_WriteIndex(0xe1);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x1b);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x17);
Lcd_WriteData(0x33);
Lcd_WriteData(0x2c);
Lcd_WriteData(0x29);
Lcd_WriteData(0x2e);
Lcd_WriteData(0x30);
Lcd_WriteData(0x30);
Lcd_WriteData(0x39);
Lcd_WriteData(0x3f);
Lcd_WriteData(0x00);
Lcd_WriteData(0x07);
Lcd_WriteData(0x03);
Lcd_WriteData(0x10);
Lcd_WriteIndex(0x2a);
Lcd_WriteData(0x00);
Lcd_WriteData(0x00+2);
Lcd_WriteData(0x00);
Lcd_WriteData(0x80+2);
Lcd_WriteIndex(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(0x00+3);
Lcd_WriteData(0x00);
Lcd_WriteData(0x80+3);
Lcd_WriteIndex(0xF0); //Enable test command
Lcd_WriteData(0x01);
Lcd_WriteIndex(0xF6); //Disable ram power save mode
Lcd_WriteData(0x00);
Lcd_WriteIndex(0x3A); //65k mode
Lcd_WriteData(0x05);
Lcd_WriteIndex(0x29);//Display on
}
/*************************************************
功能:设置lcd显示区域,在此区域写点数据自动换行
入口参数:x1,x2,y1,y2起点和终点
*************************************************/
void Lcd_SetRegion(u16 x1,u16 y1,u16 x2,u16 y2)
{
Lcd_WriteIndex(0x2a);
Lcd_WriteData(0x00);
Lcd_WriteData(x1+2);
Lcd_WriteData(0x00);
Lcd_WriteData(x2+2)
Lcd_WriteIndex(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(y1+3);
Lcd_WriteData(0x00);
Lcd_WriteData(y2+3);
Lcd_WriteIndex(0x2c);
}
/*****************************************************************************
函数说明:在指定区域填充颜色 Color;颜色
******************************************************************************/
void LCD_Clear(u16 Color)
{
u8 i,j;
Lcd_SetRegion(0,0,128-1,128-1); //(x起点、y起点,x终点、y终点)
for (i=0;i<128;i++)
{
for (j=0;j<128;j++)
{
Lcd_WriteData_16(Color);
}
}
}
/******************************************************************************
函数说明:在指定位置画点 x,y 画点坐标 color 点的颜色
******************************************************************************/
void LCD_DrawPoint(u16 x,u16 y,u16 color)
{
Lcd_SetRegion();
Lcd_WriteData_16(color);
}
/*****************************************************************************
主函数
******************************************************************************/
main()
{
P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能
P1M0=0x00; P1M1=0x00; //IO口设置推挽输出
SPI_init(0); //SPI初始化
lcd_initial();
bl=1;
while(1)
{
LCD_Clear(red); //屏背景颜色
//LCD_DrawPoint(60,60,white);
}
}
|