[Cortex-M0技术交流] 【第四批】sh007笔记-SPI驱动1.8寸TFT

[复制链接]
5159|12
 楼主| sh007 发表于 2012-1-6 22:31 | 显示全部楼层 |阅读模式
本帖最后由 sh007 于 2012-1-6 22:36 编辑

最近公司上新项目,新平台很忙 都没写 真是惭愧!现在赶紧补上。
1.8寸TFT 是ST7735的驱动芯片,是SPI方式驱动,数据口只有五个。
赶紧上代码吧!
  

  



补几张照片 ,哈哈!

主文件

  1. #include <stdio.h>
  2. #include "NUC1xx.h"
  3. #include "DrvUART.h"
  4. #include "DrvSYS.h"
  5. #include "DrvSPI.h"
  6. #include "DrvPDMA.h"
  7. #include "SPI_FLASH_PDMA.h"
  8. #include "ST7735R_SPI.H"
  9. #include "Driver\DrvGPIO.h"
  10. #define    RW_LEN       80
  11. #define    DelayCnt      500

  12. extern void Test_picture(uint8_t *map);
  13. extern unsigned char gImage_hotpower[];
  14. extern unsigned char gImage_hotpage[];
  15. uint8_t SPI_PDMA_RXBuf[RW_LEN];
  16. uint8_t SPI_PDMA_TXBuf[RW_LEN];
  17. void  RCC_Config(void);
  18. void  UART_Config(void);

  19. int main()
  20. {
  21.     RCC_Config();
  22.     UART_Config();
  23.     SPI_Init();
  24.    printf("\n");
  25. printf("+----------------------------------------------------------------------+\n");  
  26. printf("|                 NUC120助学板之SPI ---TFT_ST7735                      |\n");
  27. printf("+----------------------------------------------------------------------+\n");
  28. printf("***NUC120***配置主频为: %2d MHz.\n",DrvSYS_GetHCLKFreq()/1000000);
  29. printf("---SPI0主机模式,频率为: %2d MHz.\n", DrvSPI_GetClock1Freq(eDRVSPI_PORT0)/1000000);
  30.     //设置PA5为输出,PA5为RESET
  31.     DrvGPIO_Open(E_GPB,10, E_IO_OUTPUT);
  32. GPIOB->DOUT &= ~(1 << 10);
  33. TFT_INIT();

  34. while(1)
  35. {
  36. RamAdressSet();
  37. TFT_Single_Colour(0xf800); //红
  38. delay(DelayCnt);
  39. RamAdressSet();
  40. TFT_Single_Colour(0x07e0); //绿
  41. delay(DelayCnt);
  42. RamAdressSet();
  43. TFT_Single_Colour(0x001f); //蓝
  44. delay(DelayCnt);
  45. RamAdressSet();
  46. TFT_Single_Colour(0xf81f); //黄
  47. delay(DelayCnt);
  48. RamAdressSet();
  49. TFT_Single_Colour(0xffe0); //青
  50. delay(DelayCnt);
  51. RamAdressSet();
  52. TFT_Single_Colour(0x07ff); //紫
  53. delay(DelayCnt);
  54. RamAdressSet();
  55. TFT_Single_Colour(0xffff); //白
  56. delay(DelayCnt);
  57.    Test_picture(gImage_hotpower) ; //大叔
  58.    delay(DelayCnt*5);
  59.    Test_picture(gImage_hotpage) ;  //大叔小孩
  60.    delay(DelayCnt*5);
  61.       
  62. }

  63. }
  64. void  RCC_Config(void)
  65. {
  66. UNLOCKREG();
  67.     SYSCLK->WRCON.XTL12M_EN = 1;
  68.     // Waiting for 12M Xtal stalble
  69.     DrvSYS_Delay(5000);
  70. //HCLK 为外部12M 通过PLL倍频到 50MHz.
  71. DrvSYS_Open(50000000);
  72. DrvSYS_Delay(5000);
  73. LOCKREG();
  74. }
  75. void UART_Config()
  76. {
  77.   STR_UART_T sParam;
  78. // Set UART I/O
  79. DrvGPIO_InitFunction(E_FUNC_UART0);
  80. //Select UART Clock Source From 12MHz
  81. DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);
  82. // UART Setting
  83.     sParam.u32BaudRate   = 9600;
  84.     sParam.u8cDataBits   = DRVUART_DATABITS_8;
  85.     sParam.u8cStopBits   = DRVUART_STOPBITS_1;
  86.     sParam.u8cParity   = DRVUART_PARITY_NONE;
  87.     sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;
  88. // Set UART Configuration
  89. DrvUART_Open(UART_PORT0, &sParam);
  90. }

