欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4743|回復: 3
打印 上一主題 下一主題
收起左側

STM32 gui TFTLCD驅動程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:277455 發表于 2018-1-18 16:49 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
根據網上的例程,自己總結的TFT-LCD驅動,我用的是STM32FX103芯片

單片機源程序如下:
  1. #include "gui.h"

  2. #ifdef USE_FONT_UPDATE
  3. #include "ff.h"
  4. #include "diskio.h"
  5. #endif

  6. #ifdef USE_FLASH_CHAR
  7. #include "flash.h"
  8. #else
  9. #include "asciicode.h"
  10. #endif

  11. #ifdef USE_FONT_UPDATE
  12. #include "malloc.h"
  13. #endif
  14. /****************************************************************************
  15. * Function Name  : GUI_Dot
  16. * Description    : 在彩屏上面畫一點
  17. * Input          : x:點的X坐標
  18. *                * y:點的Y坐標
  19. *                * color:點的顏色
  20. * Output         : None
  21. * Return         : None
  22. ****************************************************************************/

  23. void GUI_Dot(uint16_t x, uint16_t y, uint16_t color)
  24. {  
  25.         TFT_SetWindow(x, y, x, y);  //設置點的位置
  26.         TFT_WriteData(color);       //畫點        
  27. }

  28. void GUI_Line(u16 xStart, u16 yStart, u16 xEnd, u16 yEnd, u16 color)
  29. {
  30.         u16 t;  
  31.         int xerr = 0, yerr = 0, delta_x, delta_y, distance;  
  32.         int incx, incy;  
  33.         u16 row, col;  
  34.         delta_x = xEnd - xStart;//計算坐標增量  
  35.         delta_y = yEnd - yStart;  
  36.         col = xStart;  
  37.         row = yStart;  
  38.         if (delta_x > 0)
  39.         {
  40.                 incx=1;//設置單步方向
  41.         }           
  42.         else   
  43.         {  
  44.             if (delta_x == 0)
  45.                 {
  46.                         incx = 0;//垂直線
  47.                 }                  
  48.             else
  49.                         {
  50.                                 incx = -1;
  51.                                 delta_x = -delta_x;
  52.                         }  
  53.         }  
  54.         if (delta_y > 0)
  55.         {
  56.                 incy = 1;
  57.         }         
  58.         else  
  59.         {  
  60.             if (delta_y == 0)
  61.                 {
  62.                         incy = 0;//水平線  
  63.                 }
  64.             else
  65.                 {
  66.                         incy = -1;
  67.                         delta_y = -delta_y;
  68.                 }  
  69.         }  
  70.         if (delta_x > delta_y)
  71.         {
  72.                 distance = delta_x;//選取基本增量坐標軸  
  73.         }
  74.         else
  75.         {
  76.                 distance = delta_y;
  77.         }         
  78.         for (t=0; t<=distance+1; t++)  
  79.         {                                     //畫線輸出  
  80.             GUI_Dot(col, row, color);
  81.             xerr += delta_x;  
  82.             yerr += delta_y;  
  83.                   if(xerr > distance)  
  84.             {  
  85.                 xerr -= distance;  
  86.                 col += incx;  
  87.             }  
  88.             if(yerr > distance)  
  89.             {  
  90.                 yerr -= distance;  
  91.                 row += incy;  
  92.             }  
  93.         }  
  94. }
  95. /****************************************************************************
  96. * Function Name  : GUI_Box
  97. * Description    : 給一個區域涂上顏色
  98. * Input          : sx:起始X坐標, sy:其實Y坐標,
  99. *                * ex:終止X坐標, ey:終止Y坐標,
  100. *                * color:方框的顏色
  101. * Output         : None
  102. * Return         : None
  103. ****************************************************************************/

  104. void GUI_Box(uint16_t xState, uint16_t yState, uint16_t xEnd, uint16_t yEnd, uint16_t color)
  105. {
  106.         uint16_t temp;

  107.     if((xState > xEnd) || (yState > yEnd))
  108.     {
  109.         return;
  110.     }   
  111.         TFT_SetWindow(xState, yState, xEnd, yEnd);
  112.     xState = xEnd - xState + 1;
  113.         yState = yEnd - yState + 1;

  114.         while(xState--)
  115.         {
  116.                  temp = yState;
  117.                 while (temp--)
  118.                  {        
  119.                         TFT_WriteData(color);
  120.                 }
  121.         }
  122. }

  123. /****************************************************************************
  124. * Function Name  : GUI_DrowSign
  125. * Description    : 畫一個十字的標記
  126. * Input          : x:標記的X坐標;
  127. *                * y:標記的Y坐標
  128. *                * color:標記的顏色
  129. * Output         : None
  130. * Return         : None
  131. ****************************************************************************/

  132. void GUI_DrowSign(uint16_t x, uint16_t y, uint16_t color)
  133. {
  134.     uint8_t i;

  135.     /* 畫點 */
  136.     TFT_SetWindow(x-1, y-1, x+1, y+1);
  137.     for(i=0; i<9; i++)
  138.     {
  139.         TFT_WriteData(color);   
  140.     }

  141.     /* 畫豎 */
  142.     TFT_SetWindow(x-4, y, x+4, y);
  143.     for(i=0; i<9; i++)
  144.     {
  145.         TFT_WriteData(color);   
  146.     }

  147.     /* 畫橫 */
  148.     TFT_SetWindow(x, y-4, x, y+4);
  149.     for(i=0; i<9; i++)
  150.     {
  151.         TFT_WriteData(color);   
  152.     }
  153. }

  154. #ifndef USE_FLASH_CHAR
  155. /****************************************************************************
  156. * Function Name  : GUI_Show12ASCII
  157. * Description    : 寫12號ASCII碼
  158. * Input          : x:起始X坐標
  159. *                * y:起始Y坐標
  160. *                * p:字符串首地址
  161. *                * wordColor:字體顏色
  162. *                * backColor:背景顏色
  163. * Output         : None
  164. * Return         : None
  165. ****************************************************************************/

  166. void GUI_Show12ASCII(uint16_t x, uint16_t y, uint8_t *p,
  167.                      uint16_t wordColor, uint16_t backColor)
  168. {
  169.         uint8_t i, wordByte, wordNum;
  170.         uint16_t color;

  171.         while(*p != '\0')   //檢測是否是最后一個字
  172.         {
  173.         /* 在字庫中的ASCII碼是從空格開始的也就是32開始的,所以減去32 */
  174.                 wordNum = *p - 32;
  175.                
  176.         TFT_SetWindow(x, y, x+7, y+15);           //字寬*高為:8*16
  177.                 for (wordByte=0; wordByte<16; wordByte++) //每個字模一共有16個字節
  178.                 {
  179.                         color = ASCII8x16[wordNum][wordByte];
  180.                         for (i=0; i<8; i++)
  181.                         {
  182.                                 if ((color&0x80) == 0x80)
  183.                                 {
  184.                                         TFT_WriteData(wordColor);
  185.                                 }                                                
  186.                                 else
  187.                                 {
  188.                                         TFT_WriteData(backColor);
  189.                                 }         
  190.                                 color <<= 1;
  191.                         }
  192.                 }

  193.                 p++;    //指針指向下一個字
  194.                
  195.         /* 屏幕坐標處理 */
  196.         x += 8;
  197.         if(x > 233)   //TFT_XMAX -8
  198.         {
  199.             x = 0;
  200.             y += 16;   
  201.         }
  202.         }
  203. }

  204. #else

  205. /****************************************************************************
  206. * Function Name  : GUI_Show12Char
  207. * Description    : 通過FLASH字庫顯示12號字母和漢字(使用GBK)
  208. * Input          : x:起始X坐標
  209. *                * y:起始Y坐標
  210. *                * ch:字符串首地址
  211. *                * wordColor:字體顏色
  212. *                * backColor:背景顏色
  213. * Output         : None
  214. * Return         : None
  215. ****************************************************************************/

  216. void GUI_Show12Char(uint16_t x, uint16_t y, uint8_t *ch,
  217.                     uint16_t wordColor, uint16_t backColor)
  218. {
  219.     uint8_t i, j, color, buf[32];
  220.     uint16_t asc;
  221.     uint32_t wordAddr = 0;

  222.     while(*ch != '\0')
  223.     {
  224.         /*顯示字母 */
  225.         if(*ch < 0x80)  //ASCII碼從0~127
  226.         {
  227.             /* 在字庫中的ASCII碼是從空格開始的也就是32開始的,所以減去32 */
  228.                     wordAddr = *ch - 32;
  229.             wordAddr *= 16;
  230.             wordAddr += GUI_FLASH_ASCII_ADDR;
  231.             
  232.             /* 讀取FLASH中該字的字模 */
  233.             FLASH_ReadData(buf, wordAddr, 16);
  234.             
  235.             /* 顯示該文字 */               
  236.             TFT_SetWindow(x, y, x+7, y+15);           //字寬*高為:8*16
  237.                     for (j=0; j<16; j++) //每個字模一共有16個字節
  238.                     {
  239.                             color = buf[j];
  240.                             for (i=0; i<8; i++)
  241.                             {
  242.                                     if ((color&0x80) == 0x80)
  243.                                     {
  244.                                             TFT_WriteData(wordColor);
  245.                                     }                                                
  246.                                     else
  247.                                     {
  248.                                             TFT_WriteData(backColor);
  249.                                     }         
  250.                                     color <<= 1;
  251.                             }
  252.                     }
  253.    
  254.                     ch++;    //指針指向下一個字
  255.                     
  256.             /* 屏幕坐標處理 */
  257.             x += 8;
  258.             if(x > 233)   //TFT_XMAX -8
  259.             {
  260.                 x = 0;
  261.                 y += 16;   
  262.             }            
  263.         }
  264.         /* 顯示漢字 */
  265.         else
  266.         {
  267.             /* 將漢字編碼轉換成在FLASH中的地址 */
  268.             asc = *ch - 0x81;     //高字節是表示分區,分區是從0x81到0xFE,所以轉換成地址-0x80
  269.             wordAddr = asc * 190; //每個分區一共有190個字
  270.    
  271.             asc = *(ch + 1); //低字節代表每個字在每個分區的位置,它是從0x40到0xFF
  272. ……………………

  273. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

程序可能還有一些問題未解決,求大佬幫助調試:
gui.rar (5.5 KB, 下載次數: 93)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

6#
ID:817265 發表于 2020-9-27 14:33 | 只看該作者
不行啊
回復

使用道具 舉報

5#
無效樓層,該帖已經被刪除
地板
ID:295259 發表于 2020-4-28 22:14 | 只看該作者
我的顯示不出來動態變量呢 ,不刷新
回復

使用道具 舉報

板凳
ID:295259 發表于 2020-4-28 22:14 | 只看該作者
怎么顯示動態變量呢
回復

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表