OpenEdv-开源电子网

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

学习ARM笔记 OLED 第二季

[复制链接]

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
发表于 2012-6-17 02:00:09 | 显示全部楼层 |阅读模式
 本季内容没啥,一个字.玩!!

我们今天将要画的内容直接丢进数组里,全画完后再丢进OLED.

昨天我们搞的这些代码今天用上.就是如下这些,我得重复一次.

u8 OLED_GRAM[128][8];

从内存将数据对应地刷到OLED内存里去.

void OLED_Refresh_Gram(void)
{
u8 i,n;     
for(i=0;i<8;i++)  
{  
OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
for(n=0;n<128;n++)OLED_WR_Byte(OLED_GRAM[n],OLED_DATA); 
}   
}


然后是清屏函数

void OLED_Clear(void)  
{  
u8 i,n;  
for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n]=0X00;  
OLED_Refresh_Gram();//更新显示
}

好,我们先来写一个画任意点的代码,如下:

//画点函数
void dot(u8 x,u8 y)
{
u8 Y_page,Y_data,temp;
Y_page = y/8;             //将Y座标值变在页的的数值

temp = y%8;              //所在点的位置

Y_data = 1<<temp;  //得到这个点在这页里的Y坐标

OLED_GRAM[x][Y_page] |= Y_data;  //丢进数组

}

再来一个画横线函数

//画横线函数
void X_line(u8 x0,u8 x1,u8 y)   // x0为从左到右的起始点x1为结束点 注意x1一定要比x0大 否则会出错 可以在代码里做成不论大小,但复杂会影响大家的学习热情
{
u8 i;

for (i=x0;i<x1;i++)
{
  dot(i,y);
}
}


再来一个画竖线函数

//画竖线函数
void Y_line(u8 x,u8 y0,u8 y1)   // 原理同画横线
{
u8 i;

for (i=y0;i<y1;i++)
{
  dot(x,i);
}
}


好,我们来画个一闪一闪的方框,主程式如下:

int main(void)
{
//  u8 i,j;
  
  Stm32_Clock_Init(9);
  delay_init(72);
  uart_init(72,9600);
  IO_Init();
  
  while (1) 
    {   
OLED_WR_Byte (0x81,OLED_CMD);
OLED_WR_Byte (0xff,OLED_CMD);

X_line(10,118,40);

X_line(10,118,0);

Y_line(10,0,40);

Y_line(118,0,40);

OLED_Refresh_Gram();

delay_ms(1000);
OLED_Clear();
delay_ms(1000);

    }
}


哈哈,爽吧.如闪得不够爽,就将1000改成100.



如下就是一整个代码:

#include "sys.h"
#include "usart.h"
#include "delay.h"

#define OLED_CS PCout(9)
//#define OLED_RST  Bout(14)//在MINISTM32上直接接到了STM32的复位脚!
#define OLED_RS PCout(8)
#define OLED_WR PCout(7)   
#define OLED_RD PCout(6)

#define OLED_CMD  0 //写命令
#define OLED_DATA 1 //写数据

//PB0~7,作为数据线
#define DATAOUT(x) GPIOB->ODR=(GPIOB->ODR&0xff00)|(x&0x00FF); //输出

u8 OLED_GRAM[128][8];


void OLED_WR_Byte(u8 dat,u8 cmd)
{
DATAOUT(dat);     
  OLED_RS=cmd;
OLED_CS=0;    
OLED_WR=0;  
OLED_WR=1;
OLED_CS=1;   
OLED_RS=1;  

void OLED_Refresh_Gram(void)
{
u8 i,n;     
for(i=0;i<8;i++)  
{  
OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
for(n=0;n<128;n++)OLED_WR_Byte(OLED_GRAM[n],OLED_DATA); 
}   
}

void OLED_Clear(void)  
{  
u8 i,n;  
for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n]=0X00;  
OLED_Refresh_Gram();//更新显示
}


void IO_Init(void)

{

RCC->APB2ENR|=1<<3;    //使能PORTB时钟 
RCC->APB2ENR|=1<<4;    //使能PORTC时钟 

  JTAG_Set(SWD_ENABLE);
GPIOB->CRL=0X33333333;
GPIOB->ODR|=0XFFFF;       
 
  GPIOC->CRH&=0XFFFFFF00;
GPIOC->CRL&=0X00FFFFFF;
  GPIOC->CRH|=0X00000033;
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=0X03C0;

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();

}

