[技术问答]

请教4针SPIOLED的驱动代码问题

[复制链接]
398|14
手机看帖
扫描二维码
随时随地手机跟帖
laocuo1142|  楼主 | 2023-2-15 13:00 | 显示全部楼层 |阅读模式
我按照手册写好初始化,SPI写数据和一系列命令函数和写数据函数,但最后OLED的显示只有全亮和全灭能够显示,若是要显示符号就会不全,或是说让16*8的区域显示全亮也会缺。换了标准源码就能正常显示,一开始我以为是字库问题,换来换去都不行,,

这是主函数,我随便写点的
void main()
{
oled_init();
oled_clear();
// oled_put_char_8x16(1,0,'B');
// oled_put_char_8x16(2,0,'B');
while(1)
{
Delay(500);
oled_clear();
Delay(500);
oled_full();
Delay(500);
oled_clear();
Delay(500);
oled_put_char_8x16(1,0,'A');
Delay(500);
oled_put_char_8x16(2,0,'B');
Delay(500);
oled_put_char_8x16(3,0,'C');
Delay(500);
oled_put_char_8x16(4,0,'D');
}
}

这是OLED的命令部分
#include "OLED.h"
#include "character.h"
extern const unsigned char code CHARACTERS_8X16[][16];
void oled_reset()
{
OLED_RESET=0;
Delay(50);
OLED_RESET=1;
}
void oled_send_command(unsigned char Command)
{
u8 i=0;
SPI_CS=0;
OLED_DC=0;
spi_read_write(Command);
SPI_CS=1;
OLED_DC=1;
}
void oled_send_Data(unsigned char Data)
{
SPI_CS=0;
OLED_DC=1;
spi_read_write(Data);
SPI_CS=1;
oled_DC=1;
}
void oled_set_position(unsigned char x, unsigned char y)
{
oled_send_command(0xb0 + y); //起始页地址
oled_send_command((x & 0x0f) | 0x00); //起始列地址的低四位
oled_send_command(((x & 0xf0) >> 4) | 0x10);//起始列地址的高四位
}
void oled_init(void)
{
oled_send_command(0xAF);//关闭显示
oled_send_command(0x00);//起始列设置地址低四位(00h~0Fh)oled_send_command(0x10);//起始列设置地址高四位(10h~1Fh)oled_send_command(0x40);//起始行设置,设置RAM的起始行(40h~74h)oled_send_command(0x20); // 设置内存寻址模式
oled_send_command(0x00); // 页面寻址模式:水平地址模式
// oled_send_command(0x01); // 垂直地址模式
// oled_send_command(0x10); // 页地址模式
oled_send_command(0xA8);//设置多路复用器**oled_send_command(0x3F);//\ 1 / 64 dutyoled_send_command(0xD3);//设置显示偏移 -- set display offset (0x00~0x3F)oled_send_command(0x00);//不偏移**/*上下左右镜像设置*/oled_send_command(0xA1);// 设置段重映射 -- Set SEG / Column Mapping     0xA0左右反置(复位值) 0xA1正常(重映射值)oled_send_command(0xC8);// 设置行输出扫描方向 -- Set COM / Row Scan Direction   0xc0上下反置(复位值) 0xC8正常(重映射值)/******END*********/oled_send_command(0xDA);// 设置列引脚硬件配置oled_send_command(0x02);//**oled_send_command(0x81);//设置对比度(0x00~0x100)oled_send_command(0x7F);//对比度oled_send_command(0xA4);//全屏显示开启(黑屏0xA4/亮屏0xA5)oled_send_command(0xA6);//设置显示方式(正常/反显)oled_send_command(0xD5);//设置显示时钟分频因子/振荡器频率oled_send_command(0x80);//**oled_send_command(0xD9); // 设置预充电期
oled_send_command(0xF1); // 将预充电设置为15个时钟并将其放电设置为1个时钟
oled_send_command(0x8D);//使能电荷泵稳压器(8DH)oled_send_command(0x14);//模式14Holed_send_command(0xAF);//打开屏幕oled_set_position(0,0);//起始位置00
}
void oled_clear(void)
{
/水平地址模式/
oled_send_command(0x21);//起始列与终止列地址编写
oled_send_command(0x00);
oled_send_command(0x7F);
oled_send_command(0x22);//起始页与终止页地址编写
oled_send_command(0x00);
oled_send_command(0x07);
for(y=0;y<(OLED_HEIGHT >> 3);y++)
{
for(x=0;x<OLED_WIDTH;x++)
{
oled_send_Data(0x00);
}
}
/*****END*****/
}
void oled_full(void)
{
unsigned char y, x;
/水平地址模式/
oled_send_command(0x21);//起始列与终止列地址编写
oled_send_command(0x00);
oled_send_command(0x7F);
oled_send_command(0x22);//起始页与终止页地址编写oled_send_command(0x00);oled_send_command(0x07);for(y=0;y<(OLED_HEIGHT        >>        3);y++){        for(x=0;x<OLED_WIDTH;x++)        {                oled_send_Data(0xFF);        }}/*****END*****/
}
void oled_put_char_8x16(u8 x, u8 y, char character)//宽度8(8列);高度16(2页)的模块输入
{
u8 i;
// set column
oled_send_command(0x21);//起始列和终止列的地址编写
oled_send_command(x * 0x08);
oled_send_command(0x07 + x * 0x08);
// set page
oled_send_command(0x22);//起始页和终止页的地址编写
oled_send_command(y * 2);
oled_send_command(0x01+ y * 2);
for(i=0; i<16; i++)
}
基本就这样的了,逻辑上没有问题我感觉,难道说是要延时读取数据这种操作吗,之前写IIC的时候好像有这种操作,但这太细节我还不会看

