找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5062|回复: 2
收起左侧

stm32f103和串口屏通讯 液晶屏测试工装源程序

[复制链接]
ID:390333 发表于 2018-8-27 11:05 | 显示全部楼层 |阅读模式
利用stm32与串口屏通讯
工程路径为..\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. #include "string.h"
  9. #include "rtc.h"
  10. #include "stm32f10x_bkp.h"
  11. #include "stm32f10x_rtc.h"
  12. #include "stm32f10x_pwr.h"
  13. //#include "key_IN.h"

  14. #define TIME_100MS 10                                                                //100毫秒(10个单位)

  15. volatile uint32  timer_tick_count = 0;                                               //定时器节拍

  16. uint8  cmd_buffer[CMD_MAX_SIZE];                                                     //指令缓存
  17. static uint16 current_screen_id = 0;                                                 //当前画面ID
  18. static int32 test_value = 0;                                                         //测试值
  19. static uint8 update_en = 0;                                                          //更新标记
  20. static int32 meter_flag = 0;                                                         //仪表指针往返标志位
  21. static int32 num = 0;                                                                //曲线采样点计数
  22. static uint8 sec = 1;                                                                //时间秒
  23. static int32 curves_type = 0;                                                        //曲线标志位  0为正弦波,1为锯齿波                  
  24. static int32 second_flag=0;                                                          //时间标志位
  25. static int32 Progress_Value = 0;                                                     //进度条的值
  26. static int32 icon_flag = 0;                                                          //图标标志位
  27. //int32 key_flag  = 0;
  28. static uint16 screenid = 0;

  29. extern uint32 OP_XGUS;
  30. int t1 = 5;

  31. void UpdateUI(void);                                                                 //更新UI数据
  32. void picxdisp(uchar n,int x1,int y1,int x2,int y2) ;



  33. /*!                                                                                 
  34. *  \brief  程序入口                                                                 
  35. */                                                                                 
  36. int main()                                                                          
  37. {                                                                                   
  38.     static int32 test_value = 0;                                                     //测试值
  39.     uint32 timer_tick_last_update = 0;                                               //上一次更新的时间
  40.     qsize  size = 0;                                                               
  41.     //int PRESS ;
  42.     //配置时钟                                                                    
  43.     Set_System();                                                                  
  44.     //配置串口中断                                                               
  45.     Interrupts_Config();                                                            
  46.     //配置时钟节拍                                                               
  47.     systicket_init();   
  48.    
  49.    // KEY_Init();
  50.     RTC_int();   
  51.   
  52.     //串口初始化                                             
  53.     Uart2Init(9600);                                                               
  54.     UartInit(9600);
  55.      
  56.     //清空串口接收缓冲区                                                         
  57.     queue_reset();                                                                  

  58.     //延时等待串口屏初始化完毕,必须等待300ms                                      
  59.     delay_ms(300);                                                                  


  60.     while(1)                                                                        
  61.     {   
  62.       size = queue_find_cmd(cmd_buffer,CMD_MAX_SIZE); //从缓冲区中获取一条指令        
  63.                 if(size>0&&cmd_buffer[1]!=0x07)//接收到指令
  64.                 {
  65.                         ProcessMessage((PCTRL_MSG)cmd_buffer, size);//指令处理
  66.                 }
  67.      
  68.       /*PRESS = KEY_Scan();
  69.       switch(PRESS)
  70.       {
  71.    
  72.         case 1 :
  73.                 while(key_flag)
  74.                 {
  75.                   KEY_Scan();
  76.                   SetScreen(screenid);
  77.                   screenid++;
  78.                 }  
  79.         break;
  80.         case 2 :
  81.                 SetScreen(screenid);
  82.                 screenid -= 1;
  83.         break;
  84.         case 3 :
  85.                 SetScreen(screenid);
  86.                 screenid += 1;
  87.         break;
  88.       }*/
  89.     }
  90. }




  91. /*!
  92. *  \brief  消息处理流程
  93. *  \param msg 待处理消息
  94. *  \param size 消息长度
  95. */



  96. void ProcessMessage( PCTRL_MSG msg, uint16 size )
  97. {
  98.     uint8 cmd_type = msg->cmd_type;                                                  //指令类型
  99.     uint8 ctrl_msg = msg->ctrl_msg;                                                  //消息的类型
  100.     uint8 control_type = msg->control_type;                                          //控件类型
  101.     uint16 screen_id = PTR2U16(&msg->screen_id);                                     //画面ID
  102.     uint16 control_id = PTR2U16(&msg->control_id);                                   //控件ID
  103.     uint32 value = PTR2U32(msg->param);                                              //数值


  104.     switch(cmd_type)
  105.     {  
  106.     case NOTIFY_TOUCH_PRESS:                                                         //触摸屏按下
  107.     case NOTIFY_TOUCH_RELEASE:                                                       //触摸屏松开
  108.         NotifyTouchXY(cmd_buffer[1],PTR2U16(cmd_buffer+2),PTR2U16(cmd_buffer+4));
  109.         break;                                                                    
  110.     case NOTIFY_WRITE_FLASH_OK:                                                      //写FLASH成功
  111.         NotifyWriteFlash(1);                                                      
  112.         break;                                                                    
  113.     case NOTIFY_WRITE_FLASH_FAILD:                                                   //写FLASH失败
  114.         NotifyWriteFlash(0);                                                      
  115.         break;                                                                    
  116.     case NOTIFY_READ_FLASH_OK:                                                       //读取FLASH成功
  117.         NotifyReadFlash(1,cmd_buffer+2,size-6);                                      //去除帧头帧尾
  118.         break;                                                                     
  119.     case NOTIFY_READ_FLASH_FAILD:                                                    //读取FLASH失败
  120.         NotifyReadFlash(0,0,0);                                                   
  121.         break;                                                                    
  122.     case NOTIFY_READ_RTC:                                                            //读取RTC时间
  123.         NotifyReadRTC(cmd_buffer[2],cmd_buffer[3],cmd_buffer[4],cmd_buffer[5],cmd_buffer[6],cmd_buffer[7],cmd_buffer[8]);
  124.         break;
  125.     case NOTIFY_CONTROL:
  126.         {
  127.             if(ctrl_msg==MSG_GET_CURRENT_SCREEN)                                     //画面ID变化通知
  128.             {
  129.                 NotifyScreen(screen_id);                                             //画面切换调动的函数
  130.             }
  131.             else
  132.             {
  133.                 switch(control_type)
  134.                 {
  135.                 case kCtrlButton:                                                    //按钮控件
  136.                     NotifyButton(screen_id,control_id,msg->param[1]);                  
  137.                     break;                                                            
  138.                 case kCtrlText:                                                      //文本控件
  139.                     NotifyText(screen_id,control_id,msg->param);                        
  140.                     break;                                                            
  141.                 case kCtrlProgress:                                                  //进度条控件
  142.                     NotifyProgress(screen_id,control_id,value);                        
  143.                     break;                                                            
  144.                 case kCtrlSlider:                                                    //滑动条控件
  145.                     NotifySlider(screen_id,control_id,value);                          
  146.                     break;                                                            
  147.                 case kCtrlMeter:                                                     //仪表控件
  148.                     NotifyMeter(screen_id,control_id,value);                           
  149.                     break;                                                            
  150.                 case kCtrlMenu:                                                      //菜单控件
  151.                     NotifyMenu(screen_id,control_id,msg->param[0],msg->param[1]);      
  152.                     break;                                                              
  153.                 case kCtrlSelector:                                                  //选择控件
  154.                     NotifySelector(screen_id,control_id,msg->param[0]);               
  155.                     break;                                                              
  156.                 case kCtrlRTC:                                                       //倒计时控件
  157.                
  158.                    NotifyTimer(screen_id,control_id);
  159.                     break;
  160.                 default:
  161.                     break;
  162.                 }
  163.             }
  164.             break;  
  165.         }
  166.     default:
  167.         break;
  168.     }
  169. }

  170. /*!
  171. *  \brief  画面切换通知
  172. *  \details  当前画面改变时(或调用GetScreen),执行此函数
  173. *  \param screen_id 当前画面ID
  174. */
  175. void NotifyScreen(uint16 screen_id)
  176. {
  177.     //TODO: 添加用户代码
  178.                                                       //在工程配置中开启画面切换通知,记录当前画面ID
  179.    
  180.     //进到二维码页面生成二维码
  181.    
  182. }

  183. /*!
  184. *  \brief  触摸坐标事件响应
  185. *  \param press 1按下触摸屏,3松开触摸屏
  186. *  \param x x坐标
  187. *  \param y y坐标
  188. */
  189. void NotifyTouchXY(uint8 press,uint16 x,uint16 y)
  190. {

  191. }
  192. /*!
  193. *  \brief  更新数据
  194. */
  195. void UpdateUI()
  196. {
  197.    

  198.                                  
  199. }


  200. /*!
  201. *  \brief  按钮控件通知
  202. *  \details  当按钮状态改变(或调用GetControlValue)时,执行此函数
  203. *  \param screen_id 画面ID
  204. *  \param control_id 控件ID
  205. *  \param state 按钮状态:0弹起,1按下
  206. */
  207. void NotifyButton(uint16 screen_id, uint16 control_id, uint8  state)
  208. {
  209.   
  210.     if(screen_id == 0)
  211.     {
  212.         if(control_id==32)
  213.         {
  214.           GetControlValue(0,26);
  215.          
  216.         }
  217.         if(control_id==33)
  218.         {
  219.           GetControlValue(0,10);
  220.         }
  221.         if(control_id==34)
  222.         {
  223.           GetControlValue(0,22);
  224.         }
  225.         if(control_id==37)
  226.         {
  227.           GetControlValue(0,25);
  228.         }
  229.         if(control_id==35)
  230.         {
  231.           SetScreen(screenid);
  232.           screenid -= 1;
  233.         }
  234.         if(control_id==36)
  235.         {
  236.           SetScreen(screenid);
  237.           screenid += 1;
  238.         }
  239.     }
  240. }

  241. /*!
  242. *  \brief  文本控件通知
  243. *  \details  当文本通过键盘更新(或调用GetControlValue)时,执行此函数
  244. *  \param screen_id 画面ID
  245. *  \param control_id 控件ID
  246. *  \param str 文本控件内容
  247. */
  248. void NotifyText(uint16 screen_id, uint16 control_id, uint8 *str)
  249. {        
  250.     int32 value=0;
  251.     int32 zalue;
  252.     sscanf(str,"%ld",&value);                                                        //把字符串转换为整数
  253.     UnlockDeviceConfig();  
  254.   if(screen_id==0)                                                                 //画面ID2:文本设置和显示
  255.     {                                                                                                                              
  256.         if(control_id==26)                                                            //最高电压
  257.         {                                                                        
  258.             //限定数值范围(也可以在文本控件属性中设置)                             
  259.             switch(value)
  260.             {
  261.               case 2400:
  262.                 zalue=1;
  263.                 SetCommBps(zalue);
  264.                 UartInit(2400);
  265.                 SetTextInt32(0,41,zalue,0,1);
  266.               break;
  267.               case 4800:
  268.                 zalue=2;
  269.               SetCommBps(zalue);
  270.               UartInit(4800);
  271.               SetTextInt32(0,41,zalue,0,1);
  272.               break;
  273.               case 9600:
  274.                 zalue=3;
  275.               SetCommBps(zalue);
  276.               UartInit(9600);
  277.               SetTextInt32(0,41,zalue,0,1);
  278.               break;
  279.               case 19200:
  280.                 zalue=4;
  281.               SetCommBps(zalue);
  282.               UartInit(19200);
  283.               SetTextInt32(0,41,zalue,0,1);
  284.               break;
  285.               case 38400:
  286.                 zalue=5;
  287.               SetCommBps(zalue);
  288.               UartInit(38400);
  289.               SetTextInt32(0,41,zalue,0,1);
  290.               break;
  291.               case 57600:
  292.                 zalue=6;
  293.               SetCommBps(zalue);
  294.               UartInit(57600);
  295.               SetTextInt32(0,41,zalue,0,1);
  296.               break;
  297.               case 115200:
  298.                 zalue=7;
  299.               SetCommBps(zalue);
  300.               UartInit(115200);
  301.               SetTextInt32(0,41,zalue,0,1);
  302.               break;
  303.             }
  304.         }         
  305.     }
  306.     LockDeviceConfig();
  307. }                                                                                

  308. /*!                                                                              
  309. *  \brief  进度条控件通知                                                      
  310. *  \details  调用GetControlValue时,执行此函数                                 
  311. *  \param screen_id 画面ID                                                      
  312. *  \param control_id 控件ID                                                     
  313. *  \param value 值                                                              
  314. */                                                                              
  315. void NotifyProgress(uint16 screen_id, uint16 control_id, uint32 value)           
  316. {  
  317.    
  318. }                                                                                

  319. /*!                                                                              
  320. *  \brief  滑动条控件通知                                                      
  321. *  \details  当滑动条改变(或调用GetControlValue)时,执行此函数                  
  322. *  \param screen_id 画面ID                                                      
  323. *  \param control_id 控件ID                                                     
  324. *  \param value 值                                                              
  325. */                                                                              
  326. void NotifySlider(uint16 screen_id, uint16 control_id, uint32 value)            
  327. {                                                              
  328.    
  329. }

  330. /*!
  331. *  \brief  仪表控件通知
  332. *  \details  调用GetControlValue时,执行此函数
  333. *  \param screen_id 画面ID
  334. *  \param control_id 控件ID
  335. *  \param value 值
  336. */
  337. void NotifyMeter(uint16 screen_id, uint16 control_id, uint32 value)
  338. {
  339.     //TODO: 添加用户代码
  340. }

  341. /*!
  342. *  \brief  菜单控件通知
  343. *  \details  当菜单项按下或松开时,执行此函数
  344. *  \param screen_id 画面ID
  345. *  \param control_id 控件ID
  346. *  \param item 菜单项索引
  347. *  \param state 按钮状态:0松开,1按下
  348. */
  349. void NotifyMenu(uint16 screen_id, uint16 control_id, uint8 item, uint8 state)
  350. {
  351.     //TODO: 添加用户代码
  352. }

  353. /*!
  354. *  \brief  选择控件通知
  355. *  \details  当选择控件变化时,执行此函数
  356. *  \param screen_id 画面ID
  357. *  \param control_id 控件ID
  358. *  \param item 当前选项
  359. */
  360. void NotifySelector(uint16 screen_id, uint16 control_id, uint8  item)
  361. {
  362.    
  363. }

  364. /*!
  365. *  \brief  定时器超时通知处理
  366. *  \param screen_id 画面ID
  367. *  \param control_id 控件ID
  368. */
  369. void NotifyTimer(uint16 screen_id, uint16 control_id)
  370. {
  371.     //TODO: 添加用户代码
  372. }

  373. /*!
  374. *  \brief  读取用户FLASH状态返回
  375. *  \param status 0失败,1成功
  376. *  \param _data 返回数据
  377. *  \param length 数据长度
  378. */
  379. void NotifyReadFlash(uint8 status,uint8 *_data,uint16 length)
  380. {
  381.     //TODO: 添加用户代码
  382. }

  383. /*!
  384. *  \brief  写用户FLASH状态返回
  385. *  \param status 0失败,1成功
  386. */
  387. void NotifyWriteFlash(uint8 status)
  388. {
  389.     //TODO: 添加用户代码
  390. }

  391. /*!
  392. *  \brief  读取RTC时间,注意返回的是BCD码
  393. *  \param year 年(BCD)
  394. *  \param month 月(BCD)
  395. *  \param week 星期(BCD)
  396. *  \param day 日(BCD)
  397. *  \param hour 时(BCD)
  398. *  \param minute 分(BCD)
  399. *  \param second 秒(BCD)
  400. */
  401. void NotifyReadRTC(uint8 year,uint8 month,uint8 week,uint8 day,uint8 hour,uint8 minute,uint8 second)
  402. {
  403.     //sec =(0xff & (second>>4))*10 +(0xf & second);                                    //BCD码转十进制
  404. }


复制代码

所有资料51hei提供下载:
液晶屏测试工装程序.rar (379.37 KB, 下载次数: 75)
回复

使用道具 举报

ID:549825 发表于 2019-5-29 02:16 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:747344 发表于 2020-6-13 02:27 | 显示全部楼层
很棒 需要好好研究下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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