找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 764|回复: 2
收起左侧

请教STC8H1K08-spi不工作

[复制链接]
ID:891876 发表于 2025-1-2 16:11 | 显示全部楼层 |阅读模式

请帮我看看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

回复

使用道具 举报

ID:161164 发表于 2025-1-2 17:50 | 显示全部楼层
本帖最后由 lkc8210 于 2025-1-2 17:54 编辑

这代码编译都不成功吧? 2025-01-02_174930.png
2025-01-02_175242.png
2025-01-02_175306.png


回复

使用道具 举报

ID:891876 发表于 2025-1-3 02:28 | 显示全部楼层
lkc8210 发表于 2025-1-2 17:50
这代码编译都不成功吧?

编译可以通过,标注的地方也注释掉了,在stc32下能正常显示,这是为什么呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表