qiulizhen 发表于 2023-3-30 15:33:57

新手求助 SPI OLED最简单的点亮全屏,验证通讯


#include<STC15F2K60S2.H>
typedef unsigned char u8;

// 下面的应该不需要定义
// sbit OLED_MISO = P1^4;        //单主机模式下,没有数据交互用不到
// sbit OLED_SCLK=P1^5;        //时钟
// sbit OLED_MOSI = P1^3;        //主机模式下,数据发送

sbit OLED_RES=P1^0;                //复位
sbit OLED_SS = P1^2;        //片选
sbit OLED_DC=P1^1;                //数据|命令选择


void spi_init()
{
        SPDAT = 0;
        SPSTAT |= 0XC0;                        //清SPI中断标志位和写保护 写1清除
        SPCTL |= 0XDC;                       //SPEN=1 SPI使能打开 SSIG=1 忽略SPI_SS引脚P1^2       MSTR=1 固定的单主机模式
        P_SW1 |= 0X0C;                        //SPI选择第一组
}

void spi_write_byte(u8 byte, bit flag)       // D/C = 0 写命令       = 1 写数据
{
        if(flag == 0)
        {
                OLED_DC = 0;       
        }
        else
        {
                OLED_DC = 1;
        }
        OLED_SS = 0;
        SPDAT = byte;
        OLED_SS = 1;
        OLED_DC = 1;

}

void Delay100ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 5;
        j = 52;
        k = 195;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void ssd1306init()
{
        OLED_RES = 1;
        Delay100ms();
        Delay100ms();
        OLED_RES = 0;
        Delay100ms();
        Delay100ms();
        OLED_RES = 1;

        spi_write_byte(0xAE,0);
        spi_write_byte(0x00,0);
        spi_write_byte(0x10,0);
        spi_write_byte(0x40,0);
        spi_write_byte(0x81,0);
        spi_write_byte(0xCF,0);
        spi_write_byte(0xA1,0);
        spi_write_byte(0xC8,0);
        spi_write_byte(0xA6,0);
        spi_write_byte(0xA8,0);
        spi_write_byte(0x3F,0);
        spi_write_byte(0xD3,0);
        spi_write_byte(0x00,0);
        spi_write_byte(0xD5,0);
        spi_write_byte(0x80,0);
        spi_write_byte(0xD9,0);
        spi_write_byte(0xF1,0);
        spi_write_byte(0xDA,0);
        spi_write_byte(0x12,0);
        spi_write_byte(0xDB,0);
        spi_write_byte(0x40,0);
        spi_write_byte(0x20,0);
        spi_write_byte(0x02,0);
        spi_write_byte(0x8D,0);
        spi_write_byte(0x14,0);
        spi_write_byte(0xA4,0);
        spi_write_byte(0xA6,0);
        spi_write_byte(0xAF,0);
}

void oled_display_on()
{
       spi_write_byte(0X8D,0);
       spi_write_byte(0X14,0);
       spi_write_byte(0XAf,0);
}

void OLED_Clear(void)
{
        u8 i,n;                  
        for(i=0;i<8;i++)
        {
                spi_write_byte(0xb0+i,0);    //设置页地址(0~7)
                spi_write_byte(0x00,0);      //设置显示位置—列低地址
                spi_write_byte(0x10,0);      //设置显示位置—列高地址   
                for(n=0;n<128;n++)
                {
                        spi_write_byte(0XFF,1);
                }
               
        }
}

void main()
{
        spi_init();
        IE2 |= 0X02;
        EA = 1;
       
        ssd1306init();
        while(1)
        {       
                Delay100ms();

                OLED_Clear();
                Delay100ms();
                oled_display_on();
                Delay100ms();               
        }
}


void spi() interrupt 9
{
        SPSTAT = 0XC0;        //清除标志位
}


////////////////////////////////////////////
屏幕就是没反应,示波器测时钟和MOSI有输出,请教一下问题出在哪里?

AI-32位8051 发表于 2023-3-30 16:41:37

屠龙刀-STC32G12K128 核心功能实验板,
开天斧-STC8H8K64U 核心功能实验板,
一箭双雕之USB转双串口-STC8H8K64U 核心功能实验板中:
都有科学计算器强大的开源程序,强大的OLED128*64显示
都有老刘爱捣鼓开源示波器强大的开源程序,强大的OLED128*64显示
   具体可参考本坛以下帖子链接:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=670&extra=page%3D1
https://www.stcaimcu.com/data/attachment/forum/202301/11/210035cyahy5tfaayta79e.png
https://nwzimg.wezhan.cn/contents/sitefiles2057/10287325/images/37640751.jpg
屠龙刀-STC32G12K128核心功能实验板演示程序
第33个演示程序,就是科学计算器,OLED128*64显示
第29个演示程序,是老刘爱捣鼓开源示波器,也是OLED128*64显示

第30个演示程序,是 GUI/U8g2-OLED12864for STC32G12K128,完全免费开源的 GUI-OLED12864
https://www.stcaimcu.com/data/attachment/forum/202301/11/204935cllrrlhzte3hzznh.png



WHX 发表于 2023-3-30 17:04:55

这里有一份示例程序,是OLED显示程序,在STC8H1K28上面测试通过的,已经于2022-04-03上午在STC8H1K28上面测试通过。

神农鼎 发表于 2023-3-30 20:55:47

从学习来说,还是跟着 STC32G12K128/STC8H8K64U的实验箱和核心板学习比较好
STC15系列很畅销N年了,但是现在 STC的生态建设是围绕着 STC32G12K128/STC8H8K64U展开的

另外 SPI/I2C的外设,控制信号线,全部加 10K上拉电阻

另外STC15F2K60S2 有 STC8G2K64S4的特殊版本 STC15H2K64S4-36I-LQFP44/32 现货来代替,这样程序和 STC8H兼容

资料在STC8G系列的资料中




qiulizhen 发表于 2023-3-31 13:41:34

神农鼎 发表于 2023-3-30 20:55
从学习来说,还是跟着 STC32G12K128/STC8H8K64U的实验箱和核心板学习比较好
STC15系列很畅销N年了,但是现 ...

谢谢您提供建议,但这并不适用我解决此问题,SPI硬件IO是不需要加上拉电阻的

qiulizhen 发表于 2023-3-31 13:42:48

wenhuixuan 发表于 2023-3-30 17:04
这里有一份示例程序,是OLED显示程序,在STC8H1K28上面测试通过的,已经于2022-04-03上午在STC8H1K28上面测 ...

非常感谢您,不过我看代码是io模拟的,我是想看看硬件SPI相关的问题{:4_197:}

kksk 发表于 2023-3-31 14:35:08



SPI少了等待发送完毕的代码
你的代码可能填入SPDAT寄存器后立即就把SS引脚拉高了,因此发送数据时从机并不认为被选中了,可以用双通道的示波器看看波形


kksk 发表于 2023-3-31 14:36:49

另外如果SPI只连接这一个设备的话,SS可以考虑直接接地

神农鼎 发表于 2023-3-31 15:08:20

我是建议 SS也用 MCU 来控制,防止外设 SPI-外设异常,可以通过控制SS让外围的SPI外设的状态机复位等

WHX 发表于 2023-3-31 17:48:19

qiulizhen 发表于 2023-3-31 13:42
非常感谢您,不过我看代码是io模拟的,我是想看看硬件SPI相关的问题 ...

我的代码也是在STC官方示例的基础上修改而成的,且我已经通过了测试验证!好像官方也有一个SPI的示例,你找找看!
页: [1] 2
查看完整版本: 新手求助 SPI OLED最简单的点亮全屏,验证通讯