• [stm32] 一个简单的stm32vet6驱动的天马4线SPI-1.77寸LCD彩屏DEMO


    接上文《1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO》

    我们发现用16MHz晶振的nRF51822驱动1.77寸的spi速度达不到要求

    本节主要采用72MHz的stm32尝试刷屏效果

    效果如下:

    工程结构如下:

    注:整个工程最重要的部分在USR中,其它是必须!

    首先是LCD.c:

    1、类似与用nRF51822做的彩屏驱动,这里主要的不同点在于引脚的初始化~

    2、同时,为了使刷屏速度更快点,在39~46行将原来的循环拆成了8行命令~

    3、没写的地方和基于nRF51的一样,上一篇说的很详细

      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;             //口线翻转速度为50MHz
     13     GPIO_Init(GPIOA, &GPIO_InitStructure);
     14 }
     15 
     16 ////////////////////////////////////////////////////////////////////////////////////
     17 //下面是SPI函数及实现LCD通信基础的写数据和写命令函数
     18 //有了这两个函数就能实现复杂的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 写显示数据向屏幕(屏幕显示数据需要2字节)
     70 */
     71 void WriteDispData(unsigned char DataH, unsigned char DataL)
     72 { 75 }
     76 ////////////////////////////////////////////////////////////////////////////////////
     77 
     78 /*
     79 LCD初始化函数
     80 */
     81 void LCD_Init(void)
     82 {173 }
    174 
    175 /*
    176 LCD块写(大量数据修改,相当于擦除)
    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 写一个点(带颜色)
    221 */
    222 void WriteOneDot(unsigned int color)
    223 {231 }
    232 
    233 ////////////////////////////////////////////////////////////////////////////////////
    234 
    235 
    236 /*
    237 绘制一个像素点
    238 */
    239 void PutPixel(unsigned int x, unsigned int y, unsigned int color)
    240 {247 }
    248 
    249 /*
    250 绘制一片区域(名字为线,其实可以刷一个面)
    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文件中宏定义也做了相应调整:

    1、蓝色部分引脚高低电平宏定义是根据stm引脚设置特性做的修改~

    2、黄色部分是为了使stm32的引脚能够像51单片机一样直接给赋值,如:LCD_CS=0或LCD_CS=1

    3、其他部分没变,这就说明了之前我们用宏定义的好处了~

     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)//复用推挽输出
    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 宏定义等待函数
    27 */
    28 #define DELAY_MS(n) Delay_ms(n)
    29 
    30 //-------------------------------------------------------------
    31 #define ROW  160            //显示的行、列数
    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函数中只要简单调用即可:

     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();                   //系统时钟配置
    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)//系统时钟配置为72MHZ
    24 {   
    25   SystemInit();
    26 }

    小结:

    从上面视频来看即使改成了STM32,驱动SPI屏幕还是不能实现肉眼分辨不出的刷屏效果

    接下来试着采用并口数据传输试试~

    本节工程链接:http://pan.baidu.com/s/1gdfkwoz

    @beautifulzzzz 

      2015-11-26 持续更新中~

  • 相关阅读:
    linux学习(三)输入输出重定向和管道功能、cat命令、more命令
    linux基础学习(二)ls命令以及文件访问权限例(-rw-r-r--)
    c语言的全排列
    linux基础学习(一)常用命令:date、pwd、cd、cal、who、wc等等
    用linux编译并运行c文件
    安装linux虚拟机
    安装quickLook插件以及解决如何不能读取offic问题
    java:数据结构(四)二叉查找树以及树的三种遍历
    java:数据结构复习(三)链表队列
    数据结构java学习(三)循环队列
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/4998997.html
Copyright © 2020-2023  润新知