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

[复制链接]
 楼主| comparison 发表于 2020-1-5 17:00 | 显示全部楼层 |阅读模式
本节主要采用72MHz的stm32尝试刷屏效果
工程结构如下:
506370-20151126213147874-123491732.jpg
注:整个工程最重要的部分在USR中,其它是必须!

 楼主| comparison 发表于 2020-1-5 17:00 | 显示全部楼层
首先是LCD.c:

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

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

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

  1. #include "LCD.h"


  2. void LCD_GPIO_Init()
  3. {
  4.     GPIO_InitTypeDef GPIO_InitStructure;

  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  6.    
  7.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  9.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;             //口线翻转速度为50MHz
  10.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  11. }

  12. ////////////////////////////////////////////////////////////////////////////////////
  13. //下面是SPI函数及实现LCD通信基础的写数据和写命令函数
  14. //有了这两个函数就能实现复杂的LCD初始化和GUI了
  15. ////////////////////////////////////////////////////////////////////////////////////
  16. /*
  17. SPI Send Data
  18. */
  19. void SendDataSPI(unsigned char DatByte)
  20. {
  21. //    unsigned char i;
  22. //    for(i = 0; i < 8; i++)
  23. //    {
  24. //        if((dat&0x80)!=0)SDA_SET;
  25. //        else SDA_CLEAR;

  26. //        dat <<= 1;

  27. //        SCL_CLEAR;
  28. //        SCL_SET;
  29. //    }
  30.        int bit;        


  31.     bit = DatByte >> 7; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
  32.     bit = DatByte >> 6; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
  33.     bit = DatByte >> 5; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
  34.     bit = DatByte >> 4; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
  35.     bit = DatByte >> 3; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
  36.     bit = DatByte >> 2; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
  37.     bit = DatByte >> 1; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
  38.     bit = DatByte >> 0; LCD_SCK = 0; LCD_SDA = bit; LCD_SCK = 1;
  39.             
  40. }

  41. /*
  42. LCD WRITE COMMAND AND DATA
  43. */
  44. void WriteComm(unsigned int i)
  45. { 59 }
  46. void WriteData(unsigned int i)
  47. { 66 }

  48. /*
  49. 写显示数据向屏幕(屏幕显示数据需要2字节)
  50. */
  51. void WriteDispData(unsigned char DataH, unsigned char DataL)
  52. { 75 }
  53. ////////////////////////////////////////////////////////////////////////////////////

  54. /*
  55. LCD初始化函数
  56. */
  57. void LCD_Init(void)
  58. {173 }

  59. /*
  60. LCD块写(大量数据修改,相当于擦除)
  61. */
  62. void BlockWrite(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend)
  63. {194 }


  64. /*
  65. LCD显示颜色(颜色已在.h文件中定义)
  66. */
  67. void DispColor(unsigned int color)
  68. {216 }


  69. /*
  70. 写一个点(带颜色)
  71. */
  72. void WriteOneDot(unsigned int color)
  73. {231 }

  74. ////////////////////////////////////////////////////////////////////////////////////


  75. /*
  76. 绘制一个像素点
  77. */
  78. void PutPixel(unsigned int x, unsigned int y, unsigned int color)
  79. {247 }

  80. /*
  81. 绘制一片区域(名字为线,其实可以刷一个面)
  82. */
  83. void DrawLine(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend, unsigned int color)
  84. {265 }

  85. void Delay_ms(u16 time)
  86. {
  87.     u16 i=0;  
  88.     while(time--)
  89.     {
  90.         i=12000;
  91.         while(i--);   
  92.     }
  93. }
 楼主| comparison 发表于 2020-1-5 17:00 | 显示全部楼层
