前段时间为参加RT-Thread x STM32 全连接创意创客大赛特意购置一个2.8寸的触摸屏,这次也让它露个脸儿,为社区献上一份祝福!& o' Y' S. K; @" ^6 `% ^/ P
/ i0 y1 G# r* d3 m; V7 g* [; S
$ W; { c2 C/ C( J8 C8 ]- i) s
' \. b6 D( s. _7 G+ V
7 T+ B9 l" x6 P0 e, A: ?# C; ^
3 J0 F+ F( W3 E+ x0 R6 w为了便于移植,驱动采用I/O口模拟SPI接口通讯。
, a, L' g/ ?* v) \) \+ J显示屏与MCU的连接关系如下:
, q: s# Y8 C1 j! WSCK---PC7
, U9 g- b9 u p" ]SDI--- PB64 `+ e5 O' M: o" z# a
D/C---PA7- T8 c9 I+ A; c8 O3 @5 R- {
RST--- PA6
7 Q0 o) h3 W; c. o8 K! C" f' DCS ---PA5
- e! _2 X$ }: \$ {LED--- PA9
; [+ r) j3 ?0 V2 V- G& ^* c$ T% g4 j. u* w$ O
1 B% T; l, N! \% g4 N
输出高低电平的语句定义为:9 i) {7 D0 Y4 e+ b; X7 i" r. T# q
#define LCD_CS_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET) // PA58 ~- E( w B# P. s( s
#define LCD_CS_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET)
- Z* s. H _5 h R$ X* I7 J0 H4 q# A! Z' ?/ |! W: w& J( h
#define LCD_REST_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET) // PA6
7 l5 I% H& z4 c% W# h3 m! ~+ c#define LCD_REST_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET)3 m. P# d* }6 I
: X# g' t( I- G. [
#define LCD_DC_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET) // PA7
! N# U# L: `1 |2 z% I6 I#define LCD_DC_Low() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET)
& j0 q# b7 c: u- c/ t3 J* E0 O+ s8 b4 b/ a* k7 f) o2 C% Z! |2 K
#define LCD_SDI_High() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET) // PB6
! K6 k) l4 K$ p) p P% [8 O#define LCD_SDI_Low() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET)
4 y8 C0 M0 a; O1 y
9 o1 f6 Y* I! ^( [. | d#define LCD_SCK_High() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_SET) // PC7/ U( D q4 T1 V) q* e
#define LCD_SCK_Low() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,GPIO_PIN_RESET)
: [; I" [* z" B1 K
' r/ ^3 q( G% w#define LCD_LED_High() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET) // PA9
: K; p1 Q& L0 s$ ?- B8 O& v6 U$ J8 d t9 U8 A* v5 A
* _% A- j1 T0 ]0 [5 M. V相关的辅助函数为:! O3 g* b1 p7 }* V) j
- void LCD_Writ_Bus(unsigned char com)
1 C1 M5 ]" `% @& P5 c- [ - { d( P5 }* w* N1 f
- unsigned char uci;
9 N) e- R% { ~7 v; N - for(uci=0;uci<8;uci++). D+ s, J$ B$ g, q8 C5 A. |* d" B8 ^7 G) X
- {6 g& A/ q* r! z
- if(com & 0x80)
: r' b3 d0 ~( _+ w( R c - {3 `4 |0 ^- f" V7 N. h1 R
- LCD_SDI_High();
: Y* E( n& ^! h - }" Q% t R- }4 k9 D
- else
E1 N0 w# R2 Y: r: P - {
- c3 r) V: n9 K8 K - LCD_SDI_Low();3 u/ t3 S9 v+ B9 y4 v
- }
4 b+ _1 N, J: @9 F - com = com << 1;6 W) b3 J, y" L" h+ m* H
- LCD_SCK_Low();# \; W9 H; Y8 G; m* o
- LCD_SCK_High();
* D$ V/ Y# J3 P M" S; ?9 b9 n - } & O0 q4 T7 s x1 m/ @6 D" c( {# X2 w
- }
9 ]6 w" c2 h) Y9 U$ I - ; A9 T" w, X4 |/ R( S
- void LCD_WR_DATA8(char da)
, z8 |: Y+ }4 `% K - {" J* v: e2 O7 U. a- X' A/ q0 e
- LCD_DC_High();% [5 K5 w8 ?' y% B+ o
- LCD_Writ_Bus(da);
' \2 T k6 f% I) S" s - }
3 X+ R% Z8 B2 Y9 F! ` ]* n( d" t7 w -
2 M* e" v* T8 s3 f% d( ~ - void LCD_WR_DATA(int da)% A/ e3 B! C3 s0 R i$ ^
- {+ ?7 n9 L1 B! d9 p
- LCD_DC_High();. Y' k- F+ E0 R" ^& ^& D
- LCD_Writ_Bus(da>>8);
+ a n) _, O& W) \( ] - LCD_Writ_Bus(da);
8 p4 Z0 n* v% i - }
y% l$ G. `/ P. g7 f. s. e6 n - 6 ?7 n+ j1 U9 R# z0 {2 P1 ~3 o+ g
- void LCD_WR_REG(char da)
3 h0 w) `! @# x - {
' b7 G2 }& S# ^- P: n+ h - LCD_DC_Low();
_5 Q6 u v% t8 {+ d - LCD_Writ_Bus(da);
, q# q9 u1 X% Z4 t6 j - }$ p: [" \) H# \" W* u; |" K4 a
- 6 o) }' X) {& C9 e g% o3 r# O6 ^
- void LCD_WR_REG_DATA(int reg,int da)
3 _: w3 o" D$ ^. ] - {" c- k6 [6 o8 t% Y0 z& K
- LCD_WR_REG(reg);
" X' e6 |8 m7 j- E7 v - LCD_WR_DATA(da);$ M: Q! ?5 K9 V( [* c
- }
复制代码 相应的初始化函数为:
8 \0 V8 x$ m3 ~3 A! ?0 A! ?# F6 B- void LCDv_Init(void)5 ?' a; h4 E7 m( ^
- {
4 S# s6 A# Y% m9 R0 p - LCD_REST_Low();% h2 @9 @: o! w# p+ {
- HAL_Delay(50);
6 {1 l$ e6 n. W - LCD_REST_High();
* L G7 K, K: |$ x/ O G - HAL_Delay(50);: L& Q3 v, w8 w, W" W, b
- - ~) L& ^6 p' J1 }1 f- B, z2 C
- LCD_WR_REG(0xCF); & i- K% y/ Z+ ^* Q5 o
- LCD_WR_DATA8(0x00);
' n& }: `6 k6 n, J - LCD_WR_DATA8(0xD9); % W, e, U* j& I5 N
- LCD_WR_DATA8(0X30);" B% L6 \/ @2 Z. D
-
3 @4 F4 F7 R1 _9 k6 ~ - LCD_WR_REG(0xED); * d6 I# x3 U+ l( J3 i
- LCD_WR_DATA8(0x64);
8 o O6 u4 D) U5 t# z - LCD_WR_DATA8(0x03);
' L# }7 ?( S6 ` - LCD_WR_DATA8(0X12); 2 S: @$ F" V9 J+ K5 w& x$ A
- LCD_WR_DATA8(0X81);
; f1 u ~2 ]" ]% p- [ - # G/ ]1 p2 n* Q& \) f4 O
- LCD_WR_REG(0xE8);
- L+ s6 t; s, g: x* m" Q1 x- T; z - LCD_WR_DATA8(0x85);
. V0 m0 }" h# e* n% S3 e; q - LCD_WR_DATA8(0x10); 7 b. ?2 j6 \( O+ t
- LCD_WR_DATA8(0x78); `0 w& d( w" d1 Z4 @5 n; T* J
-
9 x" H2 y9 Z5 V: \7 `$ ?- y( ] - LCD_WR_REG(0xCB);
1 x5 f5 y6 b" ]/ |9 `; ^- l - LCD_WR_DATA8(0x39); 0 Y3 Q$ R' @6 \. G5 [: X, A1 G
- LCD_WR_DATA8(0x2C); 0 O2 A' e9 k" d+ \! b' h+ U
- LCD_WR_DATA8(0x00);
4 I; y1 r) Z" L& [% a# ^ - LCD_WR_DATA8(0x34); ! K% Z" {7 L; y) K) W7 j& P% f# j. w
- LCD_WR_DATA8(0x02);
# i/ y# |" M* E5 W5 g - * l$ \/ ?" y- M# l; F
- LCD_WR_REG(0xF7);
+ Q9 X2 _9 c3 h - LCD_WR_DATA8(0x20);" ~0 j4 K+ d5 w+ N* G
-
$ Z4 Q& S1 X d: A% N6 j3 s6 T - LCD_WR_REG(0xEA);% f: t% z9 d9 k8 V, n8 g& v
- LCD_WR_DATA8(0x00); / x! `( e% j# K0 `) R# V
- LCD_WR_DATA8(0x00);
7 S& b9 }' e* P% O! P5 H - : c: `! S+ s8 y+ o( k; l
- LCD_WR_REG(0xC0); //Power control
( T* y: v: m* y$ F - LCD_WR_DATA8(0x21); //VRH[5:0]
) x: Y) Z2 A& X. t: w - , V8 s$ k4 s3 M
- LCD_WR_REG(0xC1); //Power control - J6 g$ d* D2 `: I9 ^
- LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0]# Y9 X. f! W4 J; B8 ~* b
- / \+ `, J' g% u8 D
- LCD_WR_REG(0xC5); //VCM control $ B1 m% ~: A# B. C9 G3 k+ x. F
- LCD_WR_DATA8(0x32); //3F) y" n( Z& r0 b, @$ x# s
- LCD_WR_DATA8(0x3C); //3C
- `$ R' N& J: q) i$ G! {8 E -
8 f- U& X7 D* w) V - LCD_WR_REG(0xC7); //VCM control2
7 s; T$ K/ s9 ?) q8 `+ S) } - LCD_WR_DATA8(0xC1);5 m1 o {& s/ Y3 u% f, X
- # a( [* X) f9 A& J5 @" P8 s$ K1 E6 q
- LCD_WR_REG(0x36); // Memory Access Control 3 v @. O. C( [+ K8 Q6 z
- LCD_WR_DATA8(0x08);7 h3 u" W' ?; D. C" _6 e% d2 m; h
-
3 U6 l/ B( j; K& _3 M+ D- T5 s6 O - LCD_WR_REG(0x3A);
8 Q% P: Y2 C( ]1 O6 \ - LCD_WR_DATA8(0x55);. P# }0 Y5 ^$ K. @7 U3 \. F
- # ^( l" \& o( ?9 x. U$ `+ u, r' ~
- LCD_WR_REG(0xB1); //Ö¡ËÙÂÊ¿ØÖÆ
" E0 C2 E$ y$ c - LCD_WR_DATA8(0x00);. L4 j4 \9 L/ g
- LCD_WR_DATA8(0x18); ( ?8 u+ K+ h5 Q. V6 g
-
* y# ^& X) ^" r: c6 p) u - LCD_WR_REG(0xB6); // Display Function Control
! S: h) {+ u2 O; ~" C% _3 G - LCD_WR_DATA8(0x0A);
3 e Y! [- q7 ]) A: i- g3 ]3 F1 Y - LCD_WR_DATA8(0xA2);
^* x5 J4 @+ `& }1 J, U& D; V -
+ l" F* ]# C: \/ A - LCD_WR_REG(0xF2); // 3Gamma Function Disable
5 E- W ?4 x8 ]4 k5 [: G - LCD_WR_DATA8(0x00); + U5 }4 i) b9 c* K2 L5 c6 z( g8 Q
- . m9 Q( ]0 o) Y# f8 D
- LCD_WR_REG(0x26); //Gamma curve selected
6 Y6 G8 Q8 T( x - LCD_WR_DATA8(0x01);8 v: {& O5 G O% @$ U: @4 m; ]
-
& A! a) K7 W' [% d# @ - LCD_WR_REG(0xE0); //Set Gamma
" U: h& C3 D$ r/ g - LCD_WR_DATA8(0x0F); ; L. S- B5 u( {0 h! H+ z3 m
- LCD_WR_DATA8(0x20); 9 Y" e" O4 m! D+ U- S
- LCD_WR_DATA8(0x1E); 2 e0 m0 K) H k* g( _- J- Q
- LCD_WR_DATA8(0x09); 5 r1 B5 _% j- V* u8 ?% ^0 H& F
- LCD_WR_DATA8(0x12);
$ O7 f" p: I5 a+ @9 N) S8 m - LCD_WR_DATA8(0x0B);
, ^7 c ]& Z+ V2 e( s S - LCD_WR_DATA8(0x50);
" j2 |2 u( n. J% L+ N4 X, m! q - LCD_WR_DATA8(0xBA); 5 [8 n: x @4 h9 @3 J! p
- LCD_WR_DATA8(0x44); . E' w1 M& D; V+ Y
- LCD_WR_DATA8(0x09); ( T4 ~ n3 F7 [, E! s% H
- LCD_WR_DATA8(0x14);
. x( w- z' ^2 f3 e6 a8 [ - LCD_WR_DATA8(0x05);
) r1 r+ F5 o1 f( D+ u - LCD_WR_DATA8(0x23);
/ W, `! J4 {6 @* t8 E - LCD_WR_DATA8(0x21);
/ A4 |9 I; ]3 d' A l, ` - LCD_WR_DATA8(0x00);
. l! J' }2 I* ~2 f/ y; i - 9 M& v) L* |+ }) o5 M
- LCD_WR_REG(0xE1); //Set Gamma
: |* V, e. ^- D1 [' V; F - LCD_WR_DATA8(0x00); % b5 C* Q2 T. }0 V n
- LCD_WR_DATA8(0x19);
. g2 ?2 M. D3 R' N4 ?/ y0 q - LCD_WR_DATA8(0x19); ( P+ P l0 P, |
- LCD_WR_DATA8(0x00);
' H5 [9 d1 f+ X5 m+ r - LCD_WR_DATA8(0x12);
% X- d, z: y. M$ {# t - LCD_WR_DATA8(0x07); 6 [& a, s) u# W h; B/ k; t3 R
- LCD_WR_DATA8(0x2D); 3 _3 }& g5 N, I7 s, r! B
- LCD_WR_DATA8(0x28); ! i# a" P: o, f, m3 Y7 K3 Y
- LCD_WR_DATA8(0x3F); 1 H7 J g0 I5 |
- LCD_WR_DATA8(0x02); 4 j+ C* _1 x5 P' C- w
- LCD_WR_DATA8(0x0A);
/ Z% `6 M- }! c - LCD_WR_DATA8(0x08); ) v5 u" p1 P6 y0 W2 l" n( a
- LCD_WR_DATA8(0x25); : M# g" C" Q6 o4 }- Y
- LCD_WR_DATA8(0x2D); 3 F: v0 g# ]: r, W/ f! O: ?
- LCD_WR_DATA8(0x0F);
7 g$ i) L5 f1 R. X' B7 | - LCD_WR_REG(0x11); //Exit Sleep
: \% V7 W0 L' D E3 ^$ _ - HAL_Delay(120);
5 }. I; E/ P4 z, u - LCD_WR_REG(0x29); //display on
/ B+ S Z5 i3 A' @; F6 D t - LCD_Clear(WHITE);
* V1 I! U9 G" \/ ^8 f - }
复制代码 相应的图片显示函数为:
3 w/ e+ w# i2 S) J3 k! i- void show_pic(const unsigned char *p)0 o9 U3 G+ Z" Q2 _$ r
- {
2 d7 K. {- y( `& ? J# Y# K - int i,j;
{( J P, t2 z% o- b/ g \ - unsigned char picH,picL;7 m) k' x6 M# M
- Address_set(0,0,LCD_W-1,LCD_H-1);' N& o1 K- Z1 u2 J6 b
- for(i=0;i<240;i++): l: H3 m- u+ a2 u6 M7 [9 w
- { u) U# a) Y5 ^8 X6 C( C
- for(j=0;j<320;j++)8 C& G! r% K) v% x6 N' ?! k4 i
- {
+ X1 q/ Z; R# Z$ @9 T; r - picH=*p++;2 v ]$ _5 p) ?/ { o0 B& N, s
- picL=*p++;
' p9 f4 M. ^' b1 B% S' y$ ]% }2 D - LCD_WR_DATA8(picH);8 O# u$ _9 D. D8 e6 B
- LCD_WR_DATA8(picL);
5 V) s9 @) z3 X8 e; W4 h2 ~ - }
0 X% u% S7 @6 Z3 ? - }( y6 H! G1 k2 ~7 g$ @/ b; s* J
- }
复制代码 实现显示效果的主程序为:
4 d6 g5 [1 r5 S+ c; @9 R- int main(void) // 2.8' TFT OK9 e. Z; w Q9 c$ j9 Q9 B5 E# q
- {
& A4 z9 U3 v0 I! u2 {: r! n - HAL_Init();
$ j( \& _$ Q! V - /* Configure the system clock to 80 MHz */; u0 A! r+ l8 W0 O! q' }1 T1 l
- SystemClock_Config();
% |% K4 ~2 Y$ `* W2 o2 E0 e - APP_TFT_init();
2 S& f1 Y* j+ ?& M3 N& m; I% v# [ - LCDv_Init();
) {$ ^4 _! ?8 G" N& q! M) e6 I- g - show_pic(gImage_a);& |/ Q# F3 ? x- u
- while (1);
: b9 t% C6 H0 h. R - }
复制代码
4 b3 B- n! c; R/ K( U9 d4 {/ Z. l+ n$ I3 T+ c
|
好的