在分享一篇,这几天突发奇想,搞了搞几个模块,给大家搞个基础一点的分享,8X8点阵模块,这个对大学生应该是还是比较实用的。' d; i2 H) S, o
一、设备. j: H2 n2 C2 W. d5 _
本次以用的是STM32L031(当然其他的也可以); l0 E6 V. V. `0 q: |
模块:8X8点阵模块/ |% v! u( Q0 v M m: c
# W, Y5 C6 f: o9 E+ R' X- C
% n* Y9 X/ v; Y' d4 U- {& x
话不多说开始介绍:
0 Z& T, s3 C+ X1 f
1 e+ i1 g* k O$ @# V二话不说,我们来看一下点阵模块。从下到上一共有两组8位接口和GND、VCC接口。所以不难想到每个点由两个接口控制,理论有了,直接接线看效果。, e2 |- i3 X: }8 @ K3 E6 A4 n$ Y9 E
在是跳线的时候我的想法是两组要么都是低电平有效,要么都是高电平有效,结果试了都没亮,当时就疑惑了。可能是惯性思维的原因,一直没想到一个是低电平有效,一个是高电平有效,为此我还纠结了好久。; q! U% i# f) w8 m
直接看图
& [! m: H9 \0 d7 u
: x- Z2 G6 M9 h1 R2 D紫色和橙色接3.3v,蓝色和黄色接GND。
3 s9 A# K+ Y' N9 r ]分析:, e- n4 `) E# r/ O( m7 x6 \7 Y
自左往右数第五列,自上往下数第倒数二行;
& v8 j# i1 t4 G- gP23和P17。3 d, f6 ?, T) b5 ?( _! t1 d
得:
1 e5 r, S9 Y& w$ @P2控制垂直与接口方向(低电平有效),P1控制平行接口方向(高电平有效)。
" l, ]/ | N" z0 v" H文字不好理解直接上图:
2 K; X0 I2 J9 j! ^$ Y! G3 t% v
4 }/ I( N! P7 N3 g4 {
以右上角为坐标原点建立坐标轴:
4 V L, U6 A0 y @5 }6 i; ?x轴由P1控制(高电平有效),y轴由P2控制(低电平有效)。
% J4 y0 [4 \* |- L; v( W4 U3 A9 L, g- ?/ Z, P5 B/ f
6 ~) ?: D6 h7 d- Y' Y* P X x0 A设计问题
}; b" y0 J3 M4 Z7 ?* l: r知道了工作原理,那就玩点花样,先设计一个静态图案实现一下。5 o6 d3 {, J/ r1 c) Z3 U8 }
心形图案/ o0 B/ i4 v6 w; ^( v& G, ?7 K9 G7 U
如图:
3 e* X& k8 I( C5 o2 o! G+ F# ]% q
2 B& A. t: a! X3 s0 B
三、设计解决方案
+ C" Y! k% e1 G! j" j, q思路:
/ \! b0 E& R4 ~# G通过定时扫描实现图案显示。
: |. n9 ]/ k; O1 T: f1 T按x轴进行扫描,从x=1开始,打开P1口,将y轴的显示数据输入,x++,重复y轴输入,从而达到显示效果。. M# D* F* K$ P
流程图:
q+ M( ?5 n4 V- f
- V# m8 H4 [( i: ^/ l
初始化GPIO
: a% u. {; x% d3 v/ u. X输入y轴数据4 B, r4 r+ q7 n) `! {5 Q" z
打开对应x轴# P4 F- f; b0 d
关闭x轴
/ Z+ r8 o- x, n清空y轴数据5 o A9 |0 u1 h5 Q, S
理论存在,开始编程
# I j/ |/ Y2 V; n
; u/ ^6 }! [( L9 r; f7 A2 X% k$ }2 L( c4 `2 J" l
四、程序代码
4 B' W& J! D" y- #include "lled.h"
* R5 H* `% I# m4 I - - K+ i' C+ p9 O7 V7 n; b9 c% {
- uchar L_heart[]={0x1e,0x21,0x41,0x82,0x82,0x41,0x21,0x1e};
3 p* Z, b- \/ g3 r9 Z- v7 n5 ` - //用数组储存y轴输出的数据
) d# @0 j: O w/ j - 1 e5 A& L2 T/ j/ v
- void led_init(void) //初始化端口5 y T+ K2 W) ^: Y6 T) g8 h
- {
# @4 D/ p" E7 E' j( v6 O - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
0 u6 s ?4 `( @3 _9 ^9 } - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
, e8 v( U6 s7 w0 W$ o1 o - GPIO_InitTypeDef gpio_ad;
* Y/ i+ u. g4 n - gpio_ad.GPIO_Pin = 0xff;
6 `! ]+ l5 G* g& k* ]; R - gpio_ad.GPIO_Mode = GPIO_Mode_Out_PP;9 X- a& ~; m0 K* k
- gpio_ad.GPIO_Speed = GPIO_Speed_50MHz;
# V5 `5 ]3 ]7 P' i \ - GPIO_Init(GPIOA,&gpio_ad);//A[7:0]->x,low PA01~PA07控制x轴,低电平有效2 ~! Z. d: Y- q) t0 z* }' K5 r
- gpio_ad.GPIO_Pin = 0xff;
" e6 K4 X$ q; v! D - gpio_ad.GPIO_Mode = GPIO_Mode_Out_PP;
9 i( H2 j# ]1 O3 ~! u - gpio_ad.GPIO_Speed = GPIO_Speed_50MHz;
K. c4 O1 L/ M" D. y' [ - GPIO_Init(GPIOD,&gpio_ad);//D[7:0]->y,high PD01~PD07控制y轴,高电平有效
2 q u; I3 ~: e( \5 \; ^2 E - ; Y9 D7 ~6 Q g8 b
- GPIO_ResetBits(GPIOD,0xff);( _) l2 H' u8 N2 g6 ], L
- GPIO_SetBits(GPIOA,0xff);//关闭x轴,y轴输出" K1 i7 R6 |! i. \
- }
0 f( P, Q- p/ v. [9 H+ @0 g
4 G4 h% a7 ^) ~& T% |. }- void led_display(void), `; a8 X; T# r- x4 L
- {
, j0 J" b! Q" l - static int i=0;
, D& y* v3 [8 J& i. `8 X - static uint n=0x01;8 @) D% l& L5 V' u4 a/ `0 r' S1 f
- 6 H- p! S2 U8 c; [7 G$ S W0 h5 Z
- GPIO_SetBits(GPIOD,L_heart[i]);//输入y轴数据8 O8 M( `5 C! W3 m3 ?* _" I
- GPIO_ResetBits(GPIOA,n);//打开x轴! T }, A4 b( i
- delay_ms(10);
/ b' w. p/ {/ Y) m5 c4 e6 N3 o f - GPIO_SetBits(GPIOA,0xff);//关闭x轴
3 f6 _) ^8 |$ |. V4 O - GPIO_ResetBits(GPIOD,0xff);//清空y轴数据' P$ k% ]2 c2 W- P k ]* j
- 4 f" f, e6 _3 S8 c8 O' r
- n=n<<1;
& x3 ?7 R2 x. \ [' A - i++; D3 P v# B/ {) }
-
. \# ^0 q: }( j5 q- Y - if(i==8)8 z3 U( e3 N! U9 N) P# d7 @
- i=0;
* o; d& b2 n8 b& S( F; Y$ a- n) a - * ~4 S; B4 t9 R- R8 H
- if(n==0x100)
1 D: f5 z! c7 G3 { - n=0x01;; {6 F! Y4 q- B |! `
- " d0 \! z& A) L: h" E/ F$ R9 `1 m. B9 _
- }
8 H% g/ r* D s& l+ ^) h/ X& {0 C" ] - : H) a n6 |5 T* v3 ]1 G) Q0 `, U
- void led_off(void)2 w/ `0 s$ | r6 F
- {) T* L" W1 m4 ~! \) }
- GPIO_ResetBits(GPIOD,0xff);
) n% W- L- {" { - GPIO_SetBits(GPIOA,0xff);
3 n, M9 S" V& H" b( e1 } - # a( m4 E, _+ n% e. b0 j7 u9 _
- }, y( ?$ f# b. k5 \1 M
复制代码 效果图如下:7 N4 s! e8 \6 ^
( V7 Y. d# M$ p( y7 y! {# S: U6 Z2 n# z' t, |# G; x: |' c
, j& v" t% B3 ~; B( t
9 R G. ` R7 X+ K: t |