前段时间为参加RT-Thread x STM32 全连接创意创客大赛特意购置一个2.8寸的触摸屏,这次也让它露个脸儿,为社区献上一份祝福!8 Y* F) H( i' g6 d+ I& _/ f) C5 `
7 c; w2 Z6 g5 q6 X* b- r
3 j( }1 G, y, `+ f: q# v; I/ V: r2 w/ c
; Z0 T+ _9 I7 s; ~( ?/ R
( J1 C+ _* Y/ x" Z为了便于移植,驱动采用I/O口模拟SPI接口通讯。
- j- w6 u; n, p7 E C! H9 o显示屏与MCU的连接关系如下:
( C- T4 ?5 k! }2 H+ \! `SCK---PC7
9 n- g: M* w! P+ C( E4 RSDI--- PB6
- N$ ~( h/ ~5 h* i2 o" ~, eD/C---PA74 L) Q3 T {% u6 b8 ?: ^
RST--- PA6, K# H* |8 L v: C
CS ---PA5
7 N2 A6 i5 h, XLED--- PA9
- M/ W% D: y& Y5 z5 Y% z" X
1 N2 r1 G! [+ t! B: p" I" X
: e) R( H7 G5 L Q, W5 }) s输出高低电平的语句定义为:# s( ?( G9 |* M3 M' N
#define LCD_CS_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET) // PA54 j! I, R) C8 ?8 }
#define LCD_CS_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET)/ p6 K, T H6 _: f* b4 k; t% i
: z& Q6 O/ h' ^( a7 }- h
#define LCD_REST_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET) // PA67 ~0 @1 i3 N+ S7 L+ D" i
#define LCD_REST_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET)$ y( X# Q: @4 ^
+ i |* [# n3 L
#define LCD_DC_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET) // PA7! X0 ], {7 \; x( i
#define LCD_DC_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET)6 m, U4 L4 w. l! Q
# u5 P+ w. ^0 Y' k1 `
#define LCD_SDI_High() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET) // PB6
& G; r+ b" w- }2 H4 ?#define LCD_SDI_Low() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET)+ [ w5 `" T8 Q% E3 @! y3 [
- g" @5 q0 c4 c. U/ b- ?/ d
#define LCD_SCK_High() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET) // PC78 N; ~. e, K7 h
#define LCD_SCK_Low() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET)0 ~7 H4 L, n* h) C. u; ~
* X8 O w. g# a) C3 {4 T
#define LCD_LED_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET) // PA9
8 b# s, s: @+ r
& [! v( r$ @) V7 U) E: q+ U
1 f8 |& S6 h. t- G, ~相关的辅助函数为:
4 B8 Q; w1 {2 k- void LCD_Writ_Bus(unsigned char com)
! \4 r1 ]1 n9 m5 e' l. D. U) ` - { % f. `6 J4 j9 M9 F" S8 b4 j
- unsigned char uci;
2 J M M5 n2 Z: k" Z - for(uci=0;uci<8;uci++)
6 ]8 M @/ Q6 `4 i/ Q, a$ |8 w- @- W - {
% G* `+ b) c3 z) L" @ - if(com & 0x80)
9 ?: J' [9 D) e; ]" f) i: x - {8 ^. P7 R: l. r2 Q: e
- LCD_SDI_High();
0 E( [2 @' q. C3 y' `, F% e - }9 d. G$ }" C& h! ?1 P, k
- else- E, t6 J3 S/ B
- {
6 G2 Y" l4 L8 r# R9 I' S, B( a [ - LCD_SDI_Low();
t- Q3 w: _% D - }
4 N' q( r1 t( q4 n6 b& S( H+ H - com = com << 1;' `" \9 \5 B2 p0 d$ Z0 p: t
- LCD_SCK_Low();
7 L( m6 r7 v# q6 i$ V8 s- e - LCD_SCK_High();
, L9 j/ [: T/ R P% G - } 6 d! V5 S% z$ A: ?% L5 x' Y
- }* x: U0 H4 O7 r) A
" M/ o( N% q+ M5 L: H2 ?4 U+ ]- void LCD_WR_DATA8(char da)
( v/ G+ d) j: { - {6 O$ O2 A5 T, q9 m5 H* s
- LCD_DC_High();& [) X9 k9 _5 Z9 }
- LCD_Writ_Bus(da);
; T$ z8 [4 }- m' C# j* ] - }7 f1 \. l( V+ n; B/ D* e
- & ^7 k9 s6 Z6 Z, G; H
- void LCD_WR_DATA(int da) s( t# W1 I9 S( D- o, }
- {
3 X* y8 c U# H5 c - LCD_DC_High();* U5 e2 {$ h3 s& U$ _7 C" g
- LCD_Writ_Bus(da>>8);
" g6 o! a9 \0 F3 @8 E - LCD_Writ_Bus(da);9 }; S k& @- r' M
- }* \, c4 [! e) Y
- 9 ^/ W. D `$ e7 M8 G
- void LCD_WR_REG(char da)
, T1 M7 u3 U7 t) T$ q7 S - {1 r9 j2 ?1 k t5 [
- LCD_DC_Low();
8 ~& T+ p' M# |3 v - LCD_Writ_Bus(da);
! B8 _# m0 R/ c" P4 B - }2 Y7 J' N4 ~% w1 V" D' R
2 z# e2 B/ b1 P7 ~: O9 E+ H; E- void LCD_WR_REG_DATA(int reg,int da)
5 Z0 N: I- c! E; |4 x - {
5 H4 Z8 D- L. M) }- ~2 [, I; w - LCD_WR_REG(reg);1 S0 [8 G) {$ P1 P/ l- W
- LCD_WR_DATA(da);
* N3 V% X5 r% w: ]+ ?" z - }
复制代码 相应的初始化函数为:8 a$ ~ n; X. h ~2 P
- void LCDv_Init(void) ~* h5 l7 \+ S
- { * z% z( Y/ u3 P! x# `9 d
- LCD_REST_Low();
0 v! v% k9 z' i9 D' X" P; g# R$ N! \ - HAL_Delay(50);
9 U) m5 o: a7 f# H - LCD_REST_High();# a- z R9 t" T# N0 U `
- HAL_Delay(50);
7 g9 u2 A) g8 y f7 @ -
& b/ `; W: m, U( |% m& b - LCD_WR_REG(0xCF); ( s4 n# S0 H2 i' B# W" ~% q
- LCD_WR_DATA8(0x00);
' c# `' U9 `. R1 t0 u) X - LCD_WR_DATA8(0xD9);
& _- r$ B/ l9 @' }' z# K) @ - LCD_WR_DATA8(0X30);
* J4 @- K/ J# C; w8 U" o) c% N6 O -
; V" m3 q4 g* }' x( ^ ] - LCD_WR_REG(0xED); # d* n5 j/ O' ~( h; m5 [# y
- LCD_WR_DATA8(0x64);
4 F; Z0 [: c. J - LCD_WR_DATA8(0x03); 6 g P) z( @ d
- LCD_WR_DATA8(0X12); 9 w/ X) L* Z3 J7 P7 ]) j, N
- LCD_WR_DATA8(0X81);- G& C6 j4 R* B0 _( }
-
5 n1 e9 Y, {. a1 W) [ - LCD_WR_REG(0xE8); $ {* }7 h ^4 f: c' I5 V3 i
- LCD_WR_DATA8(0x85);
$ B8 ?/ B$ I3 r7 R( G - LCD_WR_DATA8(0x10);
& T/ v* U' v! @8 b - LCD_WR_DATA8(0x78);
5 u$ h4 g3 W9 D' X8 T: k4 g; x( B5 X6 ^ - 3 {, o8 L$ H3 K" a
- LCD_WR_REG(0xCB);
" j4 A; A; x$ ?4 {+ X9 k) j - LCD_WR_DATA8(0x39);
& N! U5 \$ X% J6 V - LCD_WR_DATA8(0x2C); . E1 d8 g9 O! C+ [2 n4 I, N
- LCD_WR_DATA8(0x00);
, Z$ l7 j: s) n# B. s3 C - LCD_WR_DATA8(0x34); / v% D; I$ [/ a7 n5 {5 [' F, c9 B
- LCD_WR_DATA8(0x02);
- x+ l+ A9 Q# {, z -
% {/ M, w- x" N3 Y* h/ k - LCD_WR_REG(0xF7);
. y9 e% w9 ~7 g. O* C7 ]# h - LCD_WR_DATA8(0x20);- F0 f" h0 I( m' }" Y! x6 p
-
6 y9 y! K0 y+ D - LCD_WR_REG(0xEA);
/ }* E, C. f& r( T - LCD_WR_DATA8(0x00); + H& a) ~, ?0 B5 p
- LCD_WR_DATA8(0x00);2 b% l& @* U* y2 g% g1 f' |
-
0 B% z8 i, R) U - LCD_WR_REG(0xC0); //Power control 7 O+ G6 J9 B+ J5 F, z9 x& g4 c8 h; R
- LCD_WR_DATA8(0x21); //VRH[5:0] 6 J1 ~6 |9 p$ C& C
-
) r, O# G* P8 s- `1 d - LCD_WR_REG(0xC1); //Power control $ r! N* O, I0 L3 I3 x
- LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0]
) l3 ]0 N8 l1 ^7 ~ - & v8 U' c3 [1 R2 Z1 J5 _' \; l
- LCD_WR_REG(0xC5); //VCM control " F1 S: F1 `! W; F! L3 T0 c6 m
- LCD_WR_DATA8(0x32); //3F1 }# h* V) h/ ^
- LCD_WR_DATA8(0x3C); //3C O2 k: y9 z8 h2 i+ ]- d
- * N+ n" a/ u8 o$ R) ]
- LCD_WR_REG(0xC7); //VCM control2 / P+ p6 A( t2 }4 ^$ X" I: z
- LCD_WR_DATA8(0xC1);
( j9 Z* I1 g/ t4 k( Z -
6 V. g6 j7 Z b* Z; q+ U3 O - LCD_WR_REG(0x36); // Memory Access Control 8 X1 ~8 R5 z7 y
- LCD_WR_DATA8(0x08);
- R+ }. {; M+ T# X6 Q: D5 m$ k - , k9 e6 A2 h: b3 I. G7 g# t/ s
- LCD_WR_REG(0x3A); $ |9 y" R+ B `: H
- LCD_WR_DATA8(0x55);
" A1 W1 X k' X& J" r - 8 r1 I0 [+ C6 ?2 V
- LCD_WR_REG(0xB1); //Ö¡ËÙÂÊ¿ØÖÆ
6 w! y4 M, [( b* D7 X - LCD_WR_DATA8(0x00);
1 t" u4 g! `+ A3 a4 h& a3 |! L - LCD_WR_DATA8(0x18);
2 Y1 r: x r5 p -
- o( t6 N# e3 V1 }3 g t) Y - LCD_WR_REG(0xB6); // Display Function Control 2 n* h2 O& i4 e
- LCD_WR_DATA8(0x0A); 3 \" m2 G, J8 v8 L" q% D
- LCD_WR_DATA8(0xA2);
7 V5 |3 L4 V- n# U5 [, k- C -
6 v0 z: h7 a1 }% s( F( _ L% x1 L - LCD_WR_REG(0xF2); // 3Gamma Function Disable 2 H( t2 w4 R/ [7 _3 D0 S' o
- LCD_WR_DATA8(0x00); % I6 k1 J& U( c9 i5 H
-
! V) i9 s9 f$ q% h - LCD_WR_REG(0x26); //Gamma curve selected
! \) Y4 b+ h+ ?- F' L# R - LCD_WR_DATA8(0x01);
! f( u; S# X' W% M! o: ]8 ]% j! Q& G, J -
1 ?: s8 b- Z/ Y/ X) W - LCD_WR_REG(0xE0); //Set Gamma
' f6 W5 u9 _" R" ` r - LCD_WR_DATA8(0x0F);
! }2 |1 p% e: d8 o2 ` - LCD_WR_DATA8(0x20); ( h0 x5 d7 N' C% ?* C
- LCD_WR_DATA8(0x1E); . S8 q; B6 ^7 i, z- b
- LCD_WR_DATA8(0x09); 9 s+ Z3 h# O% U; ^+ C
- LCD_WR_DATA8(0x12); 2 l1 N: j* k% o' t9 v8 j" `& m( G
- LCD_WR_DATA8(0x0B); 6 D; v+ ^" d) ]7 [1 V' K {
- LCD_WR_DATA8(0x50);
& B9 c& K# U# x6 T) h9 T - LCD_WR_DATA8(0xBA);
" ~. @0 i! m7 W( } - LCD_WR_DATA8(0x44); : J: ~) N- t* f2 P, V8 j0 `
- LCD_WR_DATA8(0x09);
* |+ ]( B# x9 U1 N1 ^ - LCD_WR_DATA8(0x14); & p1 ~5 v3 ^ s# K+ T
- LCD_WR_DATA8(0x05);
: y7 i! l' B; z, o7 r6 u - LCD_WR_DATA8(0x23);
1 w% K% Z3 V- [6 k: _* c+ N - LCD_WR_DATA8(0x21); 5 d/ \3 F3 U" V/ S, ]9 ^
- LCD_WR_DATA8(0x00); 6 V- \* k" q6 q; Q! P. L3 T
- 5 f7 m8 m4 ]) L" T, o
- LCD_WR_REG(0xE1); //Set Gamma $ e2 a& f5 [7 H* V) Z! C" w' p
- LCD_WR_DATA8(0x00);
/ H& N; d( b# J9 w* d$ Z - LCD_WR_DATA8(0x19); - N' ~$ O3 F; c4 D/ F& S1 m. T7 M
- LCD_WR_DATA8(0x19);
+ v" y( m' t) O! \! ` - LCD_WR_DATA8(0x00);
; I D5 y+ A$ T4 p5 Y @ - LCD_WR_DATA8(0x12);
2 P$ X% |0 O0 R8 U - LCD_WR_DATA8(0x07); 9 P% v8 T1 U1 G0 J! }' W; i2 ]
- LCD_WR_DATA8(0x2D); / D& a: c& |$ t ^; j2 v( ]
- LCD_WR_DATA8(0x28);
- G; S5 ` j8 g: B8 x3 s - LCD_WR_DATA8(0x3F); " ]9 @! m9 i4 f8 q7 C' I
- LCD_WR_DATA8(0x02);
- _8 [" e n% R - LCD_WR_DATA8(0x0A);
7 x$ `' P2 S3 A1 U5 f' {/ H - LCD_WR_DATA8(0x08); . v' F; ^; n- D* {
- LCD_WR_DATA8(0x25); - F* o, J% M5 q- `1 O
- LCD_WR_DATA8(0x2D);
0 i7 h& I. b2 d* L' e - LCD_WR_DATA8(0x0F);+ d) f& N/ A& _) m
- LCD_WR_REG(0x11); //Exit Sleep
& W. J, T) U4 r% r1 f' K" y - HAL_Delay(120);
, a' [) w, ~# E9 a2 d! y - LCD_WR_REG(0x29); //display on
! _1 K3 L4 z6 s- C2 y - LCD_Clear(WHITE);
' H8 Z. Y% Y5 |+ }& N - }
复制代码 相应的图片显示函数为:
! p: V3 Z" ]; q8 S- void show_pic(const unsigned char *p)8 C9 |9 t) ]& j1 Q. A
- {
' U3 J- o7 A- d# L/ K - int i,j;" `; e- t" o0 U+ K
- unsigned char picH,picL;+ |0 U% F! I' Z$ z
- Address_set(0,0,LCD_W-1,LCD_H-1);3 ?# V7 p. x# P8 Y/ _7 A. i, C
- for(i=0;i<240;i++)5 v3 Q. m: |- L, F6 B
- {
0 k. M+ D) j" I# J* B V5 s - for(j=0;j<320;j++): V5 E# u. L3 i: n# t% t
- {
2 x9 Z1 Y, S0 R. k3 m( F7 N9 C - picH=*p++;
1 r2 c& i9 N! H% K - picL=*p++;
7 V8 f+ r- v# d! x - LCD_WR_DATA8(picH);+ e( s( Z2 @" I& H0 \- R
- LCD_WR_DATA8(picL);
7 P* }; r' q0 p7 F4 [+ L- L! Y - }$ e4 ~* g; P2 w2 _# c( ~9 M
- }
1 x0 _, X% b+ B5 V" ~2 I, V' H Z - }
复制代码 实现显示效果的主程序为:
) q; ~; S4 i0 v7 @. [8 y- int main(void) // 2.8' TFT OK
- L5 J# `. X2 y. ~4 o9 x+ p2 u, }8 L - {' k: `+ H1 h3 M" B. @) T3 E, R
- HAL_Init();0 ~- b* r5 p3 J, Z2 O4 @& ^
- /* Configure the system clock to 80 MHz */0 _3 j$ o( O( @- p A# ]2 C
- SystemClock_Config();
0 T, I3 _9 T4 X5 D* p% v" q - APP_TFT_init();
: F6 u% a; `3 t: [& B - LCDv_Init();
. `; J8 G' @& \/ `# L* K b7 ~7 f - show_pic(gImage_a);) s1 F9 T7 F" }
- while (1);
. N `7 y* s8 }8 P - }
复制代码
5 Q) `! t0 K5 |" v* U# H6 r" A) H9 i1 V2 m T
|
好的