一個(gè)簡(jiǎn)單的stm32vet6驅(qū)動(dòng)的天馬4線SPI-1.77寸LCD彩屏DEMO
書(shū)接上文《1、一個(gè)簡(jiǎn)單的nRF51822驅(qū)動(dòng)的天馬4線SPI-1.77寸LCD彩屏DEMO》
我們發(fā)現(xiàn)用16MHz晶振的nRF51822驅(qū)動(dòng)1.77寸的spi速度達(dá)不到要求
本節(jié)主要采用72MHz的stm32嘗試刷屏效果
工程結(jié)構(gòu)如下:
注:整個(gè)工程最重要的部分在USR中,其它是必須!
首先是LCD.c:
1、類(lèi)似與用nRF51822做的彩屏驅(qū)動(dòng),這里主要的不同點(diǎn)在于引腳的初始化~
2、同時(shí),為了使刷屏速度更快點(diǎn),在39~46行將原來(lái)的循環(huán)拆成了8行命令~
3、沒(méi)寫(xiě)的地方和基于nRF51的一樣,上一篇說(shuō)的很詳細(xì)
1 #include "LCD.h"
2
3
4 void LCD_GPIO_Init()
5 {
6 GPIO_InitTypeDef GPIO_InitStructure;
7
8 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA " RCC_APB2Periph_AFIO, ENABLE);
9
10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
11 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
12 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口線翻轉(zhuǎn)速度為50MHz
13 GPIO_Init(GPIOA, &GPIO_InitStructure);
14 }
15
16 ////////////////////////////////////////////////////////////////////////////////////
17 //下面是SPI函數(shù)及實(shí)現(xiàn)LCD通信基礎(chǔ)的寫(xiě)數(shù)據(jù)和寫(xiě)命令函數(shù)
18 //有了這兩個(gè)函數(shù)就能實(shí)現(xiàn)復(fù)雜的LCD初始化和GUI了
19 ////////////////////////////////////////////////////////////////////////////////////
20 /*
21 SPI Send Data
22 */
23 void SendDataSPI(unsigned char DatByte)
24 {
25 // unsigned char i;
26 // for(i = 0; i < 8; i++)
27 // {
28 // if((dat&0x80)!=0)SDA_SET;
29 // else SDA_CLEAR;
30
31 // dat <<= 1;
32
33 // SCL_CLEAR;
34 // SCL_SET;
35 // }
36 int bit;
37
38
39 bit = DatByte >> 7; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
40 bit = DatByte >> 6; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
41 bit = DatByte >> 5; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
42 bit = DatByte >> 4; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
43 bit = DatByte >> 3; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
44 bit = DatByte >> 2; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
45 bit = DatByte >> 1; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
46 bit = DatByte >> 0; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
47
48 }
49
50 /*
51 LCD WRITE COMMAND AND DATA
52 */
53 void WriteComm(unsigned int i)
54 { 59 }
60 void WriteData(unsigned int i)
61 { 66 }
67
68 /*
69 寫(xiě)顯示數(shù)據(jù)向屏幕(屏幕顯示數(shù)據(jù)需要2字節(jié))
70 */
71 void WriteDispData(unsigned char DataH, unsigned char DataL)
72 { 75 }
76 ////////////////////////////////////////////////////////////////////////////////////
77
78 /*
79 LCD初始化函數(shù)
80 */
81 void LCD_Init(void)
82 {173 }
174
175 /*
176 LCD塊寫(xiě)(大量數(shù)據(jù)修改,相當(dāng)于擦除)
177 */
178 void BlockWrite(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend)
179 {194 }
195
196
197 /*
198 LCD顯示顏色(顏色已在.h文件中定義)
199 */
200 void DispColor(unsigned int color)
201 {216 }
217
218
219 /*
220 寫(xiě)一個(gè)點(diǎn)(帶顏色)
221 */
222 void WriteOneDot(unsigned int color)
223 {231 }
232
233 ////////////////////////////////////////////////////////////////////////////////////
234
235
236 /*
237 繪制一個(gè)像素點(diǎn)
238 */
239 void PutPixel(unsigned int x, unsigned int y, unsigned int color)
240 {247 }
248
249 /*
250 繪制一片區(qū)域(名字為線,其實(shí)可以刷一個(gè)面)
251 */
252 void DrawLine(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend, unsigned int color)
253 {265 }
266
267 void Delay_ms(u16 time)
268 {
269 u16 i=0;
270 while(time--)
271 {
272 i=12000;
273 while(i--);
274 }
275 }
同樣的為了適配stm32,.H文件中宏定義也做了相應(yīng)調(diào)整:
1、藍(lán)色部分引腳高低電平宏定義是根據(jù)stm引腳設(shè)置特性做的修改~
2、黃色部分是為了使stm32的引腳能夠像51單片機(jī)一樣直接給賦值,如:LCD_CS=0或LCD_CS=1
3、其他部分沒(méi)變,這就說(shuō)明了之前我們用宏定義的好處了~
1 #include "stm32f10x.h"
2
3
4
5 /*
6 引腳高低電平宏定義
7 */
8 #define CS_SET GPIO_SetBits(GPIOA, GPIO_Pin_0)//GPIO_Mode_Out_PP
9 #define CS_CLEAR GPIO_ResetBits(GPIOA, GPIO_Pin_0)//普通推挽輸出
10 #define RS_SET GPIO_SetBits(GPIOA, GPIO_Pin_1)
11 #define RS_CLEAR GPIO_ResetBits(GPIOA, GPIO_Pin_1)
12 #define RET_SET GPIO_SetBits(GPIOA, GPIO_Pin_2)
13 #define RET_CLEAR GPIO_ResetBits(GPIOA, GPIO_Pin_2)
14 #define SCL_SET GPIO_SetBits(GPIOA, GPIO_Pin_3)//GPIO_Mode_AF_PP
15 #define SCL_CLEAR GPIO_ResetBits(GPIOA, GPIO_Pin_3)//復(fù)用推挽輸出
16 #define SDA_SET GPIO_SetBits(GPIOA, GPIO_Pin_4)
17 #define SDA_CLEAR GPIO_ResetBits(GPIOA, GPIO_Pin_4)
18
19 #define BitBand(Addr, Bit) *((volatile int*)(((int)(Addr) & 0x60000000) + 0x02000000 + (int)(Addr) * 0x20 + (Bit) * 4))
20 #define LCD_CS BitBand(&GPIOA->ODR, 0)
21 #define LCD_RS BitBand(&GPIOA->ODR, 1)
22 #define LCD_SDA BitBand(&GPIOA->ODR, 4)
23 #define LCD_SCK BitBand(&GPIOA->ODR, 3)
24
25 /*
26 宏定義等待函數(shù)
27 */
28 #define DELAY_MS(n) Delay_ms(n)
29
30 //-------------------------------------------------------------
31 #define ROW 160 //顯示的行、列數(shù)
32 #define COL 128
33
34
35 #define BLUE 0xF800 //定義顏色常量
36 #define GREEN 0x07E0
37 #define RED 0x001F
38 #define WHITE 0xFFFF
39 #define BLACK 0x0000
40 #define GRAY 0xEF5D //0x2410
41 #define GRAY75 0x39E7
42 #define GRAY50 0x7BEF
43 #define GRAY25 0xADB5
44
45 void Delay(u16 time);
46 void Delay_ms(u16 time);
47 void DrawLine(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend, unsigned int color);
48 void PutPixel(unsigned int x, unsigned int y, unsigned int color);
49 void WriteOneDot(unsigned int color);
50 void DispColor(unsigned int color);
51 void BlockWrite(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend);
52 void LCD_Init(void);
53 void WriteDispData(unsigned char DataH, unsigned char DataL);
54 void LCD_GPIO_Init(void);
這樣在main函數(shù)中只要簡(jiǎn)單調(diào)用即可:
1 #include "stm32f10x.h"
2 #include "LCD.h"
3
4
5 void RCC_Configuration(void);
6
7
8 int main(void)
9 {
10 RCC_Configuration(); //系統(tǒng)時(shí)鐘配置
11 LCD_GPIO_Init();
12 // Delay_ms(5000);
13 LCD_Init();
14 while (1>0)
15 {
16 DispColor(RED);
17 Delay_ms(1000);
18 DispColor(BLUE);
19 Delay_ms(1000);
20 }
21 }
22
23 void RCC_Configuration(void)//系統(tǒng)時(shí)鐘配置為72MHZ
24 {
25 SystemInit();
26 }
小結(jié):
從上面視頻來(lái)看即使改成了STM32,驅(qū)動(dòng)SPI屏幕還是不能實(shí)現(xiàn)肉眼分辨不出的刷屏效果
接下來(lái)試著采用并口數(shù)據(jù)傳輸試試~