SPI驱动TFT
  1. void LCD_Write_CMD(uint8_t CMDTmp)
  2. {
  3. uint32_t au32SourceData;
  4. //configure transaction length as 8 bits
  5. DrvSPI_SetBitLength(eDRVSPI_PORT0, 8);

  6. //CS =0
  7. RS_LOW;

  8. au32SourceData = CMDTmp;
  9. DrvSPI_SingleWrite(eDRVSPI_PORT0, &au32SourceData);
  10. // wait
  11. while (DrvSPI_IsBusy(eDRVSPI_PORT0)) {}

  12. }
  13. void LCD_Write_DATA8B(uint8_t DataTmp)
  14. {
  15. uint32_t au32SourceData;

  16. // configure transaction length as 8 bits
  17. DrvSPI_SetBitLength(eDRVSPI_PORT0, 8);

  18. //CS =1
  19. RS_HIGH;
  20. au32SourceData = DataTmp;
  21. DrvSPI_SingleWrite(eDRVSPI_PORT0, &au32SourceData);

  22. // wait
  23. while (DrvSPI_IsBusy(eDRVSPI_PORT0)) {}

  24. }

  25. void LCD_Write_DATA16B(uint16_t LCD_Data)
  26. {
  27. uint32_t au32SourceData;

  28. // configure transaction length as 8 bits
  29. DrvSPI_SetBitLength(eDRVSPI_PORT0, 16);

  30. //CS =1
  31. RS_HIGH;

  32. au32SourceData = LCD_Data;
  33. //while(!DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData)){}
  34. DrvSPI_SingleWrite(eDRVSPI_PORT0, &au32SourceData);
  35. // wait
  36. while (DrvSPI_IsBusy(eDRVSPI_PORT0)) {}

  37. }

  38. void TFT_RESET(void)
  39. {
  40. RESET_LOW;
  41. delay(100);
  42. RESET_HIGH;
  43. delay(100);
  44. }
  45. void TFT_INIT(void)
  46. {
  47. RESET_LOW;
  48. delay(10);
  49. RESET_HIGH;
  50. delay(10);

  51. //------------------------------------------------------------------//
  52. //-------------------Software Reset-------------------------------//
  53. //------------------------------------------------------------------//

  54. LCD_Write_CMD(0x11);//Sleep out
  55. delay(5);
  56. //ST7735R Frame Rate
  57. LCD_Write_CMD(0xB1);
  58. LCD_Write_DATA8B(0x01);
  59. LCD_Write_DATA8B(0x2C);
  60. LCD_Write_DATA8B(0x2D);
  61. LCD_Write_CMD(0xB2);
  62. LCD_Write_DATA8B(0x01);
  63. LCD_Write_DATA8B(0x2C);
  64. LCD_Write_DATA8B(0x2D);
  65. LCD_Write_CMD(0xB3);
  66. LCD_Write_DATA8B(0x01);
  67. LCD_Write_DATA8B(0x2C);
  68. LCD_Write_DATA8B(0x2D);
  69. LCD_Write_DATA8B(0x01);
  70. LCD_Write_DATA8B(0x2C);
  71. LCD_Write_DATA8B(0x2D);
  72. //------------------------------------End ST7735R Frame Rate-----------------------------------------//
  73. LCD_Write_CMD(0xB4);//Column inversion
  74. LCD_Write_DATA8B(0x07);
  75. //------------------------------------ST7735R Power Sequence-----------------------------------------//
  76. LCD_Write_CMD(0xC0);
  77. LCD_Write_DATA8B(0xA2);
  78. LCD_Write_DATA8B(0x02);
  79. LCD_Write_DATA8B(0x84);
  80. LCD_Write_CMD(0xC1);
  81. LCD_Write_DATA8B(0xC5);
  82. LCD_Write_CMD(0xC2);
  83. LCD_Write_DATA8B(0x0A);
  84. LCD_Write_DATA8B(0x00);
  85. LCD_Write_CMD(0xC3);
  86. LCD_Write_DATA8B(0x8A);
  87. LCD_Write_DATA8B(0x2A);
  88. LCD_Write_CMD(0xC4);
  89. LCD_Write_DATA8B(0x8A);
  90. LCD_Write_DATA8B(0xEE);
  91. //---------------------------------End ST7735R Power Sequence-------------------------------------//
  92. LCD_Write_CMD(0xC5);//VCOM
  93. LCD_Write_DATA8B(0x0E);
  94. LCD_Write_CMD(0x36);//MX, MY, RGB mode
  95. LCD_Write_DATA8B(0xC8);//C8 //自上而下,自左向右,BGR扫描显示。
  96. //------------------------------------ST7735R Gamma Sequence-----------------------------------------//
  97. LCD_Write_CMD(0xe0);
  98. LCD_Write_DATA8B(0x02);
  99. LCD_Write_DATA8B(0x1c);
  100. LCD_Write_DATA8B(0x07);
  101. LCD_Write_DATA8B(0x12);
  102. LCD_Write_DATA8B(0x37);
  103. LCD_Write_DATA8B(0x32);
  104. LCD_Write_DATA8B(0x29);
  105. LCD_Write_DATA8B(0x2d);
  106. LCD_Write_DATA8B(0x29);
  107. LCD_Write_DATA8B(0x25);
  108. LCD_Write_DATA8B(0x2b);
  109. LCD_Write_DATA8B(0x39);
  110. LCD_Write_DATA8B(0x00);
  111. LCD_Write_DATA8B(0x01);
  112. LCD_Write_DATA8B(0x03);
  113. LCD_Write_DATA8B(0x10);
  114. LCD_Write_CMD(0xe1);
  115. LCD_Write_DATA8B(0x03);
  116. LCD_Write_DATA8B(0x1d);
  117. LCD_Write_DATA8B(0x07);
  118. LCD_Write_DATA8B(0x06);
  119. LCD_Write_DATA8B(0x2e);
  120. LCD_Write_DATA8B(0x2c);
  121. LCD_Write_DATA8B(0x29);
  122. LCD_Write_DATA8B(0x2d);
  123. LCD_Write_DATA8B(0x2e);
  124. LCD_Write_DATA8B(0x2e);
  125. LCD_Write_DATA8B(0x37);
  126. LCD_Write_DATA8B(0x3f);
  127. LCD_Write_DATA8B(0x00);
  128. LCD_Write_DATA8B(0x00);
  129. LCD_Write_DATA8B(0x02);
  130. LCD_Write_DATA8B(0x10);

  131. LCD_Write_CMD(0x2A); //Column Address Set
  132. LCD_Write_DATA8B(0x00);
  133. LCD_Write_DATA8B(0x00);
  134. LCD_Write_DATA8B(0x00);
  135. LCD_Write_DATA8B(0x7F);

  136. LCD_Write_CMD(0x2B); //Row Address Set
  137. LCD_Write_DATA8B(0x00);
  138. LCD_Write_DATA8B(0x00); //01
  139. LCD_Write_DATA8B(0x00);
  140. LCD_Write_DATA8B(0x9F); //A0
  141. //------------------------------------End ST7735R Gamma Sequence-----------------------------------------//
  142. //设置显示色彩 12位(4k,03h),16位(65k,05h),18位(262k,06h)。
  143. LCD_Write_CMD(0x3A);
  144. LCD_Write_DATA8B(0x05); //262k mode
  145. LCD_Write_CMD(0x29);//Display on
  146. delay(10);
  147. }

  148. void RamAdressSet(void)
  149. {
  150. LCD_Write_CMD(0x2A);
  151. LCD_Write_DATA8B(0x00);
  152. LCD_Write_DATA8B(0x02);
  153. LCD_Write_DATA8B(0x00);
  154. LCD_Write_DATA8B(0x81);

  155. LCD_Write_CMD(0x2B);
  156. LCD_Write_DATA8B(0x00);
  157. LCD_Write_DATA8B(0x01);
  158. LCD_Write_DATA8B(0x00);
  159. LCD_Write_DATA8B(0xA0);

  160. LCD_Write_CMD(0x2C);//Write DATA TO RAM
  161. }


  162. void LCD_DataWrite(uint8_t LCD_DataH,uint8_t LCD_DataL)
  163. {
  164. LCD_Write_DATA8B(LCD_DataH);
  165. LCD_Write_DATA8B(LCD_DataL);
  166. }


  167. void TFT_Single_Colour(uint16_t SCDATA)
  168. {
  169. uint8_t i,j;
  170. for (i=0;i<128;i++)
  171. for (j=0;j<160;j++)
  172. LCD_Write_DATA16B(SCDATA);
  173. }

  174. void Test_picture(uint8_t *map)
  175. {
  176. int j;
  177. RamAdressSet();
  178. for(j=0;j<(128*160);j++)
  179. LCD_DataWrite(map[2*j+1],map[2*j]);
  180. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| sh007 发表于 2012-1-6 22:40 | 显示全部楼层
加上代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lwslws201 发表于 2012-1-6 22:41 | 显示全部楼层
:)  帮顶把!
hotpower 发表于 2012-1-7 00:06 | 显示全部楼层
很好!
feiyinglala 发表于 2012-1-7 00:25 | 显示全部楼层
哎呀,后辈对您的佩服如滔滔江水
ljhtj 发表于 2012-1-7 09:26 | 显示全部楼层
好,支持
封剑藏刀 发表于 2012-1-7 20:24 | 显示全部楼层
不错,那个屏的价格怎么样。
Swallow_0322 发表于 2012-1-8 19:33 | 显示全部楼层
顶!很不错!
ddllxxrr 发表于 2012-1-14 18:03 | 显示全部楼层
真不错,楼主辛苦啦
jasontu 发表于 2012-1-30 16:07 | 显示全部楼层
不知你這樣的frame rate 如何?
lixiaoxu2meng 发表于 2012-1-30 16:50 | 显示全部楼层
 楼主| sh007 发表于 2012-2-5 19:25 | 显示全部楼层
这个没认真算过,这种只能说学习用,做产品 是不太现实的。除非要求不高! 10# jasontu
cnjxlxp 发表于 2012-2-9 21:11 | 显示全部楼层
请问能不能上传屏的手册和如何连接屏和MCU的电路图,或者说明那个引脚接哪个引脚啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

174

帖子

1

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