前段时间为参加RT-Thread x STM32 全连接创意创客大赛特意购置一个2.8寸的触摸屏,这次也让它露个脸儿,为社区献上一份祝福!( L9 I- w" c2 S
e5 L. z8 H$ v/ I! c
$ ]7 _% [) `, n; ~: p+ n
# S! e6 z% i# r* a$ H4 Q
4 I) Z; [( f/ x! V4 U
, ~: v* Z" j! Y$ m为了便于移植,驱动采用I/O口模拟SPI接口通讯。
5 B8 ` W. _0 m/ _8 \% A. e显示屏与MCU的连接关系如下:
' M1 w; W% L4 KSCK---PC7
7 Q9 b) V" w) W$ O& VSDI--- PB60 z5 d: ?; u& E
D/C---PA73 D9 k) C8 }* l4 L
RST--- PA6) W9 N l& R: s1 @2 e* Q7 J- j
CS ---PA5) |* q! w7 }, N
LED--- PA98 c, B% P* A& M/ f' J- r$ t
6 N1 \% F% o6 e7 A3 G
7 g: T5 ]: ?! @
输出高低电平的语句定义为:
8 t( Y# w. c; o+ O- r$ _#define LCD_CS_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET) // PA5* W6 ^5 |; R8 Z! L1 [* N! j7 V" {* J
#define LCD_CS_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET)
2 ^1 C* X* T. T* Q! f- u' a2 Z+ b* M; q! C3 S( F
#define LCD_REST_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET) // PA6
2 n& M$ G; ?& u#define LCD_REST_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET)4 j5 F7 X* f- @5 y
$ C3 [# z7 n. Y/ D* W#define LCD_DC_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET) // PA7
. _; V' m2 A3 l; c6 ~( ~#define LCD_DC_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET)
: `4 S4 D, ~2 ]& L8 O; g- W; \
: y. z$ L. Q" T& c+ v#define LCD_SDI_High() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET) // PB6
5 t4 y' G4 e( C#define LCD_SDI_Low() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET)# n" m1 u. O+ S1 a6 Q6 J
7 u6 x9 i& m+ J$ H H/ ]% N6 x
#define LCD_SCK_High() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET) // PC7
6 S! X! X q. o1 ~4 j#define LCD_SCK_Low() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET)' Z- d$ H- g& ^
7 q4 \8 p" E7 q' N8 K. Y#define LCD_LED_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET) // PA9
6 Z3 C. b& O* ?/ z/ e% G; W& Q
! d8 q; u5 C7 Y2 R, J( L! t z- G) N
相关的辅助函数为:
. p) e7 x; S$ _ k1 E" q- void LCD_Writ_Bus(unsigned char com)
9 D' q1 f* g* b m; e - { - Q2 V0 X% N# n1 j
- unsigned char uci;, y4 }* ]4 o# |" S& ^7 O1 M4 G
- for(uci=0;uci<8;uci++)3 D J. e2 c9 T. J V: @9 @
- {
- S' m6 {" k8 _7 K - if(com & 0x80)) i6 f1 _; E' Z! I5 {$ c. T
- {& V9 I7 g2 m" s0 h7 h" V4 L( R
- LCD_SDI_High();
5 P* q7 m' x5 w ^" ^ - }
, m# W, V6 Y0 _- k& @) O9 m - else6 r2 t; W/ _! }- w, F, q% q, r
- {
% }. g7 a* t, W4 e& m9 L - LCD_SDI_Low();9 j6 r% d9 [( _; z/ g. N2 D2 x
- }
3 _1 @1 X; \: o% t( T8 c4 r - com = com << 1;; v% B& y! s4 @1 a' G( \7 O* w
- LCD_SCK_Low();# X( C, r/ l% Q9 t
- LCD_SCK_High();: Y; E. Q7 ~' k4 X: d6 U
- } / N* h3 J5 @3 J6 l( x/ o8 x. \
- }
0 i& e+ M5 m5 I' l0 U4 q
* [/ a) z" w8 o$ I, r8 @8 R- void LCD_WR_DATA8(char da) # v" a) ^) ~% ]- G1 I0 @% W
- {/ K U6 X$ s: J& {7 A& |
- LCD_DC_High();7 G2 {7 e8 r1 k! F0 s" W
- LCD_Writ_Bus(da);1 p d" x1 }* {' {; N; z
- }
' ~; T* ]$ e) b! |2 J2 n3 R( _2 W! k; ? -
0 ]9 P0 V3 M1 t! K" [& d - void LCD_WR_DATA(int da)
6 E V! L) \, g; F( O- j2 }6 O - {( N! C4 Z* n9 i
- LCD_DC_High(); W. W& ?- V* }& {3 J8 `
- LCD_Writ_Bus(da>>8);
3 G- n; Y; O9 r6 h c2 A - LCD_Writ_Bus(da);
3 f) \1 u' I x$ R4 X6 Z4 B - }
4 L/ R" R" P& \7 @9 B# A6 H h - ; c" @3 `, n& |4 W& Z
- void LCD_WR_REG(char da) . t! ~5 x9 I3 i9 c% O$ z3 B9 {
- {
( s% ^) n& \0 A6 Q* F3 j/ r' Z! \ - LCD_DC_Low();
8 i$ p% M, U7 a6 Q5 L( n, | - LCD_Writ_Bus(da);
. ~- E0 V7 i! F7 @* [1 x5 L - }8 y T2 @$ l: R( |1 R& c& L
- 9 F; o: P# P& @4 J2 v/ _# E
- void LCD_WR_REG_DATA(int reg,int da)& U5 s: W! l7 f% G0 ^
- {
" P- K$ I! }* J$ y+ A0 [ - LCD_WR_REG(reg);
$ w* j) g- e( U: y& g - LCD_WR_DATA(da);# K% n7 ? {# ?8 q8 [) K
- }
复制代码 相应的初始化函数为:
( l/ c6 v, s2 ]* w# b- void LCDv_Init(void)6 }' n( S/ r1 Q, P3 F' [
- { % H5 J- j/ \0 j
- LCD_REST_Low(); O3 Z2 v' {$ A$ m+ m! X
- HAL_Delay(50);
$ `" k7 \+ \2 c - LCD_REST_High();
' @4 B/ ], \: F, z5 m8 S - HAL_Delay(50);4 ^$ i( h+ G$ Z6 z
-
1 s3 A+ h- q) K) } - LCD_WR_REG(0xCF);
$ s j; E, M6 @" O3 | - LCD_WR_DATA8(0x00);" E, X3 M5 {- K# B
- LCD_WR_DATA8(0xD9);
& w& D$ e! [+ Z" x8 ^& L7 g - LCD_WR_DATA8(0X30);
, \0 P: g6 p, g9 G) N% Y% [( M& \ - 2 f2 C. D- {0 L- K* ^
- LCD_WR_REG(0xED); ) W( m( U! p5 j, |! ^" |
- LCD_WR_DATA8(0x64); 4 B+ O& e$ R' y" K( N5 W2 b
- LCD_WR_DATA8(0x03);
5 z! w: H$ t! l - LCD_WR_DATA8(0X12);
' O/ t& t- \2 ]0 x' { D - LCD_WR_DATA8(0X81);+ W* x; p# l. Y$ I ?( K% h
- + F- y# w& K$ L. [8 d8 S
- LCD_WR_REG(0xE8); / Z$ v" B2 r5 `& v
- LCD_WR_DATA8(0x85);
2 k9 J/ L6 \# T# u0 Z# n - LCD_WR_DATA8(0x10);
2 T! N9 F1 f4 d; H; L$ K - LCD_WR_DATA8(0x78);! [9 }2 _# L6 S. D" _! ?
-
2 a- \5 l. } z; ]3 l! _; ^) x8 U - LCD_WR_REG(0xCB); ) T* ~2 n# ~) x4 c& ?+ B
- LCD_WR_DATA8(0x39); / A% e; ~, j6 o: j2 \7 f
- LCD_WR_DATA8(0x2C);
, j( g, @; s# ~! Y- E - LCD_WR_DATA8(0x00); ) }9 y) L& ~9 ~4 M1 a: }8 p
- LCD_WR_DATA8(0x34); . U. N6 l0 c6 q$ r9 n. W) ]
- LCD_WR_DATA8(0x02);
, C) N( C* K. p1 B- M -
8 Q( E. v" {4 b) m' a - LCD_WR_REG(0xF7); % E* m) C+ D! P( l( v
- LCD_WR_DATA8(0x20);. L4 t3 `) y5 `+ v' y2 s. ~; }* z' W% w
- ! s/ h+ s; {/ m% ^9 M3 t
- LCD_WR_REG(0xEA);- }; j/ ~1 K! S/ |: m' r5 R0 h# }2 U% }
- LCD_WR_DATA8(0x00); 3 v. z8 K- K# i8 @$ h* }" }) D
- LCD_WR_DATA8(0x00);9 l! g6 h* t; K$ m+ x
- " `3 T! @ q/ m, U5 v5 ]* Y
- LCD_WR_REG(0xC0); //Power control ! ?2 r5 u% d3 F1 R) n. d b
- LCD_WR_DATA8(0x21); //VRH[5:0]
7 `1 E& N5 j) d4 {2 f -
. H* I# R0 ?: m2 j2 q# ?9 ?0 l - LCD_WR_REG(0xC1); //Power control
: B% K: }- W( a2 } - LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0]+ h0 j# G9 c& U2 A- I: x# H- G# x
- " R4 T0 p) {5 e% R" g
- LCD_WR_REG(0xC5); //VCM control
! E2 `& G1 n) O7 o# ~ - LCD_WR_DATA8(0x32); //3F
% W, ^/ Y8 [- ~- o3 w' z& @& X. T - LCD_WR_DATA8(0x3C); //3C$ |1 H, l b! ~) D' W, Z# R: G
-
% N$ s( V- X; V: |0 O - LCD_WR_REG(0xC7); //VCM control2 % D+ h4 M$ M v+ F
- LCD_WR_DATA8(0xC1);: f( J! k9 I% g4 _, y" F' E1 x% [
-
; h! x* Z2 ]6 n - LCD_WR_REG(0x36); // Memory Access Control 5 P% [% p* ]8 B7 L
- LCD_WR_DATA8(0x08);
& l: E2 C8 b5 ]4 v3 l! [ - # c k6 M. M4 g+ C
- LCD_WR_REG(0x3A);
7 I% {' w5 j2 w R - LCD_WR_DATA8(0x55);% S( w$ V9 O8 d0 [: y- {* |
- ' f0 U: m h* W! C+ q w( w7 n
- LCD_WR_REG(0xB1); //Ö¡ËÙÂÊ¿ØÖÆ% E3 @- _# ~; ~4 O" Z: _, y. t& E* z
- LCD_WR_DATA8(0x00);7 e% l. G2 E8 x; ~
- LCD_WR_DATA8(0x18);
7 M1 a, S. e8 O* b0 A; x/ k - 1 n/ y# d- K6 b& t: o
- LCD_WR_REG(0xB6); // Display Function Control " x; d1 ^# e& f! E; i6 b
- LCD_WR_DATA8(0x0A); + J0 Q+ p/ `% k3 l! L! m
- LCD_WR_DATA8(0xA2); P3 B% D+ Z, |3 l
-
4 `1 g, F4 n/ A+ ~ - LCD_WR_REG(0xF2); // 3Gamma Function Disable
4 z- u' g6 g7 i: {$ M6 C - LCD_WR_DATA8(0x00); " l; q4 t# [3 _4 F/ h
-
* b# G% f( `( N2 s5 _" T - LCD_WR_REG(0x26); //Gamma curve selected : V6 j, C) R8 ~' R' A9 u
- LCD_WR_DATA8(0x01);& L) t6 ^ l1 A9 r) w
-
# E+ D. `' `+ N1 O y - LCD_WR_REG(0xE0); //Set Gamma . ^% C/ X5 a3 v4 _
- LCD_WR_DATA8(0x0F);
& W' o# q$ {' _: S - LCD_WR_DATA8(0x20);
* |8 [! t& v5 U, W - LCD_WR_DATA8(0x1E); : |" J8 }9 e7 L" W4 l
- LCD_WR_DATA8(0x09);
" K( w! ]7 M% C6 Z% F5 l+ x7 S0 |4 }$ l - LCD_WR_DATA8(0x12); % e6 b6 M- X9 E2 \& Y
- LCD_WR_DATA8(0x0B); 0 ]! r6 ?1 j/ Q* W
- LCD_WR_DATA8(0x50); 4 h* g# j% V- f& ?1 D! B3 i
- LCD_WR_DATA8(0xBA);
) y' y5 d6 V4 c5 } - LCD_WR_DATA8(0x44); I8 q* p6 }. ?+ n& o' K
- LCD_WR_DATA8(0x09); # r# u2 y/ s- C5 X3 p2 e
- LCD_WR_DATA8(0x14);
% N9 M8 a2 C2 c/ Z - LCD_WR_DATA8(0x05);
/ R0 i J0 Q" {7 e* x6 |. \# T0 G - LCD_WR_DATA8(0x23);
! L9 J3 u4 @; o6 G/ T - LCD_WR_DATA8(0x21);
" l8 h' ^7 L, p6 i, E - LCD_WR_DATA8(0x00); 7 S! e9 [# X, G8 S
9 Q& Z9 j3 ^4 z- LCD_WR_REG(0xE1); //Set Gamma & w* s9 q! f/ Y( K" a8 Q3 b
- LCD_WR_DATA8(0x00);
! b! C& J# M& h( |4 \- E - LCD_WR_DATA8(0x19);
* B0 @; F, l4 ? E- Q - LCD_WR_DATA8(0x19); 7 @/ y6 q; `$ U5 u7 m* J
- LCD_WR_DATA8(0x00);
% l* k/ T+ I: N9 |: }& e - LCD_WR_DATA8(0x12); 6 y( I; P7 h$ l, Q, z
- LCD_WR_DATA8(0x07);
* [2 g# _: R/ ~2 n3 y1 [* S4 V# g - LCD_WR_DATA8(0x2D);
" D- \0 w+ {( T- Z3 O- F0 d - LCD_WR_DATA8(0x28); 5 [; u- e; p/ E6 } ?. k3 |
- LCD_WR_DATA8(0x3F);
* `% u3 X) u# q - LCD_WR_DATA8(0x02);
) h% h, |# c e. S7 i& L' b - LCD_WR_DATA8(0x0A);
7 J( T. n) Y% Y6 @3 F" V& A - LCD_WR_DATA8(0x08); - Q1 {+ ]8 q6 h5 X* a
- LCD_WR_DATA8(0x25); 9 D* [ A9 [' b* |
- LCD_WR_DATA8(0x2D);
" E' T8 S7 F% z; G5 k( L( ~ - LCD_WR_DATA8(0x0F);
% w$ r3 B, J& x! p- u8 H0 F - LCD_WR_REG(0x11); //Exit Sleep
8 l0 \9 I! [6 ~! x( T0 f - HAL_Delay(120);, X! }1 s: h, _" b2 I. x/ k
- LCD_WR_REG(0x29); //display on 2 G: S1 r3 W" o2 ~' S# X
- LCD_Clear(WHITE);; f' C+ J2 C+ ~2 X2 I0 v
- }
复制代码 相应的图片显示函数为:$ i' `- H# l) A5 x
- void show_pic(const unsigned char *p) i1 e4 n2 A& ~: e
- {
9 q8 k( x" B( z( a9 i' g( d - int i,j;
; g4 A/ F) q Z! k - unsigned char picH,picL; ^* P3 @$ ]1 e5 b& M& c2 Z
- Address_set(0,0,LCD_W-1,LCD_H-1);
3 K3 \0 f6 r' e6 n0 X+ q& f - for(i=0;i<240;i++)! j4 k* A0 m4 s6 E& P6 q/ c
- {
, Q" f" L0 [0 _2 P" ` - for(j=0;j<320;j++)" U- k; n* p) G+ `$ J
- {: x( k8 B. s) p f" ?" h8 ^# F6 d
- picH=*p++;8 ?/ p! Z j8 i1 B: i
- picL=*p++;
1 j& A9 Z# F. W7 S2 Q2 U - LCD_WR_DATA8(picH);
7 h$ F# A# P: \. D% B - LCD_WR_DATA8(picL);+ R) L' a1 M9 X% T8 x" p! V
- }
5 {5 v% B! |# \) O4 O - }( J5 ^% C% @* f# [( K. E. V( G1 ^
- }
复制代码 实现显示效果的主程序为:
( z/ P# |* U* X- int main(void) // 2.8' TFT OK
) a3 Z2 w0 C C1 l/ @9 Q& ~, M - {
/ g7 r: r7 w% j. O! S) A - HAL_Init();3 p# _4 `+ K5 I+ O% F
- /* Configure the system clock to 80 MHz */
0 D9 s6 x* Y. T& M$ o - SystemClock_Config();
, g6 ]0 `- r) h) D/ ? - APP_TFT_init();
6 c: k$ T+ Z0 I" c+ e8 _5 y0 L - LCDv_Init();
* M& a6 ]: I5 k0 u0 @) ?, j' T4 N' b1 H - show_pic(gImage_a);
0 w6 d: x6 | j; j - while (1);
" k. l' ~% X5 j( z" T5 h - }
复制代码 - d: R, A2 S# p3 K
; C* w- i9 N8 R |
好的