一、原理图" @3 [7 j& C5 J) ^" k0 B. l- e
* t& c2 V9 v) r' t4 R* S2 t7 x
. a0 _8 F4 h' n/ q2 c8 v6 A5 \
/ S' n9 g/ o/ @芯片引脚连接
5 F9 X$ _: d/ ]1 b) }
2 q2 |9 h4 v; [+ ~# Y4 w6 x' H0 ]) y- U( [" G( Q- k
二、驱动程序0 `9 B9 b9 ?% C4 `: E
spi.c
. S& m) f' L0 s1 I* Y/ Q8 i
' Y" v+ f" o8 p: ]" q$ r& l- #include "spi.h"
: D: b {9 ^: t$ u; ~
" H* y, V( w }5 _. V7 \; f- void SPI1_Init(void)
: [) t1 b+ Z) D- Q - {
, p% a3 T6 v- v: Z. k' n1 ` h - GPIO_InitTypeDef GPIO_InitStructure;& L5 S& w. a* e+ B; @) @
- SPI_InitTypeDef SPI_InitStructure;
. c& h. V7 Y* W; P0 l& i5 C - # D* H; W' R7 w
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTA时钟使能
: N( |. N8 O! J S) d( [ - RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );//SPI1时钟使能
- P! R8 T2 ^ l1 H - L. e. h' O6 W, y9 @( s
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;# H9 W9 P* ^! }
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; & d8 w4 L1 |- V& ?) ], {# o
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
9 e, h: e5 Z Z! P1 w$ h% h - GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
: m' ^4 O9 |; O1 S6 s$ b$ X( F+ W
2 G5 z$ T5 C1 p9 }( h& \1 e- GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7); //PB13/14/15上拉
' x) f9 c- e4 p: P1 [ - I2 P; V9 i0 [. e! C
- SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工# _$ @' U0 D7 h" q) E( `# ~2 V9 v
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI+ c, z+ c: P- ^' H% j+ ]: I$ Q
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构5 O2 n' ?% V! w% k" q
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
L. U+ U. L5 H5 z- Q - SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
# P: }0 j' ~& B - SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
. s7 N# T* T; [6 ]+ ?1 ] - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
, ~( a( ^! e* e - SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始" v$ `2 x. F4 m6 n
- SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
( M& J3 U+ s3 ?4 Z0 L8 O - SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器( W8 q/ a0 z" f: b
9 Z1 n& T" D# \6 s) z- SPI_Cmd(SPI1, ENABLE); //使能SPI外设! ~3 [) E: g7 `
- 2 p3 m5 C+ C% H! k. ]
- SPI1_ReadWriteByte(0xff);//启动传输 . j& s( k! k* F% d. U
- + n( J* S% H7 S
: K7 @' a0 r( E- } * a9 i/ H: n) e" w u0 p8 |
- //SPI 速度设置函数
; A9 o: Z" ^; h! @2 r$ t# g - //SpeedSet:
( n! J2 b7 U4 S5 h - //SPI_BaudRatePrescaler_2 2分频 ; \4 t/ p' ~" y
- //SPI_BaudRatePrescaler_8 8分频
6 f1 M$ |9 \* f$ m X4 L' y* ]& d( B - //SPI_BaudRatePrescaler_16 16分频 ; n* p- A: |2 Z& \4 V
- //SPI_BaudRatePrescaler_256 256分频
$ k5 W% W) Q7 S( c( ?
* y. z& o' j) W7 _- void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler); P& A9 k3 z- ^7 |
- {' s; ~+ B' B/ R( p M2 T
- assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
) J6 [' ]" l# y - SPI1->CR1&=0XFFC7;1 v) Z) d$ j, V' v4 o, S
- SPI1->CR1|=SPI_BaudRatePrescaler; //设置SPI1速度 ( d/ b, k& q7 D3 T; B
- SPI_Cmd(SPI1,ENABLE); ( @( B! b/ K5 _& \
- - }1 |! R# @: N' ]3 r9 K. _$ y
- } 0 u& A: ]* z- h
- & V9 ~& B$ E" v
- //SPIx 读写一个字节/ ]' X2 b5 Y' ~3 R2 A
- //TxData:要写入的字节
, L! r. [7 ?3 `4 T - //返回值:读取到的字节, W, Q6 z5 ~) l9 O
- u8 SPI1_ReadWriteByte(u8 TxData)
( E# p! T3 ?* I/ P8 E3 w - {
s5 p7 u; {3 W8 z7 V" x) l - u8 retry=0;
- p& t4 |! L- t9 d' ^, P" h) U - while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
' c, O7 G/ j: y, b: g - {
# y: E c4 r# V( P+ d - retry++;! a% y+ J& W- p; Y8 {
- if(retry>200)return 0;
% }& P. E6 o" J0 U* g: e - }
5 c Q; s+ G/ i- M! r/ i - SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据2 V. Q7 u I: x; z0 M& J' h5 g
- retry=0;
% o& {4 S$ a) U
# m8 o; Q- H9 l" Z- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位; F# _9 e- E: S$ u h) _
- {
D x: M; K+ n, i; a - retry++;- s0 Q/ T" o9 X [2 @/ y8 ^7 x
- if(retry>200)return 0;- E1 ?! Q% L; t' i# Z) D
- } ; n7 |% n, k* z0 m
- return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据 0 t" ~" v7 h' Q& B& k1 D/ B
- }
复制代码 ( m% |2 Q6 X3 x, d
oled.c. \1 n5 ?0 K- ^
& W% ~0 Z* M1 m" |- #include "oled.h"
% M6 u5 |$ U r( b" c( o7 t4 B* K$ q - #include "stdlib.h"
! ^3 Z9 w5 ]- R& p$ x* v _ - #include "oledfont.h" " m+ `: B& y% u, W5 {/ R& R- b# Y
- #include "delay.h"
' c/ s& Q" ~( B( Z - #include "stdio.h"
$ ]7 \1 D0 o/ b V - #include "spi.h"
# ^3 [5 }% M8 M5 A5 P R - //OLED的显存8 ?4 u7 s B3 H3 e( n( M
- //存放格式如下.5 L9 o# H; ~; T5 |& \! f+ y+ n
- //[0]0 1 2 3 ... 127
/ S5 A, {9 P( ?$ u - //[1]0 1 2 3 ... 127
, k( T# a+ `# s8 L0 n* y, X - //[2]0 1 2 3 ... 127 m% [$ j s2 p c5 r
- //[3]0 1 2 3 ... 127
# m' A) I7 m2 W2 w - //[4]0 1 2 3 ... 127 ' M" k. p8 @( s, D, _! |4 c8 f
- //[5]0 1 2 3 ... 127
$ E: E- _8 U+ h7 d - //[6]0 1 2 3 ... 127 5 [/ C! S% ?1 E$ X: E- y: h5 q P
- //[7]0 1 2 3 ... 127
/ ` s6 E v" }& Y
. P9 O0 k4 U( P- //向SSD1106写入一个字节。
O9 h2 X2 g% w+ }" u - //dat:要写入的数据/命令3 l0 F' {# u h& f: Q) n+ N! B5 y
- //cmd:数据/命令标志 0,表示命令;1,表示数据;
9 N, Z+ H$ f+ ?- i0 M5 o Q - void OLED_WR_Byte(u8 dat,u8 cmd)
7 A( o2 r+ K Z+ b4 Z - {
$ _# Z8 z' Y$ g; q4 }% \ - if(cmd)
( U- q) p; x) c8 x# y4 S; X" F - OLED_DC_Set();0 E- u- K) }. c) A
- else
3 |3 v/ g) V6 D; R3 h' i7 `; G - OLED_DC_Clr();
9 V" i) H3 |3 A, Z( r - OLED_CS_Clr();
$ `2 L; [: s5 j5 `; Q. m8 A - SPI1_ReadWriteByte(dat); ) l, Y2 l# N ~, D# n
- OLED_CS_Set();% D2 `# G+ w/ Q. o! W" n( [
- OLED_DC_Set();
. j% K( q3 }# X2 g8 y* t - }
6 k, R/ ~* I4 B. J/ P! f- W# z9 ^ - ! N; u; o+ O2 {! {
- void OLED_Set_Pos(unsigned char x, unsigned char y) 0 ?+ P. x* L6 D- s' l
- {
3 y, @! m0 g$ a - OLED_WR_Byte(0xb0+y,OLED_CMD);. P' G6 C/ @9 r- k. c
- OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
. D" k' i( C6 f5 s8 |. n$ Y - OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); # t$ R; M* v+ }' L/ b' f# U m
- } : }; L) V4 p. f; }3 i( j; J- B2 [& r% U
- //开启OLED显示 , t4 C5 \4 \/ p; S5 [$ E
- void OLED_Display_On(void)+ }* c! ?0 q* f3 r5 @* Z3 w6 T4 a
- {7 `6 S, N/ y( T$ {: M x
- OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令2 s/ X" X- H. M2 ?
- OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON, Z6 f1 k. i F9 l8 H
- OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON3 ]( K5 X+ \) X% n1 S9 U3 p
- }+ u! s* K7 }' p# J/ q0 O3 o* h
- //关闭OLED显示 3 }. u+ `/ s$ N
- void OLED_Display_Off(void)( D% h# W) g; C
- {
( M% }7 ?9 j. j' I - OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
( _* G! U) J, m B. H - OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF' K! |1 E' _# M
- OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF
+ [( W# Z- n" K; v/ Z" Z* n - }
9 N3 x) r" K+ B* i! k - //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! - X' z2 z3 w# G$ y& l
- void OLED_Clear(void)
! Q3 J" p+ D4 c - { $ |) J; \6 e* t0 b, S7 g
- u8 i,n; # p4 d S6 W( K+ ?1 ?7 f8 K
- for(i=0;i<8;i++) , g- O/ V/ O. [, K f
- {
7 d2 g0 C: C# B' D+ k+ m - OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)& a }8 @& a( p: V$ B0 R/ Y
- OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址/ e# ^/ S- N5 G/ t% q* E( U; J
- OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址
$ A6 I$ Q8 z! v0 u/ x - for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
. ]: K& y! q% _* b: h* g - } //更新显示+ F4 k5 p3 s8 j# {# g" W- q2 _+ ^
- }5 C3 F$ x% w- k/ \! c( G' [' B% L
- 3 q- s# l! a* D
- 5 Y, f4 l$ k- r* U9 @
- //在指定位置显示一个字符,包括部分字符
6 N# ?0 x) [7 r) G M& ~ - //x:0~1274 G+ @2 t+ I G0 h
- //y:0~63- J. m+ e+ h2 \
- //mode:0,反白显示;1,正常显示 / Q$ L& I7 r3 {* T4 L; o7 k x4 x9 o
- //size:选择字体 16/12
5 V3 ]& t# {$ P5 r - void OLED_ShowChar(u8 x,u8 y,u8 chr)
9 s2 c b8 G4 @1 e# R4 i - { 3 w+ d- n6 v/ F4 a
- unsigned char c=0,i=0;
/ Q. e, B, j, ]# [ - c=chr-' ';//得到偏移后的值 5 H% o( ]- d$ n9 j- Z
- if(x>Max_Column-1){x=0;y=y+2;}3 X) H) ]! O7 K7 ^9 O
- if(SIZE ==16)
2 j: _8 S2 F2 s$ K0 q - {& j) _( x# t6 S! T2 C" o
- OLED_Set_Pos(x,y); / b# S8 l1 E: r' o. T
- for(i=0;i<8;i++)
/ Y) c* C# O, v T1 M - OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
5 b! a( B1 M/ B- O: e0 E - OLED_Set_Pos(x,y+1);) l" h- Q; `" N3 C9 @7 ]4 D+ n
- for(i=0;i<8;i++)4 S( s* J* f5 k) V8 r' F, y4 l5 s X
- OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); Y$ u. z* P$ ~! c0 i3 n
- }6 u) F- e; `. t5 D& Z+ C% O+ \
- }
3 H& W+ K6 Y* ^6 a" Q% ?4 l - //m^n函数
0 h5 ?: K' G2 |5 n3 z' p - u32 oled_pow(u8 m,u8 n)
4 ~& C, r3 H/ }- w - {
4 \/ ~, s% V8 u7 C" r. v; m - u32 result=1;
5 j5 k$ t: e9 ]& {$ m' ` - while(n--)result*=m;
* x# \( h- b' g O: @) N# S) f - return result;" V# z& x$ Z# Z. _/ F3 I
- } , x- v: @* e/ T& u( E2 I2 M3 a
- //显示2个数字# y2 ^5 k, D1 Q- [ v z q
- //x,y :起点坐标
# U% Z# ]* u) M/ _8 i - //len :数字的位数
- `. Q# i% z4 {- j( z+ Z; U - //size:字体大小; l9 j, Y9 T- E+ [5 y* n# D
- //mode:模式 0,填充模式;1,叠加模式* Y- m% n: k. ~$ X) [
- //num:数值(0~4294967295); 0 O4 {0 A$ N; c. l& `$ N
- void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)/ K6 O. t. D- A
- {
4 y8 K& a2 k; f# I ` - u8 t,temp;
) |' O; H7 I! ~. {% Z - u8 enshow=0; / X% I8 _- W6 M3 r4 `" d+ l/ @' K
- for(t=0;t<len;t++)
( `9 l" \+ R1 L5 Q - {+ q2 _1 _' ]& J- X! X
- temp=(num/oled_pow(10,len-t-1))%10;
0 d$ M& u$ ]* Z - if(enshow==0&&t<(len-1))
! ?$ u: s# v( H* w( g - {7 N; B+ o2 L1 x4 {
- if(temp==0)
- h) B; k- ?* w8 H5 j: G - {: |3 q- D) A' n
- OLED_ShowChar(x+(size/2)*t,y,' ');
: X* K- E1 Z: ?* v - continue;+ }4 I3 ^( L9 O1 d/ Z+ R
- }else enshow=1;
7 h, s/ a: d. ]# V ? P0 v7 J: l; H# l -
4 U5 {" [) n; M4 V6 t2 C# t6 A, ] - }
0 k0 `; H1 n9 V/ L5 m# k1 a- o - OLED_ShowChar(x+(size/2)*t,y,temp+'0'); - Q% x" _, {, ~5 _. N
- }
! K; j# O) K- d y' w/ Y6 x - } 4 T8 Z5 u! C P$ ]7 x7 j/ ~
- //显示一个字符号串
- _3 B' C. |3 b8 Q - void OLED_ShowString(u8 x,u8 y,u8 *chr)+ o* |/ ^/ k+ g) \8 n l% W1 c0 R' f# g
- {
+ r* a. _1 z t2 v: n - unsigned char j=0;
( [0 a5 O& h S4 \2 b/ o - while (chr[j]!='\0'). |) Z3 O: G( g! }7 K, C7 c
- { 7 K5 F. v4 T! v2 P
- OLED_ShowChar(x,y,chr[j]);! Q3 a( ]5 g+ K L2 L
- x+=8;- t& `( U; c$ G1 d, K$ Z7 m( R
- if(x>120)
! D! B7 J: h5 ^/ E0 @& g: v7 j$ V - {
; {3 C; G( ]+ p. h$ F' z Q - x=0;9 P) D& v, h" \! d0 a( K* }
- y+=2;0 b3 ~+ b5 ~9 c/ t7 e, o
- }
, L. J' a' V: N* ~2 \8 P9 f; K. I5 y - j++;
4 Z3 T' T3 y/ w. E n$ g! c - }
4 N' H+ H5 y7 D- h4 W1 T+ p k - }" A# [# ~ q" S& |1 p1 [7 o
- /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/, g! C& j1 m4 C
- void oled_draw_picture(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
" V1 K2 T; y2 k! [9 T6 s+ a- l - {/ H* [. Z* L- }. Y3 r% y8 b6 A
- unsigned int j=0;
& c' h6 c9 `" }% V - unsigned char x,y;
; Q* _1 h o# w; W0 i; O - 6 A/ [% \& o+ ]) D; B( a
- if(y1%8==0) y=y1/8; 7 K! a* |- x$ O6 _+ }2 x
- else y=y1/8+1;- `; I$ m0 C( Q6 W6 a2 A
- for(y=y0;y<y1;y++)/ d" Z1 B2 Y3 E6 ^" V+ i+ S3 g
- {
0 W4 L' |" I+ q# Y. z! R) n - OLED_Set_Pos(x0,y);5 P' g5 O4 i% B5 o- J
- for(x=x0;x<x1;x++)
0 l* C5 {1 n) Z4 D - { ; y: F- M7 b4 ?; M- n
- OLED_WR_Byte(BMP[j++],OLED_DATA);
/ g1 T+ F+ D. L5 @5 A - }
' c5 x+ S' o% ^) Y l - }# p; I2 f4 n% \$ Y5 d. {
- }9 M. D0 k1 }1 X( `! W: R
- void oled_gpio_init()
3 C: x+ A9 `( N2 Q+ n( s+ D - {
; w! t) U; q V7 Z+ l - GPIO_InitTypeDef GPIO_InitStructure;/ o' f; g9 x) w0 A5 y0 i
- 5 v) u# y; s3 }1 N5 q! E
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);; {/ O, B; y8 z# S6 }9 ~: b
- 3 V4 j, M- G2 H& ?! E4 i. B
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
3 s) M$ K4 z3 G' m u& ? -
+ L: S/ [) \% H0 q - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_8; 5 Q7 A" @, K6 E' t- z
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
; T8 l: s/ S* h, o+ Q - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ; y+ J/ T4 W3 A' ^
- GPIO_Init(GPIOA, &GPIO_InitStructure); . R' q9 o/ {" u p1 n a1 V* T
- GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_8);( j- q v# h( ~9 R/ U" ]3 S
* C+ w$ U* d. q6 n0 h7 F- 6 G; j" E0 _- _! P9 `' w: q
- }
, Z* U. i7 k/ m8 J8 E- k9 @ - 6 k' }; j% p! B v6 [
" h$ {8 G' w) n( N6 G- 8 V& Q; X: b) X w
- //初始化SSD1306 . g/ X5 `' W E! y& G% b
- void oled_init(void)
# t4 t: p: \; E2 j - {
. e7 W$ }$ L1 ~/ K$ z9 Q - oled_gpio_init();
9 Y0 z' c7 G5 Z - SPI1_Init();
+ H2 {) s: E. T2 m
0 f; r1 T* u S9 V2 e0 J1 U- // OLED_RST_Set();//复位使用系统复位,所有此处不需要再复位8 M5 x X9 m, r0 _1 [! Z/ b7 E
- // delay_ms(5);) @8 k5 G7 X% w! K9 S0 Y
- // OLED_RST_Clr();) I% l) Q/ w! l/ ?) h9 L, E
- // delay_ms(5);
/ b% X% B- t- T0 D, B5 @ - // OLED_RST_Set();
9 ^, e' x+ k# Z. l -
9 i( g( h+ C) l& I. r; S. w - OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
! O0 G- _/ x+ }- V, Y - OLED_WR_Byte(0x00,OLED_CMD);//---set low column address/ H. {* Y- D" x
- OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
* R3 D0 M' S+ l2 P - OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)" z+ \( E4 }$ i8 Z4 Q
- OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
: c: k8 y6 e5 q- m, t - OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness' V7 s3 F. i; L. | n: l
- OLED_WR_Byte(0xA0,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
+ n; T- z6 o4 K: f/ ] - OLED_WR_Byte(0xC0,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常' G* |6 t: G5 c
- OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
$ o! G2 H5 I r( p* N/ U' ` - OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)8 y% u) `2 Q) ~2 P3 I8 K( R n% D
- OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
. F5 u& ]* G d1 A! m. k5 C m - OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
# A) v3 s8 Z* g" P - OLED_WR_Byte(0x00,OLED_CMD);//-not offset( H6 r) V5 d0 k7 y+ B; F1 [
- OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency( t0 T2 _6 A2 {4 m, P( Q# V
- OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
' @( T: M; ]. s3 D1 c& | - OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period9 d) z9 {9 f! ~2 w9 p1 W
- OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
- W% N9 T5 [/ M5 ]- [" K6 x - OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration. X; S5 n$ t U2 q( l* g. ~1 ~( O
- OLED_WR_Byte(0x12,OLED_CMD);
3 p" W2 l' {2 L1 H, Q9 ~ - OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh5 L! J; S* H. D
- OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level5 a, B& A E7 m4 l% `
- OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)% H: D9 l, z) R( O" V0 n, S$ o
- OLED_WR_Byte(0x02,OLED_CMD);//, h' q( g* l1 W4 _
- OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
8 |' g: m8 v8 J8 Q2 U3 F - OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable0 U! s3 ?5 G; q7 Q
- OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
9 }( \/ r0 M) Z [3 M9 G - OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
4 T) G+ V3 g8 W! \8 J - OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
( e, S0 r N; n5 ~ V) r; p -
( o6 U7 @0 q6 t - OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ 2 X1 S$ {( W9 Q+ B' X5 D
- OLED_Clear();
- Y0 f `, v! S) r7 ^ - OLED_Set_Pos(0,0); b' d1 \% t0 _. U
- SPI1_SetSpeed(SPI_BaudRatePrescaler_2);
7 m, D" J& \- D' @ - }
复制代码
7 w2 Y* k# _- [' s6 h, Amain.c
0 C. N; }% M) j" p- U2 u$ A
! K! u& B! _7 E- #include "sys.h"
* j9 n$ T. z2 }% s- G7 L9 q - #include "delay.h"$ p9 C3 e# j6 Z1 a. H
- #include "usart.h"
m! M k* w3 L- X* b2 Q. ~ - #include "oled.h"6 F5 K$ o \( M! `9 S: _- `" F
- #include "tm1804.h"' `' I [% [' t! p2 u( x2 w% l
- int main(void)2 T+ P! Q! c3 }: [; u% `) `3 r
- {
6 q+ d3 k) k A o5 f% ]; A0 C - delay_init(); //延时函数初始化
/ r' N8 O) v$ H; G4 o" }% v - oled_init();. g9 c8 E% Q, w; E: Z4 y
- tm1804_init();
3 w8 _& v( R! i4 p5 m - OLED_ShowString(0,0,"xupengxisxveryx1");
# C5 c, `8 ~. I: e0 T - OLED_ShowString(0,2,"xupeng is very");
@$ [, C4 M+ _& Y' V0 X) B - OLED_ShowString(0,4,"xupeng is very");
8 h" t1 I0 {' r6 z' ^1 i1 N7 G - OLED_ShowString(0,6,"xupeng is very"); V& Z4 e" E$ d$ z: Q1 n
- 8 Q& v0 e* W8 O/ C* h
- while(1)
' V6 ?. v `- C% H; p( N# ~ - {3 A, ?6 e$ A7 w3 n
- set_tm1804_data(0xcc,0x00);3 }) e! U. z/ |! r# i# G' O* Q
- delay_ms(1000);
/ @0 l; K% d3 o - set_tm1804_data(0x00,0x00);! L( w5 }2 b% q" ?2 Z
- delay_ms(1000);, \# q! e2 y' ^( L0 B3 }* f# a
- }# Q# [. [8 c$ |' w% |4 E/ V1 V
- }
, ?4 \0 T9 o% P1 \+ | u( [) W! u
复制代码 / J8 \! x) o. m" _! W5 |! y
. x9 g5 [" P3 w |
( j: K4 O8 e' P: z# ~
! ? C/ ~3 H: t7 E7 {+ O9 M' ^ |