//画点函数
void dot(u8 x,u8 y)
{
u8 Y_page,Y_data,temp;
Y_page = y/8;  //将Y座标值变在页的的数值

temp = y%8;    //所在点的位置

Y_data = 1<<temp; //得到这个点在这页里的Y坐标

    //OLED_GRAM[128][8];
OLED_GRAM[x][Y_page] |= Y_data;

}
//画横线函数
void X_line(u8 x0,u8 x1,u8 y)   // x0为从左到右的起始点x1为结束点 注意x1一定要比x0大 否则会出错 可以在代码里做成不论大小,但复杂会影响大家的学习热情
{
u8 i;

for (i=x0;i<x1;i++)
{
  dot(i,y);
}
}

//画竖线函数
void Y_line(u8 x,u8 y0,u8 y1)   // 原理同画横线
{
u8 i;

for (i=y0;i<y1;i++)
{
  dot(x,i);
}
}


int main(void)
{
//  u8 i,j;
  
  Stm32_Clock_Init(9);
  delay_init(72);
  uart_init(72,9600);
  IO_Init();
  
  while (1) 
    {   
OLED_WR_Byte (0x81,OLED_CMD);
OLED_WR_Byte (0xff,OLED_CMD);

X_line(10,118,40);

X_line(10,118,0);

Y_line(10,0,40);

Y_line(118,0,40);

OLED_Refresh_Gram();

delay_ms(1000);
OLED_Clear();
delay_ms(1000);

    }
}

我的工作就是天天在玩
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-5-7
在线时间
8 小时
发表于 2012-6-17 09:09:45 | 显示全部楼层
希望楼主继续更新好的帖子,菜鸟持续关注
耐心做事,好好做人。O(∩_∩)O!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-6-17 09:33:11 | 显示全部楼层
OLED楼主可以搞一个灰度显示的出来.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
发表于 2012-6-17 11:09:06 | 显示全部楼层
顶,希望楼主能把屏的各种参数设置那部分代码详细讲解。
STM32
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-18 02:24:33 | 显示全部楼层
厂家给的,直接 ctrl+c ctrl+v 粘上去吧.里边的东东没什么用的.不要花心思去搞它.
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
发表于 2012-6-18 08:45:11 | 显示全部楼层
哦,我最近写一个12232的屏的驱动程序,参照原子的OLED,看了半天还是不懂,那个12232的手册也讲得模糊,还是先看看你写的笔记,再感悟感悟,呵呵~
STM32
回复 支持 反对

使用道具 举报

4

主题

7

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2012-10-24
在线时间
0 小时
发表于 2013-2-20 14:07:00 | 显示全部楼层
Y_data = 1<<temp; 请问下这句什么意思不甚了解。。>
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2012-12-29
在线时间
4 小时
发表于 2013-2-25 18:51:48 | 显示全部楼层
旗舰版参考程序里
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
 u8 pos ,bx,temp=0;
 if(x>127||y>63)return;
 pos=7-y/8;    //为什么是7-呢?
 bx=7-y%8;
 temp=1<<bx;
 if(t)OLED_GRAM[x][pos]|=temp;
 else OLED_GRAM[x][pos]&=~temp;
}
如果不加7-图像会倒过来,而楼主的不加没事?为什么呢?>
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-6-2
在线时间
0 小时
发表于 2014-6-2 11:14:01 | 显示全部楼层
回复【8楼】Nirvana_Slience:
---------------------------------
我也是对这里不理解,似乎在OLED_GRAM函数里,原点坐标在左下角。而在OLED_DrawPoint和OLED_ShowChar里原点坐标又在左上角了。
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2014-6-4 03:41:43 | 显示全部楼层
先別看例程,先搞懂器件工作原理,明白后,最好按自己的理解自己写一套代码,有疑问时才看例程。这样学会很快。这是我的经验。
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

18

主题

139

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2014-10-29
在线时间
228 小时
发表于 2014-12-10 09:20:32 | 显示全部楼层
你写的真好,将你的帖子加入收藏了
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-8-4 17:31:03 | 显示全部楼层
 回复【9楼】 stepbystep :
---------------------------------
回复【8楼】 Nirvana_Slience :
---------------------------------

SSD1306-Revision 1.1 (Charge Pump).pdf

1.79 MB, 下载次数: 776

我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-8-4 17:31:22 | 显示全部楼层
回复【9楼】stepbystep:
---------------------------------
回复【8楼】Nirvana_Slience:
---------------------------------
看楼上
我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

15

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2014-9-29
在线时间
10 小时
发表于 2015-10-9 14:56:12 | 显示全部楼层
回复【8楼】Nirvana_Slience:
---------------------------------
楼主这个问题想清楚了没?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 22:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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