請幫我看看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);
}
}
56.jpg (135.74 KB, 下載次數: 0)
下載附件
2025-1-2 16:11 上傳
|