新手求助 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有输出,请教一下问题出在哪里?
屠龙刀-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
这里有一份示例程序,是OLED显示程序,在STC8H1K28上面测试通过的,已经于2022-04-03上午在STC8H1K28上面测试通过。 从学习来说,还是跟着 STC32G12K128/STC8H8K64U的实验箱和核心板学习比较好
STC15系列很畅销N年了,但是现在 STC的生态建设是围绕着 STC32G12K128/STC8H8K64U展开的
另外 SPI/I2C的外设,控制信号线,全部加 10K上拉电阻
另外STC15F2K60S2 有 STC8G2K64S4的特殊版本 STC15H2K64S4-36I-LQFP44/32 现货来代替,这样程序和 STC8H兼容
资料在STC8G系列的资料中
神农鼎 发表于 2023-3-30 20:55
从学习来说,还是跟着 STC32G12K128/STC8H8K64U的实验箱和核心板学习比较好
STC15系列很畅销N年了,但是现 ...
谢谢您提供建议,但这并不适用我解决此问题,SPI硬件IO是不需要加上拉电阻的 wenhuixuan 发表于 2023-3-30 17:04
这里有一份示例程序,是OLED显示程序,在STC8H1K28上面测试通过的,已经于2022-04-03上午在STC8H1K28上面测 ...
非常感谢您,不过我看代码是io模拟的,我是想看看硬件SPI相关的问题{:4_197:}
SPI少了等待发送完毕的代码
你的代码可能填入SPDAT寄存器后立即就把SS引脚拉高了,因此发送数据时从机并不认为被选中了,可以用双通道的示波器看看波形
另外如果SPI只连接这一个设备的话,SS可以考虑直接接地 我是建议 SS也用 MCU 来控制,防止外设 SPI-外设异常,可以通过控制SS让外围的SPI外设的状态机复位等 qiulizhen 发表于 2023-3-31 13:42
非常感谢您,不过我看代码是io模拟的,我是想看看硬件SPI相关的问题 ...
我的代码也是在STC官方示例的基础上修改而成的,且我已经通过了测试验证!好像官方也有一个SPI的示例,你找找看!
页:
[1]
2