找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8893|回复: 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, 下载次数: 217)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 单片机教程网

快速回复 返回顶部 返回列表