|
硬件平台:1.8寸128x160 TFT屏(st7735驱动) 连线: /*
0 _- ?8 V [: p5 N! J, _ * BL - PC8 D0
& F# [4 I8 v: x* g6 m. _. d; R7 _2 P * CS - PC9 D1( U# X2 f4 w3 w7 r) ?6 t
* DC - PC11 D3
- |0 z8 `$ x2 T; K * RS - PD2 CMD
2 j) H9 [" z0 e+ R. _ * SCL -PC10 D2
- [0 v$ M: l. y4 o. w; z * SDA -PC12 CK. B; O) S6 P% v4 k
*/ 由于用spi硬件调试了好几次,要么SCK,不上拉就没有波形等。退而求次之用软件spi驱动。
6 b* Q3 D; I$ \0 f' \6 B
一、配置IO
1 u* D5 B" W9 B% T l 二、由stm32cubeIde生成工程后,加入st7735.h、st7735.c以及font.h
5 W& F) H( y4 i0 i% z0 @1 h
# f r m7 j0 J7 `
3、宏定义,在stm7735.h中定义屏的6个引脚的高底电平:4 M! M/ l2 p" I1 F
- //LCD片选脚! S, Z6 a' ^9 s$ ~6 e
- #define CS_HIGH HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_SET)# k. D. K8 p0 Q5 I: m7 O7 V
- #define CS_LOW HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_RESET)
$ z" H3 z3 u u& X8 m. i& [. P
" O! w7 J& p, |' z: _7 i- //指令数据选择脚 对应屏幕上面的a0脚 输出低电平,代表命令,高电平,代表数据
$ Q; w* t# Y1 Y5 v! H5 W) ?1 {5 l - #define COMMAND HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_RESET)6 M0 E j1 ?7 v6 d+ f- h
- #define DATA HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_SET)
- M g+ C- w. p - 6 J c" Z/ c4 @" N
- //复位脚
! C1 r/ i; z8 k2 I4 @ - #define reset_high HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_SET) m7 Q0 V- w# K: S' H% |; o7 u. d
- #define reset_low HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_RESET)* b, M$ O9 J: l8 S. q& @6 I
- //背光脚" N3 u$ s3 x; ~1 }; B, g' |: ^4 e
- #define led_high HAL_GPIO_WritePin(ST7735_BL_GPIO_Port,ST7735_BL_Pin,GPIO_PIN_SET)
3 @ A& a! {1 l+ r \% N8 r: A! { - #define led_low HAL_GPIO_WritePin(ST7735_BL_GPIO_Port,ST7735_BL_Pin,GPIO_PIN_RESET)
) e2 V% V. ]& q2 O# V- T - // SCL& {# \3 b. d" u- i! H6 n
- + A, y7 o+ j9 [5 q1 [6 U
- #define LCD_SCLK_LOW HAL_GPIO_WritePin(ST7735_SCL_GPIO_Port, ST7735_SCL_Pin, GPIO_PIN_RESET)+ e. z# b' t4 K7 `$ |5 c
- #define LCD_SCLK_HIGH HAL_GPIO_WritePin(ST7735_SCL_GPIO_Port, ST7735_SCL_Pin, GPIO_PIN_SET)
: H9 r) }; t- [7 K1 h; z - 6 I" w$ |* \% P9 K% a6 h" w
- // SDA
. y/ i8 G4 i O+ B2 D& d
4 H! A. L: x3 R, T- #define LCD_SDA_LOW HAL_GPIO_WritePin(ST7735_SDA_GPIO_Port, ST7735_SDA_Pin, GPIO_PIN_RESET)* u. p% @8 S9 @& s
- #define LCD_SDA_HIGH HAL_GPIO_WritePin(ST7735_SDA_GPIO_Port, ST7735_SDA_Pin, GPIO_PIN_SET)
复制代码 2 ]0 K. n# L1 F2 k$ h- j: T( {
2 @6 r3 H3 ^, {
4、定义spi向st7735发送命令的几个重要函数: - void st7735_write(uint8_t data)) p- y! n# E! v9 I; ]4 }
- {
1 U: {" i. Z) D: I - uint8_t i;8 `4 [ P5 |; m3 l6 |: @( S% g2 C3 n: \3 R
- for(i=0;i<8;i++)
2 B3 D2 ^2 A I% S4 O - {! T+ d+ @3 ^& u' E
- LCD_SCLK_LOW;8 O4 H% H3 K5 D9 O% E1 m1 T
- if(data&0x80)& @0 c" a* g! d9 q' y% T! p# k
- {
$ u0 U1 o' \# r - LCD_SDA_HIGH;
, P2 U: w3 p0 o. Z, k3 Z/ l7 \ - }
3 n" h! s: U0 c# u - else
- N9 f6 t. Z+ D. `5 O: \; O! o5 P9 T - {* w H5 E* K' Q2 i& X
- LCD_SDA_LOW;
- ~9 B5 L/ v$ G9 _; K/ k2 a" F8 S+ H - }4 [0 d. p4 H/ I4 j5 J
- LCD_SCLK_HIGH;+ y Y8 H0 e6 k$ c
- data<<=1;% R/ _( y& }! T) T2 J
- }
0 O6 {8 E$ V, g/ { - }
1 f! |: W5 f% H - //LCD屏幕写指令$ R6 w' ^( U. B" c3 \
- void TFT_WRITE_DATA(uint8_t data)6 D) I8 R/ B! z7 W% o5 C
- {
& Y* B: K: C5 V1 }; z1 }, D. u - CS_LOW; s1 R7 }. O: `3 M/ L
- DATA;- t6 b; t: k$ ?5 K8 }
- st7735_write(data);, ?0 t8 S7 k: K% {* F3 t
- //HAL_SPI_Transmit(&hspi3, &data, 2, 20);
+ V$ R: X- ~7 ?8 i" L - //HAL_SPI_Transmit_DMA(&hspi1,&data,1);; x- u) B$ z b- l
- CS_HIGH;
4 w7 G4 [7 B8 C, G - : W4 }( W2 P' E+ q3 Z! E0 i
- }
, \* a. `9 A+ {& J$ V) O, Q( d+ Q - // LCD屏幕写指令0 Q0 h8 S% O* a; n: l
- void TFT_WRITE_COMMAND(uint8_t command)
# Q; X$ [. _6 K3 ^9 @0 W - {
" s2 X$ x S) G - CS_LOW;6 p" Q! ]: G J
- COMMAND;
3 w5 r6 S$ r: S i- o) E6 u1 d9 g - st7735_write(command);* c; o M. k: l% C9 \7 u
- //HAL_SPI_Transmit(&hspi3, &command, 2, 20);
8 @" [1 U( B' j- `! y - //HAL_SPI_Transmit_DMA(&hspi1,&command,1);
; B* C4 m! i& M. k, q( I - CS_HIGH;; o) v1 a8 V) {
- }
- u' z0 u- e1 L& L" a# s. t- E3 _ Y
& n4 f. l0 m# g) k- // 向对应的寄存机写入单个数�?
! q9 I. D! I0 G' n9 ^ - void TFT_WRITE_REG(uint8_t reg,uint16_t reg_value)0 N6 Q1 [/ a6 ^$ j4 Y
- {
+ h# h- q$ _# N$ [# l' ?5 i5 w" B - TFT_WRITE_COMMAND(reg);
( n) M) }! y4 W1 M) a: ` - TFT_WRITE_DATA(reg_value);( A1 O6 [' }" G% o$ v7 o
# e. n2 L6 o- R6 O1 ?0 I8 B$ _, S1 Z: k
4 ]$ G+ D* z G- }
; g& ]2 s% w {( `- Z - // 写入一个16位的数据6 C. K; g4 H! f) ]: o% }
- void TFT_WRITE_u16_DATA(uint16_t temp)
, i$ S. `# A, T3 X - {2 t, h9 V, g. V
- & q% g& Y( x1 v, v
- uint8_t tempBuf[2];
! Y4 y5 f" x& _ Y8 R5 a - tempBuf[0] = temp>>8;
& V8 j8 n; x/ C3 s+ q - tempBuf[1] = temp;( _ O/ x6 p7 |/ n" Q1 E4 _: j% B6 p
- CS_LOW ;8 E$ i p& M6 z! o! b
- DATA ;% i% F. d! e4 ]) ]3 u; D3 Y
- st7735_write(tempBuf[0]);
& U8 d5 |" o r# v - : e: E3 D( m' i0 d
- //HAL_SPI_Transmit(&hspi3, &tempBuf, 4, 20);
4 c1 t* E4 K$ g1 `% b9 j - //HAL_SPI_Transmit_DMA(&hspi1,tempBuf, 2);2 S* `1 W" R) t9 {6 I0 E5 d5 K4 n+ n
: q3 W5 P1 T7 r( I& f: H: A- st7735_write(tempBuf[1]);. ?9 W8 a7 L8 \ k! \' n
- ( A+ I9 ^6 z, C
- CS_HIGH ;
; ~2 E6 _5 V9 L! H$ _ - }
复制代码
6 g( F. [: v; u! f5 T
定义好这些参数后,在main.c中初始化st7735,然后写测试显示: - /* USER CODE BEGIN 2 */) }( f% J; r+ N6 [, I
z) b* N+ i# T- printf("start U7575!\r\n");
' Z6 O3 x5 u9 [8 ]8 V - tft_init();
" _9 _9 D3 s' a$ ^ - TFT_ShowChar(0,0,'A',WHITE,YELLOW,32);' n* R) K [7 {8 a
- LCD_ShowCharStr(0,32,128,(char *)str,WHITE,BLUE,32);
r" p* C3 h9 J4 w - LCD_ShowCharStr(0,64,128,(char *)str3,WHITE,BLUE,24);; w+ O- l9 Z2 c _4 B5 A {
- LCD_ShowCharNumber(0,96,128,number,WHITE,RED,32);
$ [* z7 v' N; A8 I - LCD_ShowCharStr(0,128,128,(char *)str2,RED,WHITE,16);
) u. H) B4 D: v - /* USER CODE END 2 */
4 Z' J; f1 x2 l( ]. T
复制代码+ u r5 E" Q) b& @
测试效果如图: 4 E7 [8 l/ y0 _. w, y B2 d
. g; q6 a4 G5 C( J5 E* Z
. y* S6 d' r& U* r9 ^! x. L
出处:社区用户:lugl发布8 e( V) B8 d$ M# X4 y# D6 x
6 y. U( ]# q( r
: p4 v8 B# P* _; s7 M4 ^3 q+ i0 { |