久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9912|回復(fù): 5
收起左側(cè)

基于串口屏基礎(chǔ)stm32源代碼

[復(fù)制鏈接]
ID:260218 發(fā)表于 2017-12-11 15:45 | 顯示全部樓層 |閱讀模式
此代碼為串口屏的代碼,stm32F103的板子,附帶里面的代碼可實(shí)現(xiàn)數(shù)據(jù)回傳,數(shù)據(jù)接收,以及圖像的顯示等等。是基于FIFO的串口接收方式,上傳上來給大家一起學(xué)習(xí)學(xué)習(xí)
工程路徑為..\STM32\DCDEMO7\RVMDK\DCDEMO7.uvproj ,請(qǐng)用KEIL4(MDK4)以上版本打開

單片機(jī)源程序如下:
  1. #include "hmi_driver.h"
  2. #include "hmi_user_uart.h"
  3. #include "cmd_queue.h"
  4. #include "cmd_process.h"
  5. #include "stdio.h"
  6. #include "hw_config.h"
  7. #include "ulitity.h"

  8. #define TIME_100MS 10

  9. volatile uint32  timer_tick_count = 0; //定時(shí)器節(jié)拍

  10. uint8 cmd_buffer[CMD_MAX_SIZE];

  11. static int32 test_value = 0;
  12. static uint8 update_en = 0;

  13. void UpdateUI(void);

  14. //程序入口
  15. int main()
  16. {
  17.         qsize  size = 0;
  18.         uint32 timer_tick_last_update = 0;

  19.         /*配置時(shí)鐘*/
  20.         Set_System();
  21.         /*配置串口中斷*/
  22.         Interrupts_Config();
  23.         /*配置時(shí)鐘節(jié)拍*/
  24.         systicket_init();

  25.         /*串口初始化,波特率設(shè)置為115200*/
  26.         UartInit(115200);

  27.         /*清空串口接收緩沖區(qū)*/
  28.         queue_reset();

  29.         /*延時(shí)等待串口屏初始化完畢,必須等待300ms*/
  30.         delay_ms(300);

  31.         while(1)
  32.         {
  33.                 size = queue_find_cmd(cmd_buffer,CMD_MAX_SIZE); //從緩沖區(qū)中獲取一條指令        
  34.                 if(size>0)//接收到指令
  35.                 {
  36.                         ProcessMessage((PCTRL_MSG)cmd_buffer, size);//指令處理
  37.                 }               

  38.                 /****************************************************************************************************************
  39.                 特別注意
  40.                 MCU不要頻繁向串口屏發(fā)送數(shù)據(jù),否則串口屏的內(nèi)部緩存區(qū)會(huì)滿,從而導(dǎo)致數(shù)據(jù)丟失(緩沖區(qū)大小:標(biāo)準(zhǔn)型8K,基本型4.7K)
  41.                 1) 一般情況下,控制MCU向串口屏發(fā)送數(shù)據(jù)的周期大于100ms,就可以避免數(shù)據(jù)丟失的問題;
  42.                 2) 如果仍然有數(shù)據(jù)丟失的問題,請(qǐng)判斷串口屏的BUSY引腳,為高時(shí)不能發(fā)送數(shù)據(jù)給串口屏。
  43.                 ******************************************************************************************************************/

  44.                 //TODO: 添加用戶代碼
  45.                 //數(shù)據(jù)有更新時(shí),每100毫秒刷新一次
  46.                 if(update_en&&timer_tick_count-timer_tick_last_update>=TIME_100MS)
  47.                 {
  48.                         update_en = 0;
  49.                         timer_tick_last_update = timer_tick_count;                       

  50.                         UpdateUI();
  51.                 }
  52.         }
  53. }

  54. /*!
  55. *  \brief  消息處理流程,此處一般不需要更改
  56. *  \param msg 待處理消息
  57. *  \param size 消息長(zhǎng)度
  58. */
  59. void ProcessMessage( PCTRL_MSG msg, uint16 size )
  60. {
  61.         uint8 cmd_type = msg->cmd_type;//指令類型
  62.         //uint8 ctrl_msg = msg->ctrl_msg;   //消息的類型
  63.         uint8 control_type = msg->control_type;//控件類型
  64.         uint16 screen_id = PTR2U16(&msg->screen_id);//畫面ID
  65.         uint16 control_id = PTR2U16(&msg->control_id);//控件ID
  66.         uint32 value = PTR2U32(msg->param);//數(shù)值

  67.         switch(cmd_type)
  68.         {
  69.         case NOTIFY_SCREEN://切換畫面
  70.                 NotifyScreen(screen_id);
  71.                 break;
  72.         case NOTIFY_TOUCH_PRESS:
  73.         case NOTIFY_TOUCH_RELEASE:
  74.                 NotifyTouchXY(cmd_buffer[1],PTR2U16(cmd_buffer+2),PTR2U16(cmd_buffer+4));
  75.                 break;       
  76.         case NOTIFY_WRITE_FLASH_OK:
  77.                 NotifyWriteFlash(1);
  78.                 break;
  79.         case NOTIFY_WRITE_FLASH_FAILD:
  80.                 NotifyWriteFlash(0);
  81.                 break;
  82.         case NOTIFY_READ_FLASH_OK:
  83.                 NotifyReadFlash(1,cmd_buffer+2,size-6);//去除幀頭幀尾
  84.                 break;

  85.         case NOTIFY_READ_FLASH_FAILD:
  86.                 NotifyReadFlash(0,0,0);
  87.                 break;
  88.         case NOTIFY_CONTROL:
  89.                 {
  90.                         switch(control_type)
  91.                         {
  92.                         case kCtrlButton: //按鈕控件
  93.                                 NotifyButton(screen_id,control_id,msg->param[1]);
  94.                                 break;
  95.                         case kCtrlText://文本控件
  96.                                 NotifyText(screen_id,control_id,msg->param);
  97.                                 break;
  98.                         case kCtrlProgress: //進(jìn)度條控件
  99.                                 NotifyProgress(screen_id,control_id,value);
  100.                                 break;
  101.                         case kCtrlSlider: //滑動(dòng)條控件
  102.                                 NotifySlider(screen_id,control_id,value);
  103.                                 break;
  104.                         case kCtrlMeter: //儀表控件
  105.                                 NotifyMeter(screen_id,control_id,value);
  106.                                 break;
  107.                         case kCtrlMenu://菜單控件
  108.                                 NotifyMenu(screen_id,control_id,msg->param[0],msg->param[1]);
  109.                                 break;
  110.                         case kCtrlSelector://選擇控件
  111.                                 NotifySelector(screen_id,control_id,msg->param[0]);
  112.                                 break;
  113.                         case kCtrlRTC://倒計(jì)時(shí)控件
  114.                                 NotifyTimer(screen_id,control_id);
  115.                                 break;
  116.                         default:
  117.                                 break;
  118.                         }
  119.                 }
  120.                 break;
  121.         default:
  122.                 break;
  123.         }
  124. }

  125. /*!
  126. *  \brief  畫面切換通知
  127. *  \details  當(dāng)前畫面改變時(shí)(或調(diào)用GetScreen),執(zhí)行此函數(shù)
  128. *  \param screen_id 當(dāng)前畫面ID
  129. */
  130. void NotifyScreen(uint16 screen_id)
  131. {
  132.         //TODO: 添加用戶代碼
  133. }

  134. /*!
  135. *  \brief  觸摸坐標(biāo)事件響應(yīng)
  136. *  \param press 1按下觸摸屏,3松開觸摸屏
  137. *  \param x x坐標(biāo)
  138. *  \param y y坐標(biāo)
  139. */
  140. void NotifyTouchXY(uint8 press,uint16 x,uint16 y)
  141. {
  142.         //TODO: 添加用戶代碼
  143. }

  144. //文本控件顯示整數(shù)值
  145. void SetTextValueInt32(uint16 screen_id, uint16 control_id,int32 value)
  146. {
  147.         char buffer[12] = {0};
  148.         sprintf(buffer,"%ld",value);
  149.         SetTextValue(screen_id,control_id,(uchar *)buffer);
  150. }

  151. //字符串轉(zhuǎn)整數(shù)
  152. int32 StringToInt32(uint8 *str)
  153. {
  154.         int32 v = 0;
  155.         sscanf((char *)str,"%ld",&v);
  156.         return v;
  157. }

  158. //更新界面控件顯示
  159. void UpdateUI()
  160. {
  161.         SetTextValueInt32(0,2,test_value);
  162.         SetProgressValue(0,3,test_value);
  163.         SetSliderValue(0,4,test_value);       
  164.         SetMeterValue(0,7,test_value);
  165. }

  166. /*!
  167. *  \brief  按鈕控件通知
  168. *  \details  當(dāng)按鈕狀態(tài)改變(或調(diào)用GetControlValue)時(shí),執(zhí)行此函數(shù)
  169. *  \param screen_id 畫面ID
  170. *  \param control_id 控件ID
  171. *  \param state 按鈕狀態(tài):0彈起,1按下
  172. */
  173. void NotifyButton(uint16 screen_id, uint16 control_id, uint8  state)
  174. {
  175.         //TODO: 添加用戶代碼
  176.         if(screen_id==0&&control_id==5)//遞增按鈕
  177.         {
  178.                 if(test_value<100)
  179.                         ++test_value;
  180.         }
  181.         else if(screen_id==0&&control_id==6)//遞減按鈕
  182.         {
  183.                 if(test_value>0)
  184.                         --test_value;
  185.         }

  186.        
  187.         //UpdateUI();
  188.         update_en = 1;
  189. }

  190. /*!
  191. *  \brief  文本控件通知
  192. *  \details  當(dāng)文本通過鍵盤更新(或調(diào)用GetControlValue)時(shí),執(zhí)行此函數(shù)
  193. *  \param screen_id 畫面ID
  194. *  \param control_id 控件ID
  195. *  \param str 文本控件內(nèi)容
  196. */
  197. void NotifyText(uint16 screen_id, uint16 control_id, uint8 *str)
  198. {
  199.         //TODO: 添加用戶代碼
  200.         test_value = StringToInt32(str);

  201.         if(test_value>100)
  202.                 test_value = 100;
  203.         else if(test_value<0)
  204.                 test_value = 0;

  205.         //UpdateUI();
  206.         update_en = 1;
  207. }

  208. /*!
  209. *  \brief  進(jìn)度條控件通知
  210. *  \details  調(diào)用GetControlValue時(shí),執(zhí)行此函數(shù)
  211. *  \param screen_id 畫面ID
  212. *  \param control_id 控件ID
  213. *  \param value 值
  214. */
  215. void NotifyProgress(uint16 screen_id, uint16 control_id, uint32 value)
  216. {
  217.         //TODO: 添加用戶代碼
  218. }

  219. /*!
  220. *  \brief  滑動(dòng)條控件通知
  221. *  \details  當(dāng)滑動(dòng)條改變(或調(diào)用GetControlValue)時(shí),執(zhí)行此函數(shù)
  222. *  \param screen_id 畫面ID
  223. *  \param control_id 控件ID
  224. *  \param value 值
  225. */
  226. void NotifySlider(uint16 screen_id, uint16 control_id, uint32 value)
  227. {
  228.         //TODO: 添加用戶代碼
  229.         test_value = value;

  230.         //UpdateUI();
  231.         update_en = 1;
  232. }

  233. /*!
  234. *  \brief  儀表控件通知
  235. *  \details  調(diào)用GetControlValue時(shí),執(zhí)行此函數(shù)
  236. *  \param screen_id 畫面ID
  237. *  \param control_id 控件ID
  238. *  \param value 值
  239. */
  240. void NotifyMeter(uint16 screen_id, uint16 control_id, uint32 value)
  241. {
  242.         //TODO: 添加用戶代碼
  243. }

  244. /*!
  245. *  \brief  菜單控件通知
  246. *  \details  當(dāng)菜單項(xiàng)按下或松開時(shí),執(zhí)行此函數(shù)
  247. *  \param screen_id 畫面ID
  248. *  \param control_id 控件ID
  249. *  \param item 菜單項(xiàng)索引
  250. *  \param state 按鈕狀態(tài):0松開,1按下
  251. */
  252. void NotifyMenu(uint16 screen_id, uint16 control_id, uint8  item, uint8  state)
  253. {
  254.         //TODO: 添加用戶代碼
  255. }

  256. /*!
  257. *  \brief  選擇控件通知
  258. *  \details  當(dāng)選擇控件變化時(shí),執(zhí)行此函數(shù)
  259. *  \param screen_id 畫面ID
  260. *  \param control_id 控件ID
  261. *  \param item 當(dāng)前選項(xiàng)
  262. ……………………

  263. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
KEIL_DEMO_STM32.rar (1.7 MB, 下載次數(shù): 220)
回復(fù)

使用道具 舉報(bào)

ID:267431 發(fā)表于 2017-12-27 13:49 | 顯示全部樓層
你好 請(qǐng)問我的這款屏用您發(fā)的 能用嗎?

OTA5182A.pdf

569.67 KB, 下載次數(shù): 11, 下載積分: 黑幣 -5

LWX015BC001A.pdf

1.51 MB, 下載次數(shù): 8, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:55823 發(fā)表于 2018-2-14 21:42 | 顯示全部樓層
非常感謝,下載看看
回復(fù)

使用道具 舉報(bào)

ID:82250 發(fā)表于 2018-2-26 11:32 | 顯示全部樓層
程序不錯(cuò)
回復(fù)

使用道具 舉報(bào)

ID:142664 發(fā)表于 2019-5-6 21:59 | 顯示全部樓層
程序不錯(cuò)
回復(fù)

使用道具 舉報(bào)

ID:510570 發(fā)表于 2019-8-27 11:38 | 顯示全部樓層
這個(gè)不是屏自己的代碼?難道先把驅(qū)動(dòng)屏的信息發(fā)送到你這個(gè)板子,然后你這個(gè)板子再轉(zhuǎn)給屏?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 国产精品久久久久久久午夜片 | 一级a性色生活片久久毛片波多野 | 男女一区二区三区 | 欧美网站一区 | 中文字幕视频在线观看 | 精品国产青草久久久久福利 | 成人三级av | 精品日韩一区二区 | 日本中文字幕一区 | 成人一区在线观看 | 国产视频一区二区 | 二区三区在线观看 | 午夜影院视频 | 国产高清视频在线 | a毛片| 97免费在线观看视频 | 在线日韩欧美 | a看片| 人人cao| 国产亚洲一区二区三区在线观看 | 999久久久久久久久6666 | 色久电影| 欧美午夜影院 | 亚洲人的av | 黄色一级毛片 | 国产精品成人一区二区三区 | 国产黄色一级片 | 免费一级片 | 日韩小视频在线 | 欧美在线综合 | 午夜精品一区二区三区在线观看 | 免费激情 | 一区2区 | av黄色网| 国产成人小视频 | 国产一区 | 日韩午夜在线观看 | 日韩男人天堂 | 亚洲精品久久久 | 毛片电影 |