OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6536|回复: 3

原子哥帮忙,OLED点不亮

[复制链接]

11

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-11-7
在线时间
5 小时
发表于 2013-11-8 08:51:36 | 显示全部楼层 |阅读模式

按照我自己画的电路板 D0~D7对应PC0~PC7,数据/命令选择管脚(D/C)为PC8,WR管脚PC9,RE管脚PC10,CS管脚PC12,复位管脚PC11.另外BS1和BS2已经强制拉低。
数据输出函数 #define DATAOUT(x) GPIOC->ODR=(GPIOC->ODR&0xff00)|(x&0x00FF);
管脚初始化函数中已经配置相关端口的时钟,已经速率50MHz和腿弯输出方式等,在主函数中掉用OLED的初始化函数:
void OLED_Init(void)
{
 delay(40);
 OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
 OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
 OLED_WR_Byte(80,OLED_CMD);   //[3:0],分频因子;[7:4],震荡频率
 OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
 OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64)
 OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
 OLED_WR_Byte(0X00,OLED_CMD); //默认为0


 OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
  
 OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
 OLED_WR_Byte(0x14,OLED_CMD); //bit2, 开启/关闭
 OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
 OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00, 列地址模式;01, 行地址模式;10,页地址模式;默认10;
 OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
 OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
 OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
 OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
 
 OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
 OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
 OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
 OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
 OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
 OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;


 OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
 OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示        
 OLED_WR_Byte(0xAF,OLED_CMD); //开启显示 
 OLED_Clear();
}
按照我的理解通过这样初始化后 OLED灯应该会点亮的,但是现在OLED等没有任何反应。 用示波器测试通过OLED_WR_Byte 函数设置的管脚值 确实能在D0~D7上测到,搞了两天了还是点不亮OLED,求助原子哥
OLED_WR_Byte函数如下实现
void OLED_WR_Byte(u8 dat,u8 cmd)
{  
 DATAOUT(dat);
 if(cmd)
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
 else
  GPIO_ResetBits(GPIOC, GPIO_Pin_8); 
 GPIO_ResetBits(GPIOC, GPIO_Pin_12);   
 GPIO_ResetBits(GPIOC, GPIO_Pin_9);  
 GPIO_SetBits(GPIOC, GPIO_Pin_9);
 GPIO_SetBits(GPIOC, GPIO_Pin_12);   
 GPIO_SetBits(GPIOC, GPIO_Pin_8); 
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-11-7
在线时间
5 小时
 楼主| 发表于 2013-11-8 08:53:17 | 显示全部楼层
上面有一点说错了 BS1 和BS2是强制拉高的 是并行输入模式
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-11-8 10:19:39 | 显示全部楼层
回复【2楼】gaocan78329668:
---------------------------------

void OLED_WR_Byte(u8 dat,u8 cmd)
{   
 DATAOUT(dat);
 if(cmd) 
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
 else
  GPIO_ResetBits(GPIOC, GPIO_Pin_8);  
 GPIO_ResetBits(GPIOC, GPIO_Pin_12);    
 GPIO_ResetBits(GPIOC, GPIO_Pin_9);  
 GPIO_SetBits(GPIOC, GPIO_Pin_9);
 GPIO_SetBits(GPIOC, GPIO_Pin_12);    
 GPIO_SetBits(GPIOC, GPIO_Pin_8);  
}
 你这样写很容易出错的,用宏代替好些
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

11

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2013-11-7
在线时间
5 小时
 楼主| 发表于 2013-11-8 15:03:00 | 显示全部楼层
 嗯,已经定义成了宏, 问题已经解决了,少了一个刷屏的语句,加上就可以正常显示了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 10:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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