硬件平台:1.8寸128x160 TFT屏(st7735驱动) 连线: /*4 |) _9 e' h+ a8 x# N6 l. f
* BL - PC8 D09 O# p; K& \1 s L, b
* CS - PC9 D1- K# F/ \4 h+ c
* DC - PC11 D3
7 T9 u0 F. b8 o * RS - PD2 CMD0 a4 V( ]* p: u$ K! s: a7 T# ~. V G3 g( W
* SCL -PC10 D2/ U' I- }4 E! |9 o8 [! a8 w
* SDA -PC12 CK
! O# o9 J F9 p! ?) y */ 由于用spi硬件调试了好几次,要么SCK,不上拉就没有波形等。退而求次之用软件spi驱动。
8 j" p$ Z' p1 e
一、配置IO
1 _% q' w! A- M$ [; Z 二、由stm32cubeIde生成工程后,加入st7735.h、st7735.c以及font.h
) v6 ?. U/ Q* U# l1 O
% M* B7 D( K* y9 k3 Z! Z- G 3、宏定义,在stm7735.h中定义屏的6个引脚的高底电平:! u$ |8 M6 |3 Z$ z7 O& t
- //LCD片选脚
0 G( k! Q" c( _4 e7 w - #define CS_HIGH HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_SET)6 V8 O& A$ u9 e, }7 t. w; L% Q+ L
- #define CS_LOW HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_RESET) U( A) B1 }+ v. j0 Q& w- Q
- # @ o% x, C9 ^, s) ^& K
- //指令数据选择脚 对应屏幕上面的a0脚 输出低电平,代表命令,高电平,代表数据
5 x# f: C" p: [, X5 d5 A - #define COMMAND HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_RESET)
n# F& v! i5 N" f# x - #define DATA HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_SET)- R4 x% J% O: k. H9 F/ o5 Q
: o+ [/ G- p: {- //复位脚% F, a. h& w9 R. Q
- #define reset_high HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_SET)5 B( t" c4 S, N! \7 Y) d8 s
- #define reset_low HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_RESET)
# j( t! d0 ^/ r+ x# H - //背光脚% p5 s1 x5 M( |- P1 O. x
- #define led_high HAL_GPIO_WritePin(ST7735_BL_GPIO_Port,ST7735_BL_Pin,GPIO_PIN_SET)/ _5 k( S1 H8 A9 Z# v2 ~# l
- #define led_low HAL_GPIO_WritePin(ST7735_BL_GPIO_Port,ST7735_BL_Pin,GPIO_PIN_RESET)
w/ ~# L* M" z) r, H, y" ]9 W - // SCL9 X, u7 l6 {& R" v) L/ c% r2 j; L( b- u
& @4 T9 z L% z3 f! v/ P- #define LCD_SCLK_LOW HAL_GPIO_WritePin(ST7735_SCL_GPIO_Port, ST7735_SCL_Pin, GPIO_PIN_RESET)
" U: C) ?- `2 y/ O - #define LCD_SCLK_HIGH HAL_GPIO_WritePin(ST7735_SCL_GPIO_Port, ST7735_SCL_Pin, GPIO_PIN_SET)
^0 k- ~ `# m' z5 W - - Z4 j4 [9 g' q( A; i# G* c9 _& F5 k
- // SDA
' E6 s! ~! @1 @( ]% ` - v9 ]6 v$ [) G! B1 u; y: I( K
- #define LCD_SDA_LOW HAL_GPIO_WritePin(ST7735_SDA_GPIO_Port, ST7735_SDA_Pin, GPIO_PIN_RESET)
& a3 l) D- D- W+ U3 O# f& p - #define LCD_SDA_HIGH HAL_GPIO_WritePin(ST7735_SDA_GPIO_Port, ST7735_SDA_Pin, GPIO_PIN_SET)
复制代码 : `' l0 g6 F# i; `8 T
) Z4 W" m8 n/ d2 H
4、定义spi向st7735发送命令的几个重要函数: - void st7735_write(uint8_t data)
8 ~# c! L1 }4 L% ^ - {
8 L/ o* X2 K7 H' l) o/ H - uint8_t i;5 D6 K' |( m7 w; W
- for(i=0;i<8;i++)
" P8 j+ x" }7 R5 v- s2 J2 I7 C - {. @/ Q! y# G' }( r. S
- LCD_SCLK_LOW;
# e& {+ Y% b; B - if(data&0x80)& B1 I3 {" T! s: Y- b
- { \' F% _ M$ o* O+ }8 y
- LCD_SDA_HIGH;$ Q$ A- I* y- M/ R& t2 V; [
- }" _. u/ T. {: u' C& Q2 U2 \
- else" T8 C! \; L/ D/ _4 T8 }: j: C
- { B. q7 a' {" p0 ~" V% T2 f% _
- LCD_SDA_LOW;
: A5 {: n& w. t W7 g - }( [8 Y, b: I* F. X
- LCD_SCLK_HIGH;
' a' Q7 V6 i0 N2 f' F5 ?/ z/ g - data<<=1;- \. I5 h# _0 |! V* M& |. p0 s
- }
% k$ p; C+ m6 O - }4 `( |+ w4 R* `% U. x
- //LCD屏幕写指令6 D9 _! ~$ O; i' k
- void TFT_WRITE_DATA(uint8_t data)
% K6 Q+ T( u% V+ g0 } - {; c, X. Q# z! T1 D) Y/ A0 X0 @' n
- CS_LOW;5 b( {8 ^; O4 z
- DATA;
4 L* |* e: B+ s: D0 |9 C { - st7735_write(data);
& p. z/ D# D( R+ c: k, m; E' M - //HAL_SPI_Transmit(&hspi3, &data, 2, 20);4 F# j8 T1 g# r- q) |, Y4 U% r
- //HAL_SPI_Transmit_DMA(&hspi1,&data,1);9 t# x- `2 I$ ?2 l
- CS_HIGH;
+ X# M3 c0 n( \8 n0 ~' w) k9 ~
7 ^4 u8 f, n0 b+ G9 @- }
8 B8 {' n4 }- R! Z - // LCD屏幕写指令6 f K2 e6 D8 F0 }
- void TFT_WRITE_COMMAND(uint8_t command)
9 J( _' Y1 S/ `; `3 f! k* J - {0 D* a: M) Z4 k% _4 {4 c; ^
- CS_LOW;+ Q& [! {. t: _- D" y
- COMMAND;
0 {$ A7 |: _: A: [, g# } - st7735_write(command);
~: h- ^; s1 d; m4 O, B( b C - //HAL_SPI_Transmit(&hspi3, &command, 2, 20);0 L1 I, v) y' T3 \5 Q
- //HAL_SPI_Transmit_DMA(&hspi1,&command,1);0 W( I6 J0 D+ h# `
- CS_HIGH;
0 k# K6 Q7 O2 e* b - }0 F' L- x8 x, b; B
6 J# |* ~7 j: N8 x& S* _) k( {- // 向对应的寄存机写入单个数�?
, q8 s- }! _) C6 P* S. i) B/ c - void TFT_WRITE_REG(uint8_t reg,uint16_t reg_value)' c' `2 G7 X0 K' {0 y+ I# Y
- {7 z/ {" h2 G! D6 v
- TFT_WRITE_COMMAND(reg);- n% [) a# l; E
- TFT_WRITE_DATA(reg_value);; e$ F p1 D( j% @0 l0 r* ~
- & U2 a4 V, t+ n( b) K( s: B- V
- & n+ @- t7 [8 `1 z. T
- }
6 V. m8 ?- F! B/ U/ d9 V' z' w - // 写入一个16位的数据9 d, W5 }" u% K& T4 F' @
- void TFT_WRITE_u16_DATA(uint16_t temp)
; M: @# M1 l8 W' _/ k- h - {1 x0 M# g; ~ U* i( ?
! O" B# L) Y* ?0 i$ V- uint8_t tempBuf[2];
+ H* N, I) K. b9 E+ A% c! a6 y - tempBuf[0] = temp>>8;
; m ^% H( J& w3 \ - tempBuf[1] = temp;% G f, ?: J9 [. y2 y+ s7 b# Y
- CS_LOW ;
) ^5 H/ q; v6 Q: S+ R) R; n% |; M - DATA ;
2 j) J7 t& N2 h9 \: w* h - st7735_write(tempBuf[0]);
! u' f- u% k8 U X2 y/ J - 2 c/ v; ^) s5 h# A3 Y* d
- //HAL_SPI_Transmit(&hspi3, &tempBuf, 4, 20);
* a3 e. h$ T4 K - //HAL_SPI_Transmit_DMA(&hspi1,tempBuf, 2);% _: X$ b3 b# X, D n$ o' P7 Y
- . W, x* S! I- J5 w4 M
- st7735_write(tempBuf[1]);7 A2 R1 h% G$ S
& i6 a7 c* J8 A4 g0 K- CS_HIGH ;
i: D7 Q/ [3 B - }
复制代码
: z$ R C& O9 I1 [+ k; X, @/ @" l
定义好这些参数后,在main.c中初始化st7735,然后写测试显示: - /* USER CODE BEGIN 2 */0 w' V7 T3 i5 l, U- q. C+ \
- , w- N' ~% }( h7 W. {
- printf("start U7575!\r\n");+ g: @4 |9 L$ B5 g3 K
- tft_init();4 M4 [, B2 z8 W6 @& A r
- TFT_ShowChar(0,0,'A',WHITE,YELLOW,32);
9 F' M; C, L2 s/ W - LCD_ShowCharStr(0,32,128,(char *)str,WHITE,BLUE,32);
( d; P. L9 {$ \; v* u& P# } - LCD_ShowCharStr(0,64,128,(char *)str3,WHITE,BLUE,24);
9 P5 n: A' x- M* E; q* _ - LCD_ShowCharNumber(0,96,128,number,WHITE,RED,32);
: n& ]2 e5 C6 K; y1 C - LCD_ShowCharStr(0,128,128,(char *)str2,RED,WHITE,16);" ]' D0 }5 ^% G. Q& p3 h W% K+ Z d
- /* USER CODE END 2 */
1 C* x* z1 Y$ r K# I, L
复制代码
6 i1 s9 g2 A `# L' o
测试效果如图: ) `6 t8 H: j1 X6 q
! M( M7 _) W1 t* l! O4 @4 T; h! A/ L8 \, Z6 N
出处:社区用户:lugl发布- [0 h a/ i+ }( p) f& ~) {
^& H( B: B6 L _& X$ t7 Q( Q g: l
* Q4 r4 y7 f' @: F' t2 Z4 w
|