为了参与2020年ST年度盛典活动,特地用最近获得的STM32L552ZE-Q开发板制作了循环显示"我要ST年度盛典"和"ST社区 单片机开发者的家园"的小实验,下面是实验过程的照片,用于显示的是LCD19264显示屏:2 O3 O: K# P2 X: ?
( W8 K) @; ?4 V- i( \" l* ~: C3 X, Y: a* y. x/ u
实验非常简单,就是每隔1秒循环显示"我要ST年度盛典"和"ST社区 单片机开发者的家园"两句文字。屏幕上的日期时间是由一块DS1307日历模块提供的,单片机通过systick中断进行毫秒计数,在主循环中每秒更新一次显示并进行计秒,然后每分钟读取一次DS1307日历模块的数据并更新日期和时间。代码非常简单,下面是主函数的代码:
, k% N: U R- H7 i$ c1 B- int main(void)
4 c' } a5 B0 r3 F( M2 ^& v; d/ _ - {9 R* k2 L/ I3 i2 r
- /* USER CODE BEGIN 1 */
: y3 y; H' o5 N8 v. o5 h+ w# i* s - uint8_t ledn,ledm,half,disp;
8 y8 G8 p" b5 {* b, L - /* USER CODE END 1 */9 N5 ^3 q2 D0 d" C+ P5 F9 r8 r
- 1 f# m, T' h( X8 H7 }
- /* MCU Configuration--------------------------------------------------------*/. `- r) c# [9 f8 r" C5 Z5 }
' B& L% Q& C' h8 V! q5 d- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */, d4 Q4 @: Q& y) B+ N4 B; s3 S: Q/ x
- HAL_Init();
5 }3 R( `* S2 w0 ]: ` - " z5 x# J8 ]; d# |9 L, q
- /* USER CODE BEGIN Init */
9 V4 R0 d# J/ J2 h( d0 z2 d - % X7 A$ B7 E m6 G- ]
- /* USER CODE END Init */
% L8 g1 i2 |# t: T! i$ w$ T& z! {: y - ' N! H. }. r, ?/ C; H, W$ u+ F
- /* Configure the system clock */
2 |( O, V& @7 t% B - SystemClock_Config();
/ a1 z3 j8 D! |
) A" n! E, Z( J9 G. M- /* USER CODE BEGIN SysInit */
z% n. r* X0 s9 O( a* v
0 k% u8 N$ N( b& G8 O- /* USER CODE END SysInit */
; J$ S% w( _' M5 i8 S2 m9 s+ y
9 M+ P+ C& L# X+ a. _5 C" X9 L, C- /* Initialize all configured peripherals */4 ^& V3 [ m# {' W8 j0 A
- MX_GPIO_Init();
3 ?/ z- K$ L/ F& ~9 w - MX_ADC1_Init();
4 \9 o1 V6 P1 b ? - MX_LPUART1_UART_Init();" A$ K. N; d# ~& E
- MX_RTC_Init();% Q8 z' Z0 i, [" }
- MX_UCPD1_Init();
1 E7 [6 A$ w5 F5 x2 q* ]( _ - MX_USB_PCD_Init();
- B _: U- K6 h3 v - MX_I2C1_Init();
9 l8 Y, ^: c/ p3 H# c. g d1 o - MX_UART5_Init();$ A& i/ u& X9 {# r+ ]
- MX_USART2_UART_Init();. {- Y @, a- T; M
- MX_SPI1_Init();, Y; g! Y2 ]" @1 q; _2 ]! F
- MX_USART1_UART_Init();) r* @9 X3 A# y1 c. U% ?6 K' m- v
- /* USER CODE BEGIN 2 */' l3 S2 ^" t4 {3 f
- LCD_init();
; y9 Q6 t- \3 K3 h - display_main();9 R7 o! j& M M# j
-
7 P& y6 |$ z$ C: B# f; U0 F - DS1307_Init();1 E% d2 |' C6 B* g# o" p+ D/ u2 \6 E
- year = 2020;$ L3 g ^- m% U8 C( j
- month = 12;& X; T/ Z8 f5 K4 V9 m L
- day = 23;
: U' R0 K1 _3 k - hour = 14;
7 C9 ?8 z8 H! E' ^" D" q& Z- e - minute = 27;# U8 Z6 Q, }. P/ Q1 C
- // DS1307_write_date();2 G& J* J; p" k' N* i6 I
-
) j7 N' |( M `8 r! t' v; c' f - DS1307_read_date();
1 |1 \3 i& U% R; W" G% R$ n - display_date(year,month,day);
* J" O# \' q1 ^* V- P, { - display_time(hour,minute,second);
k6 C# T5 U/ s: I2 } -
2 \5 g! m: t3 w& H4 V( @" W, F& t - /* USER CODE END 2 */) v: ~: _" A6 M! Y6 b. K& b
9 y' z5 N K. x" X- /* Infinite loop */
+ ]- [8 o5 H8 D3 {! F4 H; ?7 e - /* USER CODE BEGIN WHILE */* E* ?0 U$ y% v4 r, U) v2 Q
- while (1)
2 X+ R2 n3 g, V6 G, K: o - {" y. a+ d8 W8 a' `6 E, w
- /* USER CODE END WHILE */
; u/ Q+ E+ R3 c) z7 K
% c1 l. e% W, S/ d- /* USER CODE BEGIN 3 */0 y) N4 q+ V. R
- if(ms>499){ //半秒处理开始/ y* Y, x2 \& O* j1 b) x
- ms = 0;
6 H6 v" y8 ~. D1 p7 E% f* h* O - ledn++;% E# v; \: k( V% k
- if(ledn>6){" R( P& m$ f, Y" [" u/ G
- ledn = 1;: C" \3 G( n; \0 v3 g4 S/ c9 C& S
- ledm++;$ g9 P* r# D1 Z# S6 \3 D
- if(ledm>2){7 K* d ?* [- P" d; ~
- ledm = 0;
9 B# O J$ _3 q# A" K+ n$ m - }
; S; S9 _! j N) s1 F - }5 }! S& i) h, _8 T/ S5 H
- switch (ledm){ //花样点灯开始
+ e+ d% M9 u* j! k; \ - case 0:( ~" @) N* p+ M: I; ^
- if(ledn%2 == 0). u* y5 ]& @+ X- M# J; X1 r
- LED_On(0);8 i5 a( x& B( V
- else
0 \' W3 N- t6 X6 {, K0 M- ~4 J q - LED_Off(0);: Q2 z. v8 [! S2 c, \
- break;
& e' F8 B/ z1 @' e! R, j - case 1:# K9 n9 K) J8 k# o d! S' k
- LED_Off(0);4 l8 [6 m1 p/ @; K* M
- if(ledn > 0)
3 m$ q* K; V* n/ Q - LED_On(ledn);
. h/ X: Q9 d! q% v2 I# \4 g5 ?1 {0 ^" O' e - break;
( f0 J& p- ], l; p - case 2:
$ G% d( r3 C/ g S, @+ Z* ` - LED_On(0);+ ^( G* o* n2 a9 F. k/ b# Z
- if(ledn > 0)" r3 c8 t- \, h0 C4 ?4 V
- LED_Off(ledn);
0 m( z8 Q- ^; W% K4 z4 C7 K& R) G6 a - break;' z# j6 L9 i4 Q$ y! {
- case 3:
! ], ?+ q3 w$ D) Q% D, { - break;
8 d* r$ u$ U$ \0 y) A; I6 g ~" r& l - 6 ^$ C2 S J! B; b$ A
- } //花样点灯结束
" R1 E! n1 u* N' w6 Y5 M! l - half++;
/ D8 O1 S- n0 I t& p) J - if(half>1){ //秒处理开始& p3 [, m' h( g p3 |9 I
- half = 0; I6 z: R. U' N+ `$ S9 f, N
- second++;0 G* U* Y0 A3 H' ?# r1 a: Z* C6 B
-
/ ]3 i' e0 N$ y r5 \, @ - if(second>59){ //分钟处理开始8 ^% N! v' h! q& X
- DS1307_read_date();
! F$ @3 R$ q2 y$ k - display_date(year,month,day);
* G* v- y4 Q% }& G -
; B7 o+ A4 @1 [# Y - } //分钟处理结束
8 J% D2 F9 Y1 T0 F Q$ G' T7 V - display_time(hour,minute,second);( S: F: M; V, t* G
- printf("当前时间秒:%d\r\n",second);
/ g# H" H' t. ?" C/ k- Q1 s - HAL_UART_Transmit(&huart2,aTxBuffer, 16, 100);4 O" w5 w. d# {
- LCD_clear_line(4);
q( G' n- p6 p" v" Z7 v6 D - LCD_clear_line(5);1 U4 }) R( ^/ i2 \- `* Z. j4 n4 O
- if(disp == 0)( A2 l8 s9 @" D- t. p
- LCD_write_BG(50,4,"我要ST年度盛典");
3 h" f3 S' {8 P: p& ~1 Q6 w; ? - else
. p1 v3 ?: n+ n9 s. }! b - LCD_write_BG(20,4,"ST社区 单片机开发者的家园");
2 l* Z9 I5 @% y+ U3 {( V! o - disp++;" A- c0 O- O1 Z( y
- if(disp>1)* H N: d( w& Y
- disp = 0;
7 `) m; S, u. R$ R( I! z - } //秒处理结束! r8 @, G/ h6 ]" z, U
- } //半秒处理结束- N& _" W: E/ c1 c$ U0 r: P
- //处理串口中断接收的数据
$ h9 B6 D& E8 S, r, @: p% O9 ~- t/ F. I - /* if(aRxID>1){
* {* | H! U2 t5 ^9 @ - LCD_write_value(0,2,3,0,0,aRxID);
& R4 H0 a' @: J1 G" ?9 r/ U - aRxID = 0;
: D9 ?& ^2 N1 e - LCD_write_ASCII(0,3,1,aRxBuffer);' r/ X+ X8 f# U6 P: n9 K6 s. ]
- }" Q# d# [, F' b; _2 {
- */2 C: `2 m( d( P; |
- //轮询处理中断接收的数据
& n! l8 A! H) F9 n$ R - if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE))
! L. y+ _! b* c. [ - {
( H6 Z U0 w2 F. ` ?) D - HAL_UART_Receive(&huart2,aRxBuffer,16,100);
# s Y8 _. `; Y/ Y4 q - LCD_write_ASCII(0,4,1,aRxBuffer);
% O3 O) I8 Q: N3 C( P3 P4 p# G - printf("\r\n");
' Q) Y. P x. ?; o, A4 e3 a( ` - HAL_UART_Transmit(&huart2,aRxBuffer, 16, 100);
# L5 U) |; M8 \ c - }
/ ?/ n* z/ o/ Q7 X2 [ - } //主循环结束
2 S5 _" \. t& E. J+ I2 m9 C1 ~ - /* USER CODE END 3 */ Z! n9 @/ F# |( O
- }; R4 ?/ N; }: c# T; M) R
复制代码 其中还包括了花样点亮三个LED灯和串口通讯测试的代码。
7 e7 ] H! ^1 `5 a0 r; q4 N3 O 下面是LCD显示屏的特写("我要ST年度盛典"):
' h3 l. i# {( X3 x# n: S$ E
2 Y' b$ O8 E T5 c
- [ _, |+ p/ w4 v 这是显示"ST社区 单片机开发者的家园"的照片:
& r% @ W2 Y8 V7 g
! U+ @' F: W1 y* i) ?' ~
8 y% ?6 d7 T3 @4 a* x( F 这是测试的动画:- c3 |, ^2 @% e) P3 G
3 @- b( v+ W: x+ c/ u# ^& s! U" d
: L+ d! [) F5 _
仓促应战,没有进一步做流水显示的效果,只是简单地循环显示而已,见笑了。
; V2 n+ @- W p ?, [0 p/ R9 R |
192*64点阵的屏,主要是性价比好,某宝才11元,买来不久。