前段时间为参加RT-Thread x STM32 全连接创意创客大赛特意购置一个2.8寸的触摸屏,这次也让它露个脸儿,为社区献上一份祝福!
( S7 P7 P" L: j' p2 J, j0 z. v/ }/ e8 r" P
* l4 T4 J9 w* O. H- U
# v$ j- ]' l) o# o: |. k
2 i& n0 B8 B1 M- A! y* i/ `
" x2 W# P) j$ {5 A为了便于移植,驱动采用I/O口模拟SPI接口通讯。
* p& |5 g6 ~3 R* S显示屏与MCU的连接关系如下:
% y; e( T, ], L7 r! USCK---PC7
; `6 z5 }% p& |2 ISDI--- PB6
; M$ l2 Q' h5 dD/C---PA78 T& \6 k9 J5 b U3 O+ z" B
RST--- PA6
8 c# j v) O: i& i. ~CS ---PA5
" `9 n( ^: v i% WLED--- PA9
, K7 B$ |) f* D7 X/ p
- ]- v+ B7 x: X. B) @9 q$ |8 _0 K/ E) |
输出高低电平的语句定义为:+ }# ?3 d3 L& _; L
#define LCD_CS_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET) // PA5* U7 R1 ~9 `0 S8 w
#define LCD_CS_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET). ?! S$ w2 |9 Q0 Z1 y1 @" V
8 e9 N$ v' x2 G, V#define LCD_REST_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET) // PA6/ H" A. _( e- `- V" l5 s* Q
#define LCD_REST_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET)) b5 u7 G0 p S
# p3 F% W' q+ C8 r; J#define LCD_DC_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET) // PA71 o8 H6 L$ ^0 ^/ a$ [
#define LCD_DC_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET)
) K8 z. V8 _) ?: K% e) K) x) e {$ D9 F. ~+ _% g! z
#define LCD_SDI_High() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET) // PB6
/ p" Q2 Q2 @# t1 B# S$ P; w#define LCD_SDI_Low() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET)
: y& ?" a) S: A: ~& H5 \; k$ v/ F: e8 }+ e
#define LCD_SCK_High() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET) // PC7
" c- D, G& M# m4 `" Q, i$ n#define LCD_SCK_Low() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET)( I8 Q1 o6 c- x C8 {% q- B. f) |4 n
6 T4 H& w$ s# k# A; ^#define LCD_LED_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET) // PA92 P1 Y4 [1 V4 m$ N
$ E; A) q1 p2 b Y; Q, ]( k5 N! x
) S2 c) ~" @) S* b8 r
相关的辅助函数为:
. B: K K" U4 A3 J6 ~3 z- void LCD_Writ_Bus(unsigned char com) 8 x5 l/ H2 J: H- z
- { $ d* q+ a$ O' j
- unsigned char uci;
7 z, F) _6 E% r7 ? - for(uci=0;uci<8;uci++)
t7 t$ ]1 o, u/ v% {( X - {8 s7 U) B% ]1 g5 K
- if(com & 0x80)
6 F8 h/ _/ n1 P5 \4 N - {& s2 H& [$ q; x( Z
- LCD_SDI_High();
8 I5 ^, `7 n* E0 n; r$ @9 O5 F. O - }) ?- s9 }, m* F" D% k8 D6 O
- else( q; w6 f0 o: U1 J9 N
- {9 s' _7 B, }/ F
- LCD_SDI_Low();
/ V3 d. r9 m) u0 @4 @5 ^ - }
3 \4 ~- j7 J, y S, O: p* L - com = com << 1;( D2 S G, T# I: B& r
- LCD_SCK_Low();% C+ Q* U9 l; r6 G7 Z
- LCD_SCK_High();
1 {( G; j' z% n# P: l - }
3 K. q9 Z3 Q8 [7 f/ e% P - }. ` f! B7 g) ^2 S% D8 l
- / {5 h, Z0 M5 F P. `$ E
- void LCD_WR_DATA8(char da)
# X! F% j; r$ F - {3 n( T$ f6 V# h/ g
- LCD_DC_High();4 A$ @5 ]! a% |, `) I1 z
- LCD_Writ_Bus(da);
8 ~: V5 V2 g, w, g; W5 d0 q' g - }
0 ]! [& Y$ o7 f6 q4 P" `8 c, f -
9 M* H' r9 x4 X3 n" f; U+ u - void LCD_WR_DATA(int da)
# B" A- g. P! D) q( a! N, ~$ } - {! I+ N$ Z* `7 }3 g& x
- LCD_DC_High();
, D- N$ q% C9 W- k5 k, j - LCD_Writ_Bus(da>>8);4 b5 Y0 Q% O3 k! Y
- LCD_Writ_Bus(da);! z$ I1 V/ v9 N3 T* d- X' Z
- }
$ y1 Q3 Q s6 U( C+ E3 }/ j+ ~ - 5 o* ]/ ^. W# |5 r' S# ]
- void LCD_WR_REG(char da) 0 c9 N& O3 |! B& O0 S+ p& y
- {
0 u( O/ [9 F# a1 z# z7 n) N - LCD_DC_Low();
& a6 x; L5 e+ L4 A - LCD_Writ_Bus(da);
: Q) W5 n8 c, J3 O$ R. a3 n - }
$ k! C; ^; L' R" k0 l4 g
# t0 p( o$ ]$ k+ ~3 W- void LCD_WR_REG_DATA(int reg,int da)
- a4 z" \( T5 o: J* W5 O9 X0 j - {
; }3 Q5 u7 H9 x8 g4 O$ g5 e8 @- G2 W - LCD_WR_REG(reg);5 W' Z, H& P3 F
- LCD_WR_DATA(da);1 u( D5 \0 J) A. u- x" O' y
- }
复制代码 相应的初始化函数为:
' Z! _6 S& ]% k$ Y3 G) @- void LCDv_Init(void)
1 w1 @/ n- }- g& c2 q - {
: G, s9 S: u2 b) d3 K - LCD_REST_Low();
9 Y D3 @+ P i- A5 k# ] - HAL_Delay(50);, m7 n+ Q, J5 I/ X5 O: }
- LCD_REST_High();4 x5 c- _+ `1 ]) _
- HAL_Delay(50);
$ u. I; c* K6 U- u4 `9 v9 E - % B, {. ^4 r4 h( B* i
- LCD_WR_REG(0xCF); * @) x9 W$ b7 H" J' S- @* ?& m$ s
- LCD_WR_DATA8(0x00);8 U7 K& C0 O, J+ h
- LCD_WR_DATA8(0xD9);
2 M, L4 X# T" N5 s2 n: U3 n' X - LCD_WR_DATA8(0X30);6 F5 y) o; `' p2 {0 W: T$ A
- % U% y; A1 b& f2 T
- LCD_WR_REG(0xED); 7 {4 g7 a. W' |. Q+ a7 A) C
- LCD_WR_DATA8(0x64); & g7 E& ~9 L$ m' @% L( k
- LCD_WR_DATA8(0x03); & }( i# u# [% Y- [- s1 h; N
- LCD_WR_DATA8(0X12);
; f4 w, P& @& K - LCD_WR_DATA8(0X81);5 t3 }& U3 X7 V2 G7 \* X
-
3 B6 u w2 c& j6 r- z I - LCD_WR_REG(0xE8); 9 A+ x& \1 x3 A1 ~7 l8 a
- LCD_WR_DATA8(0x85); * m! J: ~9 F! W
- LCD_WR_DATA8(0x10);
! T& s3 g% r6 d8 f( F8 E - LCD_WR_DATA8(0x78);
6 d, G, b/ q, G0 i9 s z7 ]( I -
& l' G& m2 Q& H4 g. N, C A* T - LCD_WR_REG(0xCB);
: ^9 [6 S6 Z! c; j9 x7 E7 ], C - LCD_WR_DATA8(0x39); 8 M9 _- c. c6 I0 L
- LCD_WR_DATA8(0x2C); * }9 f( H* E0 ^) r; M
- LCD_WR_DATA8(0x00);
8 i$ X, G- J. b) X) F) X - LCD_WR_DATA8(0x34);
3 F# e# X3 ~) R" D ^! O2 q' I - LCD_WR_DATA8(0x02);8 B9 n& n& e. a* }1 D% E$ P
- 6 M+ { M% d' F9 \* Q5 R5 Q4 [' n
- LCD_WR_REG(0xF7);
8 D' P) u+ `( A/ C4 n, Q H- t' j - LCD_WR_DATA8(0x20);
7 R0 X5 d* y% ] ~6 [ -
4 s$ V# C' _6 b4 P - LCD_WR_REG(0xEA);
7 o; ], K' i4 l' a* y# S5 t% R; Y - LCD_WR_DATA8(0x00); * n. x; t9 m. @- b
- LCD_WR_DATA8(0x00);5 ]0 Y" N, H2 c( ]0 U. ~, a
- ! ?5 C( S9 W# c1 o7 ?$ e
- LCD_WR_REG(0xC0); //Power control
/ _, n3 t& G9 S/ C0 e - LCD_WR_DATA8(0x21); //VRH[5:0]
' q5 O* z$ T7 U8 x3 Q& E& d3 j8 C -
* r, k9 X) h, y( l - LCD_WR_REG(0xC1); //Power control
6 M' Y# z3 Y, b' C2 [. d& C: R - LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0]
5 P5 H3 G' H/ ]. Q: n. v - 3 _4 @4 h" q: T0 i" `
- LCD_WR_REG(0xC5); //VCM control - Z/ C1 |9 m `2 \+ a( Q0 j s0 Z
- LCD_WR_DATA8(0x32); //3F! N6 P7 P) E5 R4 ~! |& g, w6 Z' k; T4 Y
- LCD_WR_DATA8(0x3C); //3C) y' H* n/ U" x; @
- 0 A! H+ u6 M; J. ]
- LCD_WR_REG(0xC7); //VCM control2 + y; Z3 X9 V) V8 a
- LCD_WR_DATA8(0xC1);; a- y: d2 Y6 p+ Z
-
9 I' o! u2 I) `& g* e$ y - LCD_WR_REG(0x36); // Memory Access Control ) @0 w2 s1 X" u: X6 x% X. F1 W
- LCD_WR_DATA8(0x08);
; n' L0 N' p: u, ^+ @& `3 X" Y - . h( U2 ~3 c2 l" H
- LCD_WR_REG(0x3A);
; E2 B2 F/ ^5 U - LCD_WR_DATA8(0x55); p" p6 ^) A3 S$ V
- 4 S" g7 n$ [, ?/ @
- LCD_WR_REG(0xB1); //Ö¡ËÙÂÊ¿ØÖÆ# V2 U$ d8 I' n& B
- LCD_WR_DATA8(0x00);
+ A3 @& _( r3 ~* U6 d3 h0 C! p- M, g - LCD_WR_DATA8(0x18);
; I" p$ T, v; _* q1 i$ ^ - ) N( o0 B$ c. Q, w
- LCD_WR_REG(0xB6); // Display Function Control 5 C; F6 Q4 y/ N4 ?. X+ r/ g' D
- LCD_WR_DATA8(0x0A);
3 a$ V' K! D7 v/ |# V5 T - LCD_WR_DATA8(0xA2);
% C: a0 h5 t6 ]! m -
" g+ u, H2 r4 W8 I N - LCD_WR_REG(0xF2); // 3Gamma Function Disable + E& F a6 i/ R, w8 X7 s
- LCD_WR_DATA8(0x00);
" Z" x! h% i) X9 ^* A& q% W/ a -
. w! ^# G# Z1 O' o% J s - LCD_WR_REG(0x26); //Gamma curve selected
5 t8 }' \, {- j8 ? - LCD_WR_DATA8(0x01);
! _* I% L) B" h+ A( R/ Y -
) d n- w1 ?9 f2 T( P7 Y - LCD_WR_REG(0xE0); //Set Gamma
) Z( L5 r6 Z" l4 W. ~ - LCD_WR_DATA8(0x0F);
& t" D+ D# Y9 V) R4 Y* e0 a - LCD_WR_DATA8(0x20); 5 `0 T7 q3 M( H
- LCD_WR_DATA8(0x1E);
, C3 k/ ]: E/ Z) H$ C, A - LCD_WR_DATA8(0x09); + ?) A9 q: J4 }1 j2 O
- LCD_WR_DATA8(0x12);
1 E1 R) d- [! ^! j* y5 r( ^' W - LCD_WR_DATA8(0x0B);
" n x- s, _" I - LCD_WR_DATA8(0x50);
" X2 F8 f" y; _$ Q# A6 D2 Y - LCD_WR_DATA8(0xBA);
}' o# D: y6 x$ o - LCD_WR_DATA8(0x44);
0 t4 \" i! a+ A: Q6 `4 ]. r - LCD_WR_DATA8(0x09);
# b1 u; Z$ ^5 W2 s( W: G* d - LCD_WR_DATA8(0x14);
, X: s) }, \. k3 j& @ - LCD_WR_DATA8(0x05); 3 }) b( f3 A* N% I. w6 \
- LCD_WR_DATA8(0x23);
- u+ W- Q i% v' @$ f - LCD_WR_DATA8(0x21); ( z8 Y! @0 k* g
- LCD_WR_DATA8(0x00);
3 w# J4 ]; @# s' W, V8 N5 n
# j% |6 ?6 k1 |+ ]/ a- LCD_WR_REG(0xE1); //Set Gamma 4 x& v; s3 t0 W* T: ^: y- V
- LCD_WR_DATA8(0x00); # q- ?: H6 J) s5 F U$ A0 s& B8 T# J0 X
- LCD_WR_DATA8(0x19); ( y! J( V6 q( M1 T! [
- LCD_WR_DATA8(0x19);
4 e/ J ^1 x$ Z$ V. V! S/ g! c - LCD_WR_DATA8(0x00);
- Y7 i$ P1 x' K9 A$ T - LCD_WR_DATA8(0x12);
3 ~0 G- p* C: y0 d$ V& z - LCD_WR_DATA8(0x07); , x! @7 x- I4 ]1 j
- LCD_WR_DATA8(0x2D); 5 N) `0 J/ F. ]- [
- LCD_WR_DATA8(0x28);
2 t8 Y0 ?" c# V, e/ V. V# M( i - LCD_WR_DATA8(0x3F);
* g! F/ s2 Z% | - LCD_WR_DATA8(0x02); 7 {& s) a/ `8 K h
- LCD_WR_DATA8(0x0A); 5 z1 p! s1 J2 c ~' |' g
- LCD_WR_DATA8(0x08); _' }) P+ \ V9 ~; d: ?
- LCD_WR_DATA8(0x25); ( O, D4 }% T- O" q$ B
- LCD_WR_DATA8(0x2D);
8 ~2 N M. k# h - LCD_WR_DATA8(0x0F);- a0 _$ M6 I) a6 Y
- LCD_WR_REG(0x11); //Exit Sleep0 t6 i& A/ z8 \& `5 r j2 U2 Z
- HAL_Delay(120);
4 n0 U0 i1 g) t% h- B - LCD_WR_REG(0x29); //display on * G5 ]0 |. Z, a$ x( g
- LCD_Clear(WHITE);
, d# X2 j% ]) Q' v- X9 ]8 h% M; ^ - }
复制代码 相应的图片显示函数为:
: y, A- D) X: F- void show_pic(const unsigned char *p)
3 h2 m; J. x% F9 V4 w4 z - {
' u7 W1 {+ v" r D5 Z+ u9 k, P - int i,j;- p+ Y M. u' c" Z
- unsigned char picH,picL;
2 U4 P5 @8 M/ p% W - Address_set(0,0,LCD_W-1,LCD_H-1);
+ w" C/ P( q4 y. y5 g! t, M2 s - for(i=0;i<240;i++)7 r0 _- u6 [ {& o
- {
) n5 J! X. B3 Q7 y' T. l, L - for(j=0;j<320;j++)
6 Z4 p$ X, \ q2 D6 S. _ - {
7 c% G; y( p6 u( [4 Y8 a5 R - picH=*p++;" A# i4 ]4 d/ ], L1 f
- picL=*p++;
2 w% n' z# j- q6 [) z - LCD_WR_DATA8(picH);3 s9 l6 S( ^4 ? H* M1 B' J) _6 W9 E
- LCD_WR_DATA8(picL);& x0 T, y) U8 m, y7 @
- }( P. @( a4 x; o u8 _
- }
2 T1 c. ~6 ^ k: U! \* ` - }
复制代码 实现显示效果的主程序为:
) G0 p. O' g, i p- int main(void) // 2.8' TFT OK
+ e" c4 l! ~& H, Q - {
3 s: [4 {( H" v - HAL_Init();) V0 u& v, [2 n! S+ x! Q" g- G- w
- /* Configure the system clock to 80 MHz */
" R \, `. |3 z( D/ {+ i; m - SystemClock_Config();
% R6 `+ T$ L0 V3 R8 B+ O - APP_TFT_init();# a2 e. q) q5 ~+ d7 N* p6 u
- LCDv_Init();- P1 s& I, L1 N$ \: D4 k
- show_pic(gImage_a);$ L6 u2 P: {# W* ]8 Z
- while (1);
8 K- v2 N8 e# x6 {- W ` - }
复制代码 0 W& g. e r: k$ e! \
% @6 D7 R* a3 N/ J8 x" A2 Y# P |
好的