前段时间为参加RT-Thread x STM32 全连接创意创客大赛特意购置一个2.8寸的触摸屏,这次也让它露个脸儿,为社区献上一份祝福!
5 O m' V4 Y* K5 }
( C, \' T' \7 y
( z2 W+ V# ^: h6 f; U0 |) e1 }6 r
/ d5 p/ C# U4 O2 {8 R2 E9 D( J7 M7 _6 S
# x3 ^; X8 d4 b* D- s0 \2 v+ m! S! A& C1 N# ] s Y7 a$ L
为了便于移植,驱动采用I/O口模拟SPI接口通讯。
2 F8 I. X8 P1 X3 S. e显示屏与MCU的连接关系如下:: B# b% p! d# v/ _
SCK---PC7
0 S7 I" r. e( Z' J# ISDI--- PB6; ]% e9 m' v4 @
D/C---PA7' B( e) W" y) o. u( a
RST--- PA6
; }, \+ `' N) U; Y0 _' ECS ---PA5
1 Y/ i+ @6 J* W1 f1 gLED--- PA9; t# \4 Y) t9 d5 o$ p% R
8 m. m9 u" k; T* b/ r
, I4 u. R( T3 |5 O! Q0 t输出高低电平的语句定义为:
* t/ ^9 k+ F3 \" Q% a#define LCD_CS_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET) // PA5
( x+ h0 }/ j. l; n6 V3 Y5 }3 Z- F#define LCD_CS_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET)
; T, H5 y$ |. J) p* ?5 M7 ~( O" Q
#define LCD_REST_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET) // PA6
! K% _* |5 c9 S, X# y9 O#define LCD_REST_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET)
6 U) ]% @0 |2 c% F" s$ b# m# N/ x
#define LCD_DC_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET) // PA72 u9 y% W! M# \' k R# A
#define LCD_DC_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET)5 s, u: `/ F% X) Q9 m' r
& b1 w! j; f7 v% E#define LCD_SDI_High() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET) // PB6
6 K" F# ^% U3 k* b# o5 `) x#define LCD_SDI_Low() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET)
0 i* P8 ~" J; p
: g9 m2 ^4 @1 g9 b2 f+ d! ~1 O#define LCD_SCK_High() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET) // PC7
$ P) h/ N% t% i& F#define LCD_SCK_Low() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET)+ ?8 y& T" L8 j: I+ b- r- g: L
$ K7 }6 L/ ]7 g+ a6 k! H#define LCD_LED_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET) // PA9
7 s: X' R- ?7 ]! c' i$ P2 _3 C8 g" W) y1 _* d; z# M
+ r$ }+ \$ ~$ G1 F8 w+ @# L相关的辅助函数为:
6 g8 t2 f- W7 _1 n3 t, Z0 }- void LCD_Writ_Bus(unsigned char com) # {1 ^+ c1 J. W- j
- {
" `2 |/ C# Q R6 p! ~* d% z - unsigned char uci; [, P% }" _$ `. W8 W
- for(uci=0;uci<8;uci++)
5 N- @2 A- B C: ]9 D5 F - {
! p0 I7 o: L0 G5 G - if(com & 0x80)3 @! V) ^; E+ ?7 _& B3 p$ F
- {5 S7 R) ?8 u, x- \/ o5 e- n
- LCD_SDI_High();
2 W+ O4 J- \9 p. v4 s7 e/ D( ~# p - } x& @& {" e/ r* @5 c7 j: [
- else8 k" W( A0 P& q8 Q
- {0 Q6 g6 ?1 I2 P) o& {0 |/ E
- LCD_SDI_Low();0 I [# a, T7 c
- }
& C* X/ U, z2 N5 l! v - com = com << 1;% ^0 b; v% ?3 z
- LCD_SCK_Low();
9 }9 G1 ?) u% w! q' m0 t5 q# q - LCD_SCK_High();/ d9 x" n( k* J
- } 0 o3 E; u5 n& Z+ n% n
- }4 ?4 Y4 r! O! i: T
- 9 f) U+ a' v A& l: l
- void LCD_WR_DATA8(char da)
/ a% d! ^' r/ \( v8 B, b - {
* g0 k P9 S& {) y! _ - LCD_DC_High();- N. T4 |" s s( I, F
- LCD_Writ_Bus(da);
" E# I6 }$ V7 H# |& d) c- l# M& ^0 I9 U7 @ - }
+ w$ ^/ C2 w. R( _* Y -
! p/ Z8 N3 p0 Y# R/ ] - void LCD_WR_DATA(int da)" T1 m' o, f3 V# {) q5 [0 b" P4 E
- {/ @2 D2 B! f6 [/ o# A
- LCD_DC_High();4 J8 t2 W( w0 K5 z
- LCD_Writ_Bus(da>>8);* f$ F2 V) ]/ N$ G
- LCD_Writ_Bus(da);, O' T( \3 c1 ~8 h1 i* N2 |
- }
, e) G2 s. E; D2 ^/ I/ g - * b' `7 d9 b4 [( z! g7 W j) D
- void LCD_WR_REG(char da)
7 S* O) z* M; ]; _. { - {& F* v. e, r3 @+ `) s
- LCD_DC_Low();1 Q1 t& V7 ^; c K7 R6 D1 d- J9 d
- LCD_Writ_Bus(da);
0 ], }4 C1 E3 A' g9 J - }
' X& Y0 J. s& P( } - # [0 h# E! V( | t( S# Z/ m, l
- void LCD_WR_REG_DATA(int reg,int da)! u: {8 v" ?: [* A, S. `
- {
/ F7 l2 D: y p. P* M - LCD_WR_REG(reg);
' U8 t* [! [9 E& X8 }1 z - LCD_WR_DATA(da);* \+ \) \, E$ r1 O( b3 l: Q2 K }
- }
复制代码 相应的初始化函数为:
/ }& }2 q( P! y9 o& \. G; R- _- void LCDv_Init(void)
: X! H7 C% p/ e, C) E; ~& [ - { ; U; m0 c$ E, z
- LCD_REST_Low();
( U i9 T9 d6 a. C - HAL_Delay(50);
6 N) v+ L2 [/ p0 V - LCD_REST_High();; O" n# }& \4 j
- HAL_Delay(50);
# v" h6 k& x {: p d9 [ -
$ H+ D1 y r" k8 z/ C4 ~4 P - LCD_WR_REG(0xCF); ) Y. z: `8 a2 E+ m
- LCD_WR_DATA8(0x00);" `6 v8 b5 C }8 Z! w& [* p, ^
- LCD_WR_DATA8(0xD9);
, J) j2 \# f6 F2 G - LCD_WR_DATA8(0X30);
' C1 o3 r* A8 D - / k! w* i3 R; o5 _/ s
- LCD_WR_REG(0xED); 3 F+ v/ e- \' ^$ I+ A# C
- LCD_WR_DATA8(0x64);
8 d# g4 X( q( b - LCD_WR_DATA8(0x03);
0 G; G( Y! z- l; u7 B8 r& q& c% ^ - LCD_WR_DATA8(0X12); : U: j4 a7 I7 C- s
- LCD_WR_DATA8(0X81);
" U+ B1 C/ N7 z2 e -
6 ^/ c! }3 ?* h: \9 R& W6 E6 g - LCD_WR_REG(0xE8);
+ ^* H- Y& S! Y - LCD_WR_DATA8(0x85);
" U9 z. w/ R0 q3 y' k8 V5 U - LCD_WR_DATA8(0x10);
2 i1 W( E" q( u2 Y& Z0 X2 I - LCD_WR_DATA8(0x78);% S/ q- t4 D1 _5 b
- 8 i) m, U, H1 s: I$ Y. ?7 J M8 N
- LCD_WR_REG(0xCB); & g m# e: L7 ?- E* c: u8 o
- LCD_WR_DATA8(0x39); & w3 H1 g# A P$ Q
- LCD_WR_DATA8(0x2C); 8 I& u4 p5 s3 }0 Z& y0 i
- LCD_WR_DATA8(0x00);
# ], P/ c. p( g' J9 T9 W* z2 i - LCD_WR_DATA8(0x34);
! V v+ I* s% z& n4 [ - LCD_WR_DATA8(0x02);
$ [3 E8 e" r ^$ B, Z3 e$ ~/ C/ D - 8 w; A( e% S# V0 h3 p* [ E7 p
- LCD_WR_REG(0xF7); / T2 q* W, w! Y3 j
- LCD_WR_DATA8(0x20);
0 }5 I; ^* W7 Y5 Q" W2 v -
/ m* ?" T( S2 u - LCD_WR_REG(0xEA);2 t6 Z) O9 }5 [* I1 _ S7 d, t
- LCD_WR_DATA8(0x00); . U3 X1 c2 J( a: `9 L1 q1 A
- LCD_WR_DATA8(0x00);# l0 w; R% I* ?
- + g5 e9 Y8 y* }6 b" o0 k
- LCD_WR_REG(0xC0); //Power control , T8 K' H1 _5 y9 ^% {" E; X
- LCD_WR_DATA8(0x21); //VRH[5:0] 0 x4 y2 D* O9 E! E) H' y( r: h
- 4 @. B( r* y7 M2 ?! `. |
- LCD_WR_REG(0xC1); //Power control
9 h# ~3 V# H$ U7 I" k! ~ - LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0]9 L) Q8 t! }- g# O5 K
- ; c9 t% M9 y3 P8 T& w& U
- LCD_WR_REG(0xC5); //VCM control
& @8 b( t& @4 p/ X2 I - LCD_WR_DATA8(0x32); //3F
$ y! q8 R* Z3 @. h) s5 T& J) K3 S - LCD_WR_DATA8(0x3C); //3C8 o5 R, @5 `' L" Z/ \. {
- # S, p) t! `8 k1 _
- LCD_WR_REG(0xC7); //VCM control2 - }' r, y4 ^ w
- LCD_WR_DATA8(0xC1);
& p8 j, m4 @) ? - ' C) V) x1 @1 y. e. M) F, `; G
- LCD_WR_REG(0x36); // Memory Access Control
: j8 a i" q5 J, c' X. a - LCD_WR_DATA8(0x08);0 E; D* v9 G3 B4 P, m/ }/ F2 m
- $ P3 E, d1 x( ^' u1 ^3 p2 J
- LCD_WR_REG(0x3A);
2 i! b2 y1 Z" ^4 f$ x - LCD_WR_DATA8(0x55);
; P3 i- `, E( Y/ y4 @* y4 y2 K& q9 P - y# P& c! u. T% B: ?$ c# V
- LCD_WR_REG(0xB1); //Ö¡ËÙÂÊ¿ØÖÆ" M8 z x' |& t' ^2 C
- LCD_WR_DATA8(0x00);
: Y: h$ [. H: L, B4 h - LCD_WR_DATA8(0x18);
+ V& b) X0 x8 C: {, `" N - : ?7 d; m( r* K7 o" q4 U$ l6 L
- LCD_WR_REG(0xB6); // Display Function Control
" }9 w4 l' O4 T( |; r0 y2 ` - LCD_WR_DATA8(0x0A); , M) V4 \: V. g6 j
- LCD_WR_DATA8(0xA2);* B8 l8 c8 p# \$ x6 q- S
-
& B+ x O( J- E" |. K6 V - LCD_WR_REG(0xF2); // 3Gamma Function Disable
, h: ~% ?6 F6 c& Z K) x7 t0 R* p - LCD_WR_DATA8(0x00); + \; Y* u) x; u, Z& i* [
- ; M$ [* g% t" C! W. Q7 t3 |' R
- LCD_WR_REG(0x26); //Gamma curve selected 3 _ ]! r' y3 f7 _8 a7 M
- LCD_WR_DATA8(0x01);
( u" b3 H4 w5 r$ u4 R( ?* V9 S -
6 {3 x) v2 u$ B& I# ` - LCD_WR_REG(0xE0); //Set Gamma
$ @- Z Q" F) b( g& m) o. K; i z - LCD_WR_DATA8(0x0F);
7 \; v: M4 g" o4 ^7 q3 a. X w9 [: n. h - LCD_WR_DATA8(0x20); ( s: [; U+ ^: Z! @0 {+ k
- LCD_WR_DATA8(0x1E); + I& ?8 r$ A! v) e. s# N2 _
- LCD_WR_DATA8(0x09); ) o K" V5 a5 v1 d4 V; |
- LCD_WR_DATA8(0x12); ; p7 x- ?0 |; c2 s+ u) M
- LCD_WR_DATA8(0x0B); ; m0 V5 f5 v5 R T7 |' I% O7 Y! {3 C4 \
- LCD_WR_DATA8(0x50);
^$ c* s4 p( T: ^3 j - LCD_WR_DATA8(0xBA);
% L' T- m) D; k: G+ { - LCD_WR_DATA8(0x44);
4 H# V3 _" ?2 K" ]$ `% [2 p - LCD_WR_DATA8(0x09);
7 L3 V) |2 {7 e - LCD_WR_DATA8(0x14); ' p1 t& H% r& S5 \* ^' c% x
- LCD_WR_DATA8(0x05);
3 s' R! k5 ~3 d9 G" y% f - LCD_WR_DATA8(0x23); ( i9 ]- d0 c* f: Q* d
- LCD_WR_DATA8(0x21);
! m0 c" ^3 F$ U4 k; S/ I: R, \ - LCD_WR_DATA8(0x00);
% Y2 p5 s) }( o+ S- f
( S& _/ }' z9 i: w- i- LCD_WR_REG(0xE1); //Set Gamma
/ I- N" B+ j! y% ?2 H6 U, [ - LCD_WR_DATA8(0x00); + z' n0 e8 ~% B
- LCD_WR_DATA8(0x19);
! U4 [% s1 A; q! z5 w5 M - LCD_WR_DATA8(0x19); 2 r7 z% H9 M3 y& f, I; Z K
- LCD_WR_DATA8(0x00);
, E# t/ ^- c" l6 v0 Z! J2 x - LCD_WR_DATA8(0x12);
9 n0 ^. C! T: o. [7 W5 A* G - LCD_WR_DATA8(0x07); 8 n( ~) r/ S( ] j: h* V5 a$ z; p
- LCD_WR_DATA8(0x2D); 7 h( B3 ~4 E& H2 ~' X5 {! }
- LCD_WR_DATA8(0x28);
* q7 T" Z8 @& R2 e# I- e8 ~ - LCD_WR_DATA8(0x3F); . ~- K* l+ F3 u( b9 O7 l5 D; T' V; K: b" g
- LCD_WR_DATA8(0x02);
, O8 ?: N! k5 Q6 J a - LCD_WR_DATA8(0x0A); ' Q% F5 m! h9 V6 w# j
- LCD_WR_DATA8(0x08);
. m: f" p" O; K - LCD_WR_DATA8(0x25); , Q1 A! F1 g! W. C) F) k) V
- LCD_WR_DATA8(0x2D); . Z7 i, s4 g) u- w1 L# d3 f+ M
- LCD_WR_DATA8(0x0F);
$ |; N6 O' l r4 l% r2 N1 z - LCD_WR_REG(0x11); //Exit Sleep
4 V: H9 j+ k V9 o - HAL_Delay(120);
0 f8 w5 I) x& h: o. U - LCD_WR_REG(0x29); //display on , P0 _+ b& I+ `3 E* B
- LCD_Clear(WHITE); o) \( y5 E2 j
- }
复制代码 相应的图片显示函数为:3 Y1 \* D) Q# D' \) u; Z8 v9 |
- void show_pic(const unsigned char *p)
/ O( F$ Z0 ~$ I3 C - {
& N5 y& q2 `# \0 a6 M - int i,j;
5 _. H" x7 ~+ `1 w1 a& g0 g - unsigned char picH,picL;8 Q7 H4 b$ r. I3 C9 G
- Address_set(0,0,LCD_W-1,LCD_H-1);
4 b0 ?( k# e! D: ]7 X1 ^ - for(i=0;i<240;i++)0 O% q b0 {. Y% X: A0 S* K
- {' R+ ^) P0 f+ q4 K2 i. B! ^5 n: j
- for(j=0;j<320;j++)
9 ?' B2 x- g5 y+ Z& Z - {% f5 m; C* S, R( }8 g
- picH=*p++;+ L7 n* B: [+ T7 i
- picL=*p++;
' d7 z8 l ]( I+ r8 O- m' O - LCD_WR_DATA8(picH);
5 V9 m/ Y' T+ m1 e! Q - LCD_WR_DATA8(picL);
/ i1 B; t- X2 f8 k" f/ R - }5 H% J% ]. r9 x% A- P) t3 c+ G
- }
) i( _$ J7 Q- m/ ? - }
复制代码 实现显示效果的主程序为:- e8 V* [; T1 M1 J/ c5 h
- int main(void) // 2.8' TFT OK
( ]2 [- }% j5 }! A0 d1 V - {: b7 M) \# J1 G. `1 V5 I/ [, J3 O
- HAL_Init();$ b4 Y# D7 y4 p+ n) p) G
- /* Configure the system clock to 80 MHz */! z8 o0 n9 J! Q) o0 R* M/ Z
- SystemClock_Config();5 p1 r. l: N: W; V, ~ y
- APP_TFT_init();. N5 Z0 k7 [/ R% R5 l5 h! u
- LCDv_Init();
; z E4 @, C4 m& i - show_pic(gImage_a);
9 _3 B, G% @# A' v- U - while (1);+ ~( w3 ?, h8 X4 z
- }
复制代码 4 k4 l+ w( t1 o/ f! @7 R
/ I7 a+ l" |7 L! [ |
好的