使用特权

评论回复

相关帖子

sdlls| | 2023-3-2 10:09 | 显示全部楼层
这个店家都会提供相关的代码的。              

使用特权

评论回复
hilahope| | 2023-3-2 10:18 | 显示全部楼层
怎么测试oled屏幕分辨率               

使用特权

评论回复
earlmax| | 2023-3-2 11:38 | 显示全部楼层
网上应该有很多的资料可以参考的。

使用特权

评论回复
kkzz| | 2023-3-2 16:02 | 显示全部楼层
oled四脚和七脚有什么区别              

使用特权

评论回复
mattlincoln| | 2023-3-2 16:15 | 显示全部楼层
这个是屏幕的问题吗?              

使用特权

评论回复
loutin| | 2023-3-2 16:31 | 显示全部楼层
现在OLED的驱动线一般线宽是多少?

使用特权

评论回复
lzbf| | 2023-3-3 21:03 | 显示全部楼层
实现4线SPI驱动OLED倒计时显示代码有吗?

使用特权

评论回复
chenci2013| | 2023-3-3 21:34 | 显示全部楼层
如何驱动oled显示屏               

使用特权

评论回复
modesty3jonah| | 2023-3-3 21:48 | 显示全部楼层
现在iic的oled好用,写入很简单。

使用特权

评论回复
jkl21| | 2023-3-3 22:02 | 显示全部楼层
这个是代码的问题吗?              

使用特权

评论回复
bestwell| | 2023-3-4 12:33 | 显示全部楼层
没有代码可以借鉴和使用的吗?              

使用特权

评论回复
dspmana| | 2023-3-5 10:11 | 显示全部楼层
没有代码可以借鉴和使用的吗?              

使用特权

评论回复
4针脚的是IIC通信协议,7针脚的是SPI通信协议

使用特权

评论回复
eltonchang2001| | 2023-3-16 15:04 | 显示全部楼层
此篇开发板评测有使用OLED屏,有附上源代码,你参考一下。

【ESK32-30519 + ESK32-21001测评】按键+数码管+OLED显示
https://bbs.21ic.com/icview-3259918-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

958

主题

3923

帖子

10

粉丝