前段时间为参加RT-Thread x STM32 全连接创意创客大赛特意购置一个2.8寸的触摸屏,这次也让它露个脸儿,为社区献上一份祝福!
# |5 H& K, b( V. v0 p
) _4 x( I8 a" v: v' }& |8 V1 f, Q
+ t. C5 `. O8 R( q* S5 p6 Q
+ x; a' d9 w' t/ F' z2 {
4 b( s* L: D( h' e
% u: X0 T! t+ L9 F) @. U
为了便于移植,驱动采用I/O口模拟SPI接口通讯。. B: U/ `& _) {4 F0 ^0 Y1 u( H4 Q) L
显示屏与MCU的连接关系如下:
& B3 r% s+ ^4 Z" E9 F# f. c% `, V8 MSCK---PC7' h# F3 G0 a' @0 k" A: D
SDI--- PB6
- d: @1 a R$ {! a$ CD/C---PA7
5 ~3 f) L: F0 Y2 n! GRST--- PA6
& R, h2 h1 m0 MCS ---PA5
9 R6 T5 J( |& V+ [/ \; i4 ]LED--- PA90 r8 b2 e1 q( j1 W: R' X
4 m3 V- o8 D5 C8 O4 p. ?, H
! {- H) y( p! _; L$ U9 R* v输出高低电平的语句定义为:
4 [! Y7 d0 [5 ~ r; y$ m#define LCD_CS_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET) // PA5
( z3 O. y: b, q$ f2 Q#define LCD_CS_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET)
/ Q6 ]- k( X( z0 K' x" Z. B: @
7 }) w8 P i2 R! E& G% A5 ]#define LCD_REST_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET) // PA6
t( t; B; _% v+ q0 c' f9 ^#define LCD_REST_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET)
+ u( {% C& u2 E9 ]) V0 _$ f9 ~. q: Y4 O+ s" [
#define LCD_DC_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET) // PA7: v% ^. J7 s# T* ]6 @3 f
#define LCD_DC_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET)
- Z) \4 ?3 ~ T" x8 p$ f# T$ S4 f, ^
#define LCD_SDI_High() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET) // PB6
, v) l9 ?$ I/ o#define LCD_SDI_Low() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET) l7 p& A# o5 n: C6 g* u, S/ g
' K+ J, y% D0 T. t+ b3 `, d
#define LCD_SCK_High() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET) // PC7
6 C; r1 }, p4 b! I' |3 H" U5 q+ J#define LCD_SCK_Low() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET)
" p8 y' d u& R" f0 o# k B! \4 F u" @
#define LCD_LED_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET) // PA9' j& ?) Q+ R1 a1 L; P
8 r" Z& A* d! b S0 G5 I/ X- Q
- e5 u: k, w% x ^' [1 `6 t q4 T: A
相关的辅助函数为:
$ _6 f( x1 q' ^1 U- void LCD_Writ_Bus(unsigned char com)
9 G; [* y8 Y: N' K) r6 { - {
9 r8 C1 B" O% L8 {0 R - unsigned char uci;# V1 d9 ~$ @0 n9 u* j/ f- H
- for(uci=0;uci<8;uci++)' M% H; T2 }. X- [8 \
- {+ T1 d) ^7 z; E# B9 U* F& R' L
- if(com & 0x80)& l# M- Q; H3 j1 y
- {
h n3 i% h# d - LCD_SDI_High();
2 j- I' a* Y |1 z1 b - }
* F2 y7 Y+ G! J6 Y+ B2 B - else
- I" V3 h3 s. {4 S0 ~! [ - {' y* k% @: F! {% l; {+ y4 b
- LCD_SDI_Low();9 X( H+ w. q: s4 H9 P. T* D
- }( U7 Q5 M# h5 F: h9 @, Z s
- com = com << 1;
" m! c6 r" k- I- P - LCD_SCK_Low();$ j' K# Y& Y) P
- LCD_SCK_High();
) ^0 b- y) ]1 G4 W - }
. C3 U$ M& v6 {7 g" z2 L* O2 ` - }
6 X2 v5 O/ ~! K( E# y" p
' ?7 S+ E; g; J; b. l Y- void LCD_WR_DATA8(char da)
* f: U$ P" }" l* C7 p! O4 O - {
8 v- t+ B" Y2 x( i. E5 _7 x - LCD_DC_High();
' n4 O' @ ]9 R& K - LCD_Writ_Bus(da);
2 {$ Y) c) U( `$ B" U, I - }
7 K: l" o7 [4 p& [) f. L+ p2 [4 Z -
- J |, [ K0 F e. ^+ f0 p w - void LCD_WR_DATA(int da)
$ V3 X! `! w* s+ C: y - {
6 D I) B4 O; S7 J - LCD_DC_High();
" e& H X6 O" l6 ]: ] - LCD_Writ_Bus(da>>8);
+ R" Z* @/ G, ]7 p' t, i! o8 a - LCD_Writ_Bus(da);* h/ o) T' r! d3 D
- }
" g9 F1 n. ~: m# W: m/ t - 3 R& a2 d5 V; x" @2 b7 a
- void LCD_WR_REG(char da)
. E0 I t' f+ r; j7 T4 e - {0 o* S, j1 [. x/ ^$ {
- LCD_DC_Low();
4 I. q/ E4 Y0 `1 ?( @6 p - LCD_Writ_Bus(da);
& S, M5 \- k! x& D - }. D/ r& g1 V+ f# a
$ u4 i7 `( i: } ]5 c4 @- void LCD_WR_REG_DATA(int reg,int da). D" V( y& j0 @% h$ v( ^
- {; z7 ^6 X6 _: f* k% C
- LCD_WR_REG(reg);
+ F0 N9 E* F8 f7 |0 `& @ - LCD_WR_DATA(da);
! J" x X2 X8 p; d) l* E. T* _+ Y - }
复制代码 相应的初始化函数为:
0 G! ], a/ ^1 G% a6 r1 Y$ J- void LCDv_Init(void)
) b u/ L6 d/ S+ I3 A3 g$ I - { z# A9 a, o2 W2 A C) b& o
- LCD_REST_Low();1 G5 N; s) s9 ?. [9 g3 w
- HAL_Delay(50);3 @9 k! A2 y! g. d8 F J
- LCD_REST_High();
0 t: O6 U! }7 U$ p5 |0 x$ W - HAL_Delay(50);/ u) V3 y9 A( \# N9 q
-
2 @3 P$ | h! |9 k) M - LCD_WR_REG(0xCF);
" ^3 ?0 e& o; n+ j3 ] - LCD_WR_DATA8(0x00);
' Q4 V7 N" A: F# c4 F: W, A - LCD_WR_DATA8(0xD9);
+ _# P# k. z, z6 m6 T - LCD_WR_DATA8(0X30);
% y; D% D5 L- `3 u r" G5 V -
4 ^) Q" h q+ L! }3 h& Y& u# S - LCD_WR_REG(0xED);
9 E2 z* w% T# Y7 a5 W2 c+ ^ - LCD_WR_DATA8(0x64);
; z$ E/ M( C. ] R - LCD_WR_DATA8(0x03); ! K0 [( Z+ X3 e! C0 r) k, L8 m
- LCD_WR_DATA8(0X12);
/ J& ^- w# e9 S7 S% p! e$ x - LCD_WR_DATA8(0X81);
9 a* E. y7 n W9 v -
- \0 s2 t0 \- }+ I - LCD_WR_REG(0xE8);
) c. U, K) e7 W* F' ~. r% W - LCD_WR_DATA8(0x85);
: e+ s0 w& n0 J - LCD_WR_DATA8(0x10);
9 H0 t6 s4 B" J; _4 C - LCD_WR_DATA8(0x78);. v" O. A; f9 O, B) H
-
9 C$ Y6 x% @; R - LCD_WR_REG(0xCB); + V9 b2 Z3 V7 E6 C( R3 k$ s
- LCD_WR_DATA8(0x39);
- W5 V) N9 S6 \* L1 g - LCD_WR_DATA8(0x2C);
) D2 N3 w4 F: r! @8 { - LCD_WR_DATA8(0x00); % l* y% X7 v( e' o3 v7 b
- LCD_WR_DATA8(0x34);
9 C' ^" j& Y( `& P/ m9 H$ x1 m - LCD_WR_DATA8(0x02);3 S# E2 o& R/ X Q, u
- ' r& i/ W3 U6 e1 _/ v
- LCD_WR_REG(0xF7); ) M1 r3 Y5 `3 w2 H1 C
- LCD_WR_DATA8(0x20);
) h. b) Y; |! T) G& j - ) F6 }6 f/ u0 e4 m( i) h2 G# L1 z) }& o
- LCD_WR_REG(0xEA);
! h% Q( S# N* Y6 V - LCD_WR_DATA8(0x00);
0 J9 k) v) |- c' T, Z: z T - LCD_WR_DATA8(0x00); d% l: q' \, F% ?* i f4 H
- * k b9 t5 [) c: O* [0 f1 Z* B5 W
- LCD_WR_REG(0xC0); //Power control
. ~' K4 I! z. m - LCD_WR_DATA8(0x21); //VRH[5:0]
* c/ N, ^5 M8 s9 I -
: D) Y, h) c ~1 }9 l - LCD_WR_REG(0xC1); //Power control 7 P4 ?5 ?( C: J2 ]$ a
- LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0]
1 x; @( L2 w+ O - 2 f4 F4 b/ `8 E2 \0 h3 X
- LCD_WR_REG(0xC5); //VCM control * S" \( i. @" D( x. Z
- LCD_WR_DATA8(0x32); //3F* n5 O- U9 B3 W8 C
- LCD_WR_DATA8(0x3C); //3C
+ x' _4 ?# i8 N) P -
7 C5 i8 H+ O1 j3 o1 B - LCD_WR_REG(0xC7); //VCM control2 " a! }) W- o3 H( _/ n9 {
- LCD_WR_DATA8(0xC1);: N3 }4 [+ A" `( o( l
- ) Q# C, \! R, n; b/ ^, J+ N! E6 r! M% B
- LCD_WR_REG(0x36); // Memory Access Control , R# r5 D$ E% `+ j5 H
- LCD_WR_DATA8(0x08);1 m4 ^; D n: g: o5 G: J
- " u' T5 Y9 o# d3 p r1 W3 ]
- LCD_WR_REG(0x3A); , r0 N9 n' P% H! Y2 d
- LCD_WR_DATA8(0x55);( F. X) X) w) [, G+ i
- Y' G- N5 G! \7 F: F7 m/ P/ }
- LCD_WR_REG(0xB1); //Ö¡ËÙÂÊ¿ØÖÆ
& t5 u, f Q3 [( I - LCD_WR_DATA8(0x00);/ Y& [0 \! t+ h
- LCD_WR_DATA8(0x18); $ d9 m+ C: n% ~6 t- E, q$ O1 e
-
, |( [, M8 L! Z* F - LCD_WR_REG(0xB6); // Display Function Control
1 ~: J# Z! e9 s: y5 o R7 N. \3 H6 h5 T - LCD_WR_DATA8(0x0A);
2 q& S: [; C _% `1 X - LCD_WR_DATA8(0xA2);
m" v8 q H! V2 z - 6 s: f: H. `4 V9 ~7 K
- LCD_WR_REG(0xF2); // 3Gamma Function Disable
2 `# t9 F, w$ ?" t* w9 ] - LCD_WR_DATA8(0x00); 7 D5 r# p+ i# l' M
-
% n7 D2 R: e& Q9 J - LCD_WR_REG(0x26); //Gamma curve selected
3 A8 J' }, b4 Y$ E - LCD_WR_DATA8(0x01);
/ T0 ]/ t- Q4 n& l( l - ! [8 Y4 I Z& V
- LCD_WR_REG(0xE0); //Set Gamma
, \ i# A8 T% z/ [3 p - LCD_WR_DATA8(0x0F); / }( m" j" r" U; Q
- LCD_WR_DATA8(0x20);
, C \! j! a M - LCD_WR_DATA8(0x1E); ( J( T2 K) }# L5 M: p4 d& C8 p6 p
- LCD_WR_DATA8(0x09);
( m' }" j. f/ w6 S0 a) @4 O - LCD_WR_DATA8(0x12); ; g+ C& Y6 H1 W0 x6 H. F
- LCD_WR_DATA8(0x0B);
d, t9 h" ^( ?7 {6 y2 b( W - LCD_WR_DATA8(0x50); 1 P y) H2 m7 {
- LCD_WR_DATA8(0xBA);
# \' {6 X" D3 l5 A3 y4 | - LCD_WR_DATA8(0x44);
^" m, G. I3 a8 k9 @ - LCD_WR_DATA8(0x09); 8 K; {9 f! s$ K& W' `5 K7 E+ ^
- LCD_WR_DATA8(0x14); * q% ?' O, ?$ ?. i6 ]
- LCD_WR_DATA8(0x05);
o" I9 e/ Y: S+ U% m - LCD_WR_DATA8(0x23);
% \0 @( e) T8 ^; @; R8 n) G - LCD_WR_DATA8(0x21); 3 R: n' d% E+ J, N0 G1 ~
- LCD_WR_DATA8(0x00); 5 Q3 T0 |3 e5 f) V; L+ j+ [! _3 ~: e
- i9 [' O+ D/ M7 U' G7 [+ A
- LCD_WR_REG(0xE1); //Set Gamma 1 {9 L) ~5 B* C; S- p: C
- LCD_WR_DATA8(0x00); 9 a0 P$ ^5 O( |7 Y
- LCD_WR_DATA8(0x19); . H" w f5 w/ w _- E
- LCD_WR_DATA8(0x19);
5 K$ {3 i0 _) G' D0 [5 J" j - LCD_WR_DATA8(0x00);
$ I# l! `7 X0 D- {; o1 S - LCD_WR_DATA8(0x12); $ G4 O! M( ~* O+ q- N. s r
- LCD_WR_DATA8(0x07); # `$ d1 v4 Z2 U" r# k2 [0 ^
- LCD_WR_DATA8(0x2D); ( G' w9 T9 h3 x$ |3 P
- LCD_WR_DATA8(0x28);
: M- x" U9 V3 f4 r6 ~, ~ - LCD_WR_DATA8(0x3F);
" H5 R$ S3 H1 O0 X - LCD_WR_DATA8(0x02);
0 Q. e( K# K. b. ] }. a3 C3 x+ h - LCD_WR_DATA8(0x0A); + ]7 a; @3 l" K. f. L( f
- LCD_WR_DATA8(0x08);
) v7 x2 O b# d6 z$ ] - LCD_WR_DATA8(0x25);
) W1 @2 X+ o) _3 \5 F, k - LCD_WR_DATA8(0x2D);
9 u/ c* V+ i3 g9 e0 }( y - LCD_WR_DATA8(0x0F);
' m8 F4 O/ W' b. H - LCD_WR_REG(0x11); //Exit Sleep
/ A) {9 Y: z% t; q - HAL_Delay(120);
" C1 N. a1 D0 h* ~7 T# Y - LCD_WR_REG(0x29); //display on 0 r% l- p! v& e7 y2 V7 M% P3 N
- LCD_Clear(WHITE); e0 R8 W+ s! @, @) B( ^7 O
- }
复制代码 相应的图片显示函数为:
1 I0 Z! @! q5 C6 l- void show_pic(const unsigned char *p)7 ]/ Z: w; A: x' [7 e
- {4 E( J6 u5 |7 I3 M) ?+ i2 R
- int i,j;: N+ j2 t. u& ]
- unsigned char picH,picL;
2 K) f3 _2 p1 n' H/ V) q; n6 Q1 G - Address_set(0,0,LCD_W-1,LCD_H-1);5 g/ ?5 ?& W6 I+ x; W6 M
- for(i=0;i<240;i++)
5 x& G- m' [0 \% S - {* t: m6 Z0 P/ Q c) p5 F2 c
- for(j=0;j<320;j++)) ]9 V1 R7 T" X0 A: \
- {
2 @5 m' |+ U3 h0 J! _: Y- t - picH=*p++;" d6 H; W" I9 g
- picL=*p++;3 P* g. N n3 G+ { ~9 ]" w& X0 Z
- LCD_WR_DATA8(picH);
4 C. d# _9 m. L2 m* a - LCD_WR_DATA8(picL);- }! c& k- z( x" U0 k1 g4 g5 X
- }
1 E) K. h! P% |. Q3 b# d* C: X: H - }
G& }: H$ b9 b0 i3 L& q# n- }3 | - }
复制代码 实现显示效果的主程序为:
$ j% u1 ]8 C! m3 @) Q- int main(void) // 2.8' TFT OK
3 O1 I) \5 _1 v, J2 c5 ?6 J* A - {
) ]1 V. p M! ^' c3 J N - HAL_Init();
, O$ n5 I$ |- n5 i/ t - /* Configure the system clock to 80 MHz */
6 w+ u6 l2 M2 F8 G: B - SystemClock_Config();
/ D3 a. H+ a, p' M" E- D% p6 |" J, A! { - APP_TFT_init();
+ B" l1 r$ g( ?; b1 X3 o- h$ V - LCDv_Init();
0 A* N8 P# j$ K8 { j0 | - show_pic(gImage_a);0 P$ H5 a7 w# `
- while (1);
0 J- O6 _- ~3 m9 M$ { - }
复制代码 ( b! x/ l9 W& o, c
7 ?( K" f2 \0 k+ d4 J9 I( R8 G: V |
好的