|
硬件平台:1.8寸128x160 TFT屏(st7735驱动) 连线: /*
! M* h# t/ R) Q% `: h; H1 v * BL - PC8 D0& v% q: V6 t0 J* D; k6 R
* CS - PC9 D1/ u2 k- U/ i( `% U; z7 K" ?
* DC - PC11 D3
' k) r" [5 x. E& _/ t4 @7 f+ v4 @, G6 ` * RS - PD2 CMD
6 H2 A, M) n; Z( [- _2 M/ n * SCL -PC10 D2
3 c3 S9 {& X& G0 q3 Z/ L * SDA -PC12 CK
j5 v4 G4 ?3 Z# b0 @ */ 由于用spi硬件调试了好几次,要么SCK,不上拉就没有波形等。退而求次之用软件spi驱动。
8 ~) K9 u5 r' j, O( n
一、配置IO
& I9 C4 f6 R% s1 F 二、由stm32cubeIde生成工程后,加入st7735.h、st7735.c以及font.h* ^: K# Q2 X2 q& N! w7 {
. k9 h4 S( n7 ?) m$ Z* A1 K& b
3、宏定义,在stm7735.h中定义屏的6个引脚的高底电平:
3 \( e% X; L! p$ E8 o+ { n- //LCD片选脚& f- ^# ~& I2 r
- #define CS_HIGH HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_SET)! t" a0 d' j8 z
- #define CS_LOW HAL_GPIO_WritePin(ST7735_CS_GPIO_Port, ST7735_CS_Pin, GPIO_PIN_RESET): \/ G$ F0 \' `
- & p3 U. C7 O# \4 w3 ^. V1 l
- //指令数据选择脚 对应屏幕上面的a0脚 输出低电平,代表命令,高电平,代表数据) {6 ~& J( u4 P3 ~4 d$ B" [. r2 n
- #define COMMAND HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_RESET)
( J; q5 {+ z: ~/ |4 w8 f7 [5 h2 v, ?9 P - #define DATA HAL_GPIO_WritePin(ST7735_DC_GPIO_Port, ST7735_DC_Pin, GPIO_PIN_SET)
, `/ } y6 o! V' I! w - ' Z# }# R1 J: R7 G ~$ H
- //复位脚
3 B6 V5 y/ x6 M& P: F, q - #define reset_high HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_SET)
" z$ F, k$ d; v( _ ` - #define reset_low HAL_GPIO_WritePin(ST7735_RES_GPIO_Port, ST7735_RES_Pin, GPIO_PIN_RESET)" w* M8 z) w3 e a
- //背光脚
0 N( p) L1 F- y0 t: f1 d; M7 [ - #define led_high HAL_GPIO_WritePin(ST7735_BL_GPIO_Port,ST7735_BL_Pin,GPIO_PIN_SET)
) a! U2 y+ L0 G( U - #define led_low HAL_GPIO_WritePin(ST7735_BL_GPIO_Port,ST7735_BL_Pin,GPIO_PIN_RESET)
. [. f; a+ r' N/ |# Q- ?/ O - // SCL
* @1 C/ ^, |) E& n0 w - 4 d) b) c3 Y/ |
- #define LCD_SCLK_LOW HAL_GPIO_WritePin(ST7735_SCL_GPIO_Port, ST7735_SCL_Pin, GPIO_PIN_RESET)
0 ]6 C7 Q8 D/ |6 m - #define LCD_SCLK_HIGH HAL_GPIO_WritePin(ST7735_SCL_GPIO_Port, ST7735_SCL_Pin, GPIO_PIN_SET) t* b( R2 r, l) a) w# c
7 D: w1 v5 g& O$ C' g- // SDA
+ H: {" K( M" U# t9 f - 6 f' l8 c( M; f
- #define LCD_SDA_LOW HAL_GPIO_WritePin(ST7735_SDA_GPIO_Port, ST7735_SDA_Pin, GPIO_PIN_RESET)4 H) n6 \3 Z4 s5 @) X- c
- #define LCD_SDA_HIGH HAL_GPIO_WritePin(ST7735_SDA_GPIO_Port, ST7735_SDA_Pin, GPIO_PIN_SET)
复制代码 ; i, a8 M3 `/ s+ a2 w
1 b5 i; l# q, P7 Z8 k7 X6 [' n
4、定义spi向st7735发送命令的几个重要函数: - void st7735_write(uint8_t data)
! s3 v [( [5 G& D+ X) G; j3 k - {( [3 _& f% T2 d \* X& }1 a4 s, Q3 T
- uint8_t i;# \2 N4 |: [4 u" F
- for(i=0;i<8;i++)4 Y. A0 H* b* w% {# n
- {
8 W$ n5 w4 G! P' @! {, P - LCD_SCLK_LOW;4 j( @; i( z: L$ i+ Q4 l( n
- if(data&0x80)% ^7 a; R1 q C6 o9 z
- { t/ |$ y n8 P |
- LCD_SDA_HIGH;$ J0 y1 l2 A. N; l& y) [
- }
8 e8 p# A$ y' T, s8 m - else
, }- T: T) Q# i' a - {$ Q: n2 f. F; L
- LCD_SDA_LOW;
8 i, a7 D* M, d - }
- Y; q$ B: L( q - LCD_SCLK_HIGH;
3 h6 k8 k, `1 ^. X0 S - data<<=1;
& i( k7 x% g5 n( U: D6 O- {+ h - }$ o4 W5 o, h9 H' _6 x5 l
- }, e/ K2 A" d: I$ {" |
- //LCD屏幕写指令
$ s4 s( H1 i; t4 r - void TFT_WRITE_DATA(uint8_t data)" _% O4 w& E4 H4 h4 T! k* [( f( s
- {
% ~! S" P3 m/ m8 m; Z - CS_LOW;) w" F% Q3 {) E: b% L5 s
- DATA;4 Z) a; a8 G2 D s( ]8 Y
- st7735_write(data);' |) D6 x$ ^) G4 Y* M
- //HAL_SPI_Transmit(&hspi3, &data, 2, 20);
, }4 v+ n8 a5 W, m8 w - //HAL_SPI_Transmit_DMA(&hspi1,&data,1);
8 w8 R0 O: u/ `" m - CS_HIGH;& ]- p8 w& e% y5 r; {3 _
- , p Z1 B' ~7 {) J5 w, J1 R" ]# @
- }0 m0 A2 R2 g) r
- // LCD屏幕写指令
' s: i0 U6 t) z8 ~ - void TFT_WRITE_COMMAND(uint8_t command)
2 s5 n* C# ]6 M J1 [$ p - {
8 ?& w3 H/ @) Q- P% ` - CS_LOW;
* H: U7 B3 N2 ~: b0 g( |$ [ - COMMAND;+ {; c! P0 G" n, t2 j; D
- st7735_write(command);
, H4 U4 W1 i# C6 w - //HAL_SPI_Transmit(&hspi3, &command, 2, 20);, ^8 I+ ^3 z. \& T( ^
- //HAL_SPI_Transmit_DMA(&hspi1,&command,1);
' F5 s3 n# J" S9 m W - CS_HIGH;( s5 o; ?! v2 D" b" t! p- w' i% i
- }
8 h' D$ B7 K/ d, @
+ v" P8 v: L4 M- // 向对应的寄存机写入单个数�?
; g# {3 E; s7 s0 z - void TFT_WRITE_REG(uint8_t reg,uint16_t reg_value): x( ]- O/ h& f
- {% @" E i( K7 D! F. k
- TFT_WRITE_COMMAND(reg);% R0 e! _% w8 \/ Z
- TFT_WRITE_DATA(reg_value);
+ p1 s/ c5 L }& Q c6 V - 4 l, r0 E! K$ X" z3 f2 H' e7 y
5 z3 b& e6 h% _# q; ?: ?; `$ g! Z8 n+ |- }
1 R) `: F: x, B9 c - // 写入一个16位的数据
* O7 J( g, W. W% u- @- v - void TFT_WRITE_u16_DATA(uint16_t temp)! {! J; R2 ], p+ t
- {7 I; y+ t2 T, X c
- ' Q& X: C I. f" o) h3 J1 a0 w
- uint8_t tempBuf[2];
7 c9 U) `' J* m& Y9 ] - tempBuf[0] = temp>>8;. [2 [ }8 X4 Y6 V( R
- tempBuf[1] = temp;
* V8 |* F3 `, P* H; z/ l7 X - CS_LOW ;. o) h- V' k Q$ G1 S; E
- DATA ;
4 s$ k4 d; Z- x8 h% G' I - st7735_write(tempBuf[0]);
2 s/ q' N7 d* L9 J3 i% T
. S; A* T y& P9 K! p. }- //HAL_SPI_Transmit(&hspi3, &tempBuf, 4, 20);
* e. M) J3 w6 J- A$ u5 @, k - //HAL_SPI_Transmit_DMA(&hspi1,tempBuf, 2);3 q, `, a* o, Y/ i7 T
. J3 n- U7 m, t% O' r- st7735_write(tempBuf[1]);* o, c% o' s% v+ S
- ' e9 @+ {, d3 M( ^* F
- CS_HIGH ;
; Y5 X( s' R1 Y J W - }
复制代码+ b! t; X V) ^( }- K# l
定义好这些参数后,在main.c中初始化st7735,然后写测试显示: - /* USER CODE BEGIN 2 *// R4 R4 _0 f& W. _! m* v1 m. z
3 p, R' t# ?6 ~1 D- printf("start U7575!\r\n");$ n/ t4 t& W3 R u
- tft_init();3 B" d) J. a9 V, w
- TFT_ShowChar(0,0,'A',WHITE,YELLOW,32);
0 p$ J& O5 e3 l9 v) b7 ^% K - LCD_ShowCharStr(0,32,128,(char *)str,WHITE,BLUE,32);3 e+ M4 c: x0 P" O& q
- LCD_ShowCharStr(0,64,128,(char *)str3,WHITE,BLUE,24);5 O# y q, G8 A: }# |3 D$ z
- LCD_ShowCharNumber(0,96,128,number,WHITE,RED,32);3 z9 g6 r+ t+ Y1 }
- LCD_ShowCharStr(0,128,128,(char *)str2,RED,WHITE,16);
& l5 o. V4 }0 g4 W+ H) K, f, o - /* USER CODE END 2 */
) Q; R2 w. ?2 E; \! X8 _+ b
复制代码
3 x* `% Z; O/ I7 m. l) ]" T
测试效果如图: ) J* D" x. J5 |3 q/ s
5 v2 r4 u2 T/ \! G, p6 B7 P8 t) U& S% b/ d% O S8 }; H+ t
出处:社区用户:lugl发布
' O% L" S) a- _8 D- T4 g
9 G$ w$ V% A, Y- [
: r. P4 v5 J8 z. X( c) x |