在分享一篇,这几天突发奇想,搞了搞几个模块,给大家搞个基础一点的分享,8X8点阵模块,这个对大学生应该是还是比较实用的。0 }# H- i1 `: n1 M5 i* [, _, J
一、设备 `% M% d& _. G' T
本次以用的是STM32L031(当然其他的也可以)+ ^' q; g" l- l2 a: b3 O/ ?* ]
模块:8X8点阵模块, ^7 |, v/ R& V" I
( i; l! }( Y2 ~
+ _5 v& y: |/ B4 O @
话不多说开始介绍: i6 ?2 Y) Z2 F
& n6 E0 D4 S. I5 ?, r; g1 I% Y+ A
二话不说,我们来看一下点阵模块。从下到上一共有两组8位接口和GND、VCC接口。所以不难想到每个点由两个接口控制,理论有了,直接接线看效果。9 V$ M- U5 D. g) `8 C8 X
在是跳线的时候我的想法是两组要么都是低电平有效,要么都是高电平有效,结果试了都没亮,当时就疑惑了。可能是惯性思维的原因,一直没想到一个是低电平有效,一个是高电平有效,为此我还纠结了好久。9 ~ h2 t8 t5 u1 @# ~* F* ?
直接看图1 \# @+ }& U! ]6 G
o* x) Z+ u7 k2 }6 Y$ F) p
紫色和橙色接3.3v,蓝色和黄色接GND。8 l+ B% p& C5 k( r ]+ V
分析:$ g3 m7 d: i* c
自左往右数第五列,自上往下数第倒数二行;7 p! j" J3 h& U+ V/ o% B' m
P23和P17。4 C# O' ]' k7 w" G9 j
得:$ P: ~( N; {7 o* q6 t' j' w
P2控制垂直与接口方向(低电平有效),P1控制平行接口方向(高电平有效)。
$ {, ~9 k' G! ^文字不好理解直接上图:/ V# Y8 e- T8 K' u& n
. ?6 u% d4 u9 M: s5 ^
以右上角为坐标原点建立坐标轴:
2 S2 `$ h; R: zx轴由P1控制(高电平有效),y轴由P2控制(低电平有效)。0 q2 r# W$ k! U; w- j
( n) o5 Y$ ?& X u& Z' w
0 p' K' D; G2 T1 Y. c4 x- y6 |( m
设计问题0 ~7 K ~( L2 E. Y
知道了工作原理,那就玩点花样,先设计一个静态图案实现一下。
: i- M- V* n. o心形图案2 r( x9 V0 x, ~( c, z* }# b
如图:! M7 b! d% s% V! G
r3 T, ~7 q( N f9 w9 B! t! |
三、设计解决方案
6 R, M/ p0 i# P3 M思路:* x: L* Z) U$ R
通过定时扫描实现图案显示。% ~. o) X8 o( S- ~% R. m: j# J. `8 H
按x轴进行扫描,从x=1开始,打开P1口,将y轴的显示数据输入,x++,重复y轴输入,从而达到显示效果。
8 v! j/ Q0 Y" R: i' D: O流程图:% P1 ?+ c) B6 u5 t/ O+ d p
* ?- u2 m. G( A" R* B初始化GPIO
5 M* o1 B4 h( q; Q" F' t输入y轴数据
2 _0 r( r4 `4 y打开对应x轴
5 V- F( j8 C7 o/ M6 D* |关闭x轴2 S1 w6 ^1 E: ?; {
清空y轴数据
0 ^! Z) c! ~$ M/ R理论存在,开始编程
5 u4 t7 ~) Q& Z$ {
* r) ]2 {, R" V& ?* K. N8 H7 G
% k$ w+ H/ ]' I四、程序代码2 ?$ c/ Y# O# H; X" Q; X* @7 e% i; {
- #include "lled.h"
1 m$ _, J- u2 a d$ o - @+ ^$ z4 N% \- B
- uchar L_heart[]={0x1e,0x21,0x41,0x82,0x82,0x41,0x21,0x1e};
. t0 c$ Y9 K2 o6 S2 j' m - //用数组储存y轴输出的数据+ t: a! t a% `# Y( _
- . e4 s: e9 F! A
- void led_init(void) //初始化端口& b2 p. ]8 V, S
- {
; a8 H/ l" A1 j2 l% ]1 e - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
! @0 s: }4 \# u9 K: e - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
9 L; K N/ w$ U3 g - GPIO_InitTypeDef gpio_ad;, f: @* A/ d& a4 q: |, [% R
- gpio_ad.GPIO_Pin = 0xff;
b# H9 D# ~2 t+ u: O) F - gpio_ad.GPIO_Mode = GPIO_Mode_Out_PP;
* C$ n- n* ^; @% ]: ~ - gpio_ad.GPIO_Speed = GPIO_Speed_50MHz;: r, A9 B6 M2 y" n" d2 j
- GPIO_Init(GPIOA,&gpio_ad);//A[7:0]->x,low PA01~PA07控制x轴,低电平有效
9 r+ P, x, p7 z" K2 T6 _; W - gpio_ad.GPIO_Pin = 0xff;2 H/ g$ D* \1 t3 k6 p& i
- gpio_ad.GPIO_Mode = GPIO_Mode_Out_PP;
/ N. u/ M: \$ `8 l9 f - gpio_ad.GPIO_Speed = GPIO_Speed_50MHz;
$ ]' K6 _: u; \: x: Q8 X - GPIO_Init(GPIOD,&gpio_ad);//D[7:0]->y,high PD01~PD07控制y轴,高电平有效
2 L& Y% K& N2 V5 }2 q - 5 ` S4 S# J# W) u7 a% o) u
- GPIO_ResetBits(GPIOD,0xff);, g7 C9 h/ Y* l/ F$ K1 \: ]) n9 a
- GPIO_SetBits(GPIOA,0xff);//关闭x轴,y轴输出
: @; ?. A7 b f; V- i, E - }
; X. f' _/ b: _. b& Y5 B - , W8 V2 i2 o3 e9 J( v) [
- void led_display(void); ^1 P# l5 D6 {6 H, k- y8 T5 Y9 Y5 [
- {
* a( Y% S1 @: {* x; G3 u7 ^% \ - static int i=0;( i$ ]; v3 L0 ~& h
- static uint n=0x01;4 g; M! E5 F7 Y! J+ _, J
-
6 f: D" i3 R2 P3 B0 D& S; a% b - GPIO_SetBits(GPIOD,L_heart[i]);//输入y轴数据! |# R7 a9 v" w. Y4 s
- GPIO_ResetBits(GPIOA,n);//打开x轴. ]. s; \! ^' f
- delay_ms(10);
3 {9 C7 [6 E9 s) [ - GPIO_SetBits(GPIOA,0xff);//关闭x轴
# U, B8 T6 P) G; o0 j3 j - GPIO_ResetBits(GPIOD,0xff);//清空y轴数据" U3 r* t: W- ]
-
0 B" H4 f/ z, A+ |8 `0 t - n=n<<1;
/ l! D7 D0 n/ \1 X4 t+ `+ @! [ - i++;; f7 t# p) `+ e3 A, k
- 0 p6 z/ a; i7 G/ Q0 w3 I
- if(i==8)
5 G6 S* t' y- M: P7 k; c - i=0;
6 ?# e2 {1 |5 p; \) k9 _. ~ -
2 k& T9 E5 _' M; F* m - if(n==0x100)0 _4 ^& g1 M; Q0 L' m
- n=0x01;0 z% d6 I. f2 h2 ]: T6 M
- + |7 O) s# D/ f1 C
- }
6 }" Y7 a# h: E1 u! g% ] V - 1 f, x8 @% ]7 x! O% V
- void led_off(void)
* m2 B( t* v; w/ Q: U - {' O; @1 |4 u& K# y8 i
- GPIO_ResetBits(GPIOD,0xff);! }% R ?- ~( E; t# f
- GPIO_SetBits(GPIOA,0xff);8 S- ?& }, d0 R1 f# \# E
- ; r7 X1 l2 B% P9 ]- g& W
- }
5 X3 O( m! F$ h' x% h
复制代码 效果图如下:
/ s5 ~0 e' F6 d+ g2 C* v
/ h1 \- b0 f7 l) L3 Y/ W
3 h: T, B& X6 @2 q* L( Z
* ]0 b, `( v% X, s& E* {
( g( e4 p, C; \ |