同样的为了适配stm32,.H文件中宏定义也做了相应调整:

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

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

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

  1. #include "stm32f10x.h"



  2. /*
  3. 引脚高低电平宏定义
  4. */
  5. #define CS_SET        GPIO_SetBits(GPIOA, GPIO_Pin_0)//GPIO_Mode_Out_PP  
  6. #define CS_CLEAR     GPIO_ResetBits(GPIOA, GPIO_Pin_0)//普通推挽输出
  7. #define RS_SET        GPIO_SetBits(GPIOA, GPIO_Pin_1)  
  8. #define RS_CLEAR     GPIO_ResetBits(GPIOA, GPIO_Pin_1)
  9. #define RET_SET        GPIO_SetBits(GPIOA, GPIO_Pin_2)
  10. #define RET_CLEAR     GPIO_ResetBits(GPIOA, GPIO_Pin_2)
  11. #define SCL_SET        GPIO_SetBits(GPIOA, GPIO_Pin_3)//GPIO_Mode_AF_PP
  12. #define SCL_CLEAR     GPIO_ResetBits(GPIOA, GPIO_Pin_3)//复用推挽输出
  13. #define SDA_SET        GPIO_SetBits(GPIOA, GPIO_Pin_4)
  14. #define SDA_CLEAR     GPIO_ResetBits(GPIOA, GPIO_Pin_4)

  15. #define BitBand(Addr, Bit) *((volatile int*)(((int)(Addr) & 0x60000000) + 0x02000000 + (int)(Addr) * 0x20 + (Bit) * 4))
  16. #define LCD_CS          BitBand(&GPIOA->ODR, 0)
  17. #define LCD_RS          BitBand(&GPIOA->ODR, 1)
  18. #define LCD_SDA         BitBand(&GPIOA->ODR, 4)
  19. #define LCD_SCK         BitBand(&GPIOA->ODR, 3)

  20. /*
  21. 宏定义等待函数
  22. */
  23. #define DELAY_MS(n) Delay_ms(n)

  24. //-------------------------------------------------------------
  25. #define ROW  160            //显示的行、列数
  26. #define COL  128


  27. #define BLUE   0xF800         //定义颜色常量
  28. #define GREEN  0x07E0
  29. #define RED    0x001F
  30. #define WHITE  0xFFFF
  31. #define BLACK  0x0000
  32. #define GRAY   0xEF5D         //0x2410
  33. #define GRAY75 0x39E7
  34. #define GRAY50 0x7BEF   
  35. #define GRAY25 0xADB5

  36. void Delay(u16 time);
  37. void Delay_ms(u16 time);
  38. void DrawLine(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend, unsigned int color);
  39. void PutPixel(unsigned int x, unsigned int y, unsigned int color);
  40. void WriteOneDot(unsigned int color);
  41. void DispColor(unsigned int color);
  42. void BlockWrite(unsigned int Xstart, unsigned int Xend, unsigned int Ystart, unsigned int Yend);
  43. void LCD_Init(void);
  44. void WriteDispData(unsigned char DataH, unsigned char DataL);
  45. void LCD_GPIO_Init(void);
 楼主| comparison 发表于 2020-1-5 17:02 | 显示全部楼层
这样在main函数中只要简单调用即可:

  1. #include "stm32f10x.h"
  2. #include "LCD.h"


  3. void RCC_Configuration(void);


  4. int main(void)
  5. {
  6.     RCC_Configuration();                   //系统时钟配置
  7.     LCD_GPIO_Init();
  8. //    Delay_ms(5000);
  9.     LCD_Init();
  10.     while (1>0)
  11.     {        
  12.         DispColor(RED);
  13.         Delay_ms(1000);
  14.         DispColor(BLUE);
  15.         Delay_ms(1000);
  16.     }
  17. }

  18. void RCC_Configuration(void)//系统时钟配置为72MHZ
  19. {   
  20.   SystemInit();
  21. }
 楼主| comparison 发表于 2020-1-5 17:02 | 显示全部楼层
小结:

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

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



本节工程链接:http://pan.baidu.com/s/1gdfkwoz
renzheshengui 发表于 2020-2-3 11:29 | 显示全部楼层
非常感谢楼主分享
wakayi 发表于 2020-2-3 11:33 | 显示全部楼层
非常感谢楼主分享
wowu 发表于 2020-2-3 11:46 | 显示全部楼层
非常感谢楼主分享
xiaoqizi 发表于 2020-2-3 12:02 | 显示全部楼层
非常感谢楼主分享
木木guainv 发表于 2020-2-3 12:22 | 显示全部楼层
非常感谢楼主分享
磨砂 发表于 2020-2-3 16:34 | 显示全部楼层
非常感谢楼主分享
晓伍 发表于 2020-2-3 16:35 | 显示全部楼层
非常感谢楼主分享
八层楼 发表于 2020-2-3 16:36 | 显示全部楼层
非常感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

417

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部