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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于串口屏基礎stm32源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:260218 發表于 2017-12-11 15:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
此代碼為串口屏的代碼,stm32F103的板子,附帶里面的代碼可實現數據回傳,數據接收,以及圖像的顯示等等。是基于FIFO的串口接收方式,上傳上來給大家一起學習學習
工程路徑為..\STM32\DCDEMO7\RVMDK\DCDEMO7.uvproj ,請用KEIL4(MDK4)以上版本打開

單片機源程序如下:
  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; //定時器節拍

  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.         /*配置時鐘*/
  20.         Set_System();
  21.         /*配置串口中斷*/
  22.         Interrupts_Config();
  23.         /*配置時鐘節拍*/
  24.         systicket_init();

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

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

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

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

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

  44.                 //TODO: 添加用戶代碼
  45.                 //數據有更新時,每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 消息長度
  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);//數值

  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: //進度條控件
  99.                                 NotifyProgress(screen_id,control_id,value);
  100.                                 break;
  101.                         case kCtrlSlider: //滑動條控件
  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://倒計時控件
  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  當前畫面改變時(或調用GetScreen),執行此函數
  128. *  \param screen_id 當前畫面ID
  129. */
  130. void NotifyScreen(uint16 screen_id)
  131. {
  132.         //TODO: 添加用戶代碼
  133. }

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

  144. //文本控件顯示整數值
  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. //字符串轉整數
  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  當按鈕狀態改變(或調用GetControlValue)時,執行此函數
  169. *  \param screen_id 畫面ID
  170. *  \param control_id 控件ID
  171. *  \param state 按鈕狀態: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  當文本通過鍵盤更新(或調用GetControlValue)時,執行此函數
  193. *  \param screen_id 畫面ID
  194. *  \param control_id 控件ID
  195. *  \param str 文本控件內容
  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  進度條控件通知
  210. *  \details  調用GetControlValue時,執行此函數
  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  滑動條控件通知
  221. *  \details  當滑動條改變(或調用GetControlValue)時,執行此函數
  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  調用GetControlValue時,執行此函數
  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  當菜單項按下或松開時,執行此函數
  247. *  \param screen_id 畫面ID
  248. *  \param control_id 控件ID
  249. *  \param item 菜單項索引
  250. *  \param state 按鈕狀態: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  當選擇控件變化時,執行此函數
  259. *  \param screen_id 畫面ID
  260. *  \param control_id 控件ID
  261. *  \param item 當前選項
  262. ……………………

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

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



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

使用道具 舉報

沙發
ID:267431 發表于 2017-12-27 13:49 | 只看該作者
你好 請問我的這款屏用您發的 能用嗎?

OTA5182A.pdf

569.67 KB, 下載次數: 11, 下載積分: 黑幣 -5

LWX015BC001A.pdf

1.51 MB, 下載次數: 8, 下載積分: 黑幣 -5

回復

使用道具 舉報

板凳
ID:55823 發表于 2018-2-14 21:42 | 只看該作者
非常感謝,下載看看
回復

使用道具 舉報

地板
ID:82250 發表于 2018-2-26 11:32 | 只看該作者
程序不錯
回復

使用道具 舉報

5#
ID:142664 發表于 2019-5-6 21:59 | 只看該作者
程序不錯
回復

使用道具 舉報

6#
ID:510570 發表于 2019-8-27 11:38 | 只看該作者
這個不是屏自己的代碼?難道先把驅動屏的信息發送到你這個板子,然后你這個板子再轉給屏?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品入口麻豆88视频 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 亚洲免费视频在线观看 | 91免费高清视频 | 欧美美女爱爱视频 | 99国产精品一区二区三区 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 黄 色 毛片免费 | 每日在线更新av | 国产一区二区在线免费 | 久久久久久久久久久成人 | 亚洲精品久 | 国产国产精品久久久久 | 精品国产一区二区三区免费 | 国产三级日本三级 | 狠狠干2020| 久久无毛 | 超碰伊人久久 | 免费国产视频在线观看 | 精品久久国产视频 | 91文字幕巨乱亚洲香蕉 | 成人av资源在线 | 91综合网| 九九久久久 | 日韩中文一区 | 精品综合 | 亚洲精品中文字幕在线观看 | 国产精品国产精品国产专区不片 | 欧美成人精品 | 欧美激情综合色综合啪啪五月 | 久久精品 | 99久久精品国产麻豆演员表 | 99久久日韩精品免费热麻豆美女 | 国产日韩久久 | 国产999精品久久久久久绿帽 | 亚洲成人免费视频在线 | 国产区一区 | 亚洲精品在线91 | 久久精品二区亚洲w码 | 国产欧美精品一区二区 | 欧美一区二区三区四区视频 |