硬件平台:1.8寸128x160 TFT屏(st7735驱动) 连线: /*, l c8 _& Q0 m) N
* BL - PC8 D0- M/ C7 w1 j. T: S1 A! A9 E' N
* CS - PC9 D1
) w& X! f; O3 a3 t; E * DC - PC11 D3
3 p0 F+ T' M3 A( V! @ * RS - PD2 CMD' H- a* f# \2 _1 e- |
* SCL -PC10 D2/ ?" Q2 f9 ~5 P# Q. l/ b5 e/ ~
* SDA -PC12 CK
; ]% ?# D [" \$ t */ 由于用spi硬件调试了好几次,要么SCK,不上拉就没有波形等。退而求次之用软件spi驱动。
, d" h2 F4 m* J: h. m1 q* E) P
一、配置IO
( f% M! G; Q6 a6 s0 a Z
二、由stm32cubeIde生成工程后,加入st7735.h、st7735.c以及font.h" D3 O( g4 U' J; B, h+ C
* k8 h1 B4 z+ h9 A- o
3、宏定义,在stm7735.h中定义屏的6个引脚的高底电平:+ n! H$ u9 q' M# ~4 R: o
- //LCD片选脚# r% _% L0 V- i m, I$ I
- #define CS_HIGH HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_SET)
6 m; N" j7 B% r d; i% {+ ] l0 m - #define CS_LOW HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_RESET)7 Q* X; ?( p4 x, R' w
+ N/ ?5 B5 v; y- //指令数据选择脚 对应屏幕上面的a0脚 输出低电平,代表命令,高电平,代表数据
9 `& J9 Y0 z; W0 F$ w - #define COMMAND HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_RESET)/ T R" O, a/ h) Z. N9 B
- #define DATA HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_SET)
0 G2 M0 x% I! n2 R; f) O/ T
6 n' @% ^0 q5 `% W) I* L9 ~4 p7 v _- //复位脚' b3 ?* a3 w8 W0 ?: v+ G
- #define reset_high HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_SET) x1 [: }# u$ l
- #define reset_low HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_RESET)
: `# f# J4 j4 X& t8 @ - //背光脚6 _- d6 y. d( \& v9 ?
- #define led_high HAL_GPIO_WritePin(ST7735_BL_GPIO_Port,ST7735_BL_Pin,GPIO_PIN_SET)
) t$ a5 t# h6 k% ? - #define led_low HAL_GPIO_WritePin(ST7735_BL_GPIO_Port,ST7735_BL_Pin,GPIO_PIN_RESET)
7 `- [' l. x: r5 h+ E3 v$ x3 f - // SCL4 u" @1 R4 H) X' a2 A- p
- : x& l2 Z1 q6 D) V o
- #define LCD_SCLK_LOW HAL_GPIO_WritePin(ST7735_SCL_GPIO_Port, ST7735_SCL_Pin, GPIO_PIN_RESET)
: t1 _ |% u) X$ w - #define LCD_SCLK_HIGH HAL_GPIO_WritePin(ST7735_SCL_GPIO_Port, ST7735_SCL_Pin, GPIO_PIN_SET); F V7 m k& }7 J
- + a- l6 _3 ]: ]1 u$ G
- // SDA
6 y% L6 g! z' Q$ l3 M: F" @
) X0 }7 w/ j3 C- #define LCD_SDA_LOW HAL_GPIO_WritePin(ST7735_SDA_GPIO_Port, ST7735_SDA_Pin, GPIO_PIN_RESET)
8 Q( }9 T: Y8 |0 n# { - #define LCD_SDA_HIGH HAL_GPIO_WritePin(ST7735_SDA_GPIO_Port, ST7735_SDA_Pin, GPIO_PIN_SET)
复制代码 " Z& K) b3 L7 S+ p+ r& k
/ T7 N# s: H# F
4、定义spi向st7735发送命令的几个重要函数: - void st7735_write(uint8_t data)
. I8 {5 A; H: x) M( {7 v - {* f" w, C8 A9 {! D j5 t& y
- uint8_t i;
7 `) @7 `' `: {7 O7 l& u4 A - for(i=0;i<8;i++)4 w, }) \- p. q4 Y- z w
- {
" K$ ]/ c5 L" ? - LCD_SCLK_LOW;
. c! Q) u* y1 ^, V, P7 ] - if(data&0x80)
' L' L6 u! x6 r8 Q3 v! a: \( ? - {
% r4 C# t9 H7 \ - LCD_SDA_HIGH;8 t( Y6 x0 d6 l" z7 d
- }
1 p9 F G4 u; W. l. s, ` - else
; q8 r5 f+ l; }1 ]+ B9 T9 S/ x9 l - {* S/ k; I' A( ~( \8 i0 U
- LCD_SDA_LOW;2 s5 n6 |0 o8 i" C
- }
: e* T& V( }- t9 }1 @! s/ m( a) w - LCD_SCLK_HIGH;* z* H( h" u1 ~
- data<<=1;
% g7 N& q. z! L& E/ T! t - }
7 ^- Y: {4 K' o3 U; U v - }
x% K9 l" ]) U [' N/ l0 B, D8 o. m - //LCD屏幕写指令5 P% l" G. i8 ~* A4 ^
- void TFT_WRITE_DATA(uint8_t data)
7 i0 E, z$ B4 L5 G! J3 T - {/ s: A& v; _' T) Z; Q0 w) e
- CS_LOW;
' W$ q7 t1 l. x+ s5 ^; m: l - DATA;
( q6 H" K/ W9 q) x- o) c5 A2 A - st7735_write(data);
" `, C' u0 F- E* [ - //HAL_SPI_Transmit(&hspi3, &data, 2, 20);$ ~7 ?, j8 }( X' F
- //HAL_SPI_Transmit_DMA(&hspi1,&data,1);
+ f+ m& y Y& p& F6 M! p - CS_HIGH;
3 S) W2 I1 ?& |. R0 K
9 U T/ M, W: f. M' L, b u8 R, J- }& L( B! O h$ @, S! M# m4 }
- // LCD屏幕写指令) q+ `: ]6 m6 i/ X
- void TFT_WRITE_COMMAND(uint8_t command)7 s a; Q5 K1 }
- {
! M: H4 F: a. @# \6 P' E - CS_LOW;0 Z8 s/ W6 z/ m; _7 R+ }5 D
- COMMAND;
& p; I1 H/ U1 H. L- D0 Q - st7735_write(command);8 ?$ q' [9 r" F; D- D" E
- //HAL_SPI_Transmit(&hspi3, &command, 2, 20);& p! g( @& w4 x
- //HAL_SPI_Transmit_DMA(&hspi1,&command,1);
0 L# r0 c! k/ D' R$ l, M1 w - CS_HIGH;& `7 ^$ Z) s# d6 B
- }# |( A: ]5 v/ b" i l6 c8 E: A
- ! w* q$ K. S2 V6 D
- // 向对应的寄存机写入单个数�?
5 I" D' O7 ~- p4 }$ o# s' l - void TFT_WRITE_REG(uint8_t reg,uint16_t reg_value)$ |0 p0 I2 k. [; |+ v' b) _
- {4 v. N+ H, ]* l1 g7 H8 |
- TFT_WRITE_COMMAND(reg);0 {; Q* D. c! Z* u" w2 H7 L( [
- TFT_WRITE_DATA(reg_value);
. Z0 q( x3 s5 A. Y/ g
; x E4 G: I& b+ y& S, Y
+ f0 l8 d# O! s4 G. n- }
, x" D5 v& ~2 W$ h% B! J) @ - // 写入一个16位的数据
- f7 F2 g7 t( K. Q$ w7 `$ E& U r - void TFT_WRITE_u16_DATA(uint16_t temp)
' I3 \' L/ S7 S6 B4 z7 o! M - {3 \8 o0 K* g9 {4 {2 d4 J
1 D) w4 ~1 X4 }* Z f- uint8_t tempBuf[2];
! M! H) b, j `; c7 t - tempBuf[0] = temp>>8;
, _, ?) N5 t- s+ |8 W( u$ U0 c - tempBuf[1] = temp;
) k4 |8 v; E, e' Q3 d5 Z - CS_LOW ;+ F+ H. d# K% b0 p9 _6 Y' q2 w6 B
- DATA ;
) Z- T* O8 T) t# N/ Y' |2 T% L, j/ M - st7735_write(tempBuf[0]);
8 v& n7 A2 Q! q3 [! X
+ u" T4 s7 c8 G' t; P5 k1 J( M- //HAL_SPI_Transmit(&hspi3, &tempBuf, 4, 20);
% B5 }7 _( |( l" e: I# B: Z: Y6 E3 k, L - //HAL_SPI_Transmit_DMA(&hspi1,tempBuf, 2);
2 h4 J: x! W2 ~
5 s( |( G1 c6 k+ S- st7735_write(tempBuf[1]);5 }9 u& x( C8 g u
- 2 U8 K7 d& t/ D* M
- CS_HIGH ;, j" P- I5 @7 {5 K4 m9 G7 g
- }
复制代码
L9 a: D' ]' B7 [; o
定义好这些参数后,在main.c中初始化st7735,然后写测试显示: - /* USER CODE BEGIN 2 */4 E& s" s) w; v6 D
) k9 {7 G! ?; L. y- printf("start U7575!\r\n");$ ?* ]9 z+ |0 |) Z$ {) e* ~
- tft_init();+ @7 S) f5 _' k% I$ U& X
- TFT_ShowChar(0,0,'A',WHITE,YELLOW,32);
, C0 U# f4 u" y$ y/ H4 [3 `# Y. |) F - LCD_ShowCharStr(0,32,128,(char *)str,WHITE,BLUE,32);
~) j, Q! b: a0 N8 K8 z. q! a - LCD_ShowCharStr(0,64,128,(char *)str3,WHITE,BLUE,24);
( _. [2 {* V, W ^ - LCD_ShowCharNumber(0,96,128,number,WHITE,RED,32);2 G% L" r$ e: `; Z d
- LCD_ShowCharStr(0,128,128,(char *)str2,RED,WHITE,16);
7 c( O# o. b* D - /* USER CODE END 2 */
4 w, E' E& _/ \4 H; I* p( Y# ^' ]
复制代码
& H! i4 M- n% n4 a% S( r
测试效果如图:
1 G) R% s& _$ X
0 ?' @. K& I- b# [9 a
+ [+ D; K3 C2 ^ A出处:社区用户:lugl发布8 `0 G* z+ j0 I) f [
. s: u5 {) S* E
: s; f3 f" w) ~- i& V |