最近,托朋友用STM32F103评估板和迪文屏做了交互(@田),没写多少代码,就实现了一些简单常用的功能,还是很简单的!今天跟大家分享一下:

一、评估板使用说明
1.功能


图1:整体效果图


图2:MCU_KEY_LED


图3:MCU-STM32F103开发板


图4:按键及LED

注:可实现的功能:
a.通过屏上的图标来控制5路LED灯的状态(LED灯的开和关来表示状态),上电5路LED熄灭状态。
b. 通过评估板上的物理按键1,来控制亮屏和息屏,上电状态为亮屏状态。
c. 通过评估板上的物理按键2&3,来调节屏幕上的温度指数,上电初始值25度,以1为步长递增递减,最小0,最大255。
d. 通过评估板上的物理按键4,来控制音乐的播放和停止,上电音乐不播放。
e. 通过评估板上的物理按键5&6来调节音量的大小,上电音量值50,以10为步长递增递减,最小0,最大250。

2、需使用的工具
a.硬件:正点原子Mini STM32开发板(MCU为STM32F103RCT6,串口TTL电平)+面包板手工焊接5路LED和6路按键扩展。
b. 软件:STM32CubeMX+KEIL MDK5。
c.原理图:详见“硬件原理图”文件夹。
d.程序:工程文件在DGUS II工程文件夹中,下载DWIN_SET导入屏中即可。 STM32程序在“MCU_STM32F103RCT6程序”文件夹。(文件过大,感兴趣的可以给我留言)

二、硬件及软件介绍
1、硬件原理图:详见“硬件原理图”文件夹
(1)硬件接口定义:

(2)硬件原理图

图5:STM32F103原理图


图6:LED及KEY原理图

2.软件程序
界面工程文件在“DGUS_II工程”文件夹中。STM32程序在“MCU_STM32F103RCT6程序”文件夹中。
(1)界面工程
LED1图标:0X1000
LED1按键:0X1200
LED2图标:0X1001
LED2按键:0X1201
LED3图标:0X1002
LED3按键:0X1202
LED4图标:0X1003
LED4按键:0X1203
LED5图标:0X1004
LED5按键:0X1204
音量显示框地址:0X1210
温度显示框地址:0X1110

(2)MCU程序

1).main():硬件初始化,触摸屏初始化,按键扫描,接收触摸屏数据处理
int main(void)
{
uint8_t i;
HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();while (1){     HAL_UART_Receive_IT(&huart1,&usart1_data,1);if(UP_POWER_FLAG == 0)//上电初始化触摸屏{UP_POWER_FLAG = 1;HMI_SEND_BUF[0] = TEMP;PLC_Data_Wr2HMI(0X1110,0,1);delay_ms(100);HMI_SEND_BUF[0] = VOLUME;PLC_Data_Wr2HMI(0X1210,0,1);//ÒôÁ¿ÏÔʾdelay_ms(100);WRITE_HMI(0X00A1,VOLUME,0x00,0,0,2);//ĬÈÏÒôÁ¿50delay_ms(100);for(i=0;i<5;i++){HMI_SEND_BUF[i] = 0;}for(i=0;i<20;i++){usart1_rxBuf[i] = 0x00;}HMI_HANDLEFLAG = 0;}if(PLAY ==1)//监测是否播放完音乐{READ_HMI(0x00a1,1);delay_ms(100);if(HMI_HANDLEFLAG){if(usart1_rxBuf[8] == 0){PLAY = 0;for(i=0;i<50;i++){usart1_rxBuf[i] = 0x00;}usart1_counter = 0;}}}SCAN_KEY(0);//按键扫描if(HMI_HANDLEFLAG)//接收触摸屏数据处理{HMI_HANDLEFLAG = 0;CLOSE_OPEN_IO(0x01);CLOSE_OPEN_IO(0x02);CLOSE_OPEN_IO(0x03);CLOSE_OPEN_IO(0x04);CLOSE_OPEN_IO(0x05);for(i=0;i<50;i++){usart1_rxBuf[i] = 0x00;}usart1_counter = 0;}
}
2). PLC_Data_Wr2HMI ():数据写入触摸屏变量寄存器
void PLC_Data_Wr2HMI(uint16_t HMI_start_addr,uint16_t PLC_return_data_start_addr,uint8_t len)
{uint8_t i;usart1_txBuf[0]=0x5a;usart1_txBuf[1]=0xa5;usart1_txBuf[2]=len*2+3;usart1_txBuf[3]=0x82;usart1_txBuf[4]=((uint8_t)(HMI_start_addr>>8))&0XFF;usart1_txBuf[5]=(uint8_t)(HMI_start_addr&0XFF);for(i=0;i<len;i++){usart1_txBuf[i*2+6]=((HMI_SEND_BUF[i+PLC_return_data_start_addr] >>8)&0xff);usart1_txBuf[i*2+7]=(HMI_SEND_BUF[i+PLC_return_data_start_addr] &0xff);}HAL_UART_Transmit(&huart1, usart1_txBuf, len*2+6, 10);//串口发送
}
3). WRITE_HMI ():数据写入触摸屏寄存器
void WRITE_HMI(uint16_t addr,uint8_t data1,uint8_t data2,uint8_t data3,uint8_t data4,uint8_t len)
{usart1_txBuf[0]=0x5a;usart1_txBuf[1]=0xa5;usart1_txBuf[2]=len*2+3;usart1_txBuf[3]=0x82;usart1_txBuf[4]=(uint8_t)((addr>>8)&0xff);usart1_txBuf[5]=(uint8_t)(addr&0xff);usart1_txBuf[6]=data1;usart1_txBuf[7]=data2;usart1_txBuf[8]=data3;usart1_txBuf[9]=data4;HAL_UART_Transmit(&huart1, usart1_txBuf, len*2+6 , 20);
}
4). READ_HMI ():读触摸屏寄存器数据
void READ_HMI(uint16_t addr,uint8_t num)
{usart1_txBuf[0]=0x5a;usart1_txBuf[1]=0xa5;usart1_txBuf[2]=0x04;usart1_txBuf[3]=0x83;usart1_txBuf[4]=(uint8_t)((addr>>8)&0xff);usart1_txBuf[5]=(uint8_t)(addr&0xff);usart1_txBuf[6]=num;HAL_UART_Transmit(&huart1, usart1_txBuf, 7 , 20);
}
5). CLOSE_OPEN_IO ():开关LED
void CLOSE_OPEN_IO(uint8_t hmi_key_value)
{ uint8_t i;if(usart1_rxBuf[7] == 0x00&&usart1_rxBuf[8] == hmi_key_value)//LED1{if(LED_FLAG[hmi_key_value-1] == 0){if(hmi_key_value == 0x01){   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_RESET);//开LED1}if(hmi_key_value == 0x02){   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET); //开LED2}if(hmi_key_value == 0x03){   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); //开LED3}if(hmi_key_value == 0x04){   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); //开LED4}if(hmi_key_value == 0x05){   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); //开LED5}LED_FLAG[hmi_key_value-1] = 1;}else if(LED_FLAG[hmi_key_value-1] == 1){if(hmi_key_value == 0x01){   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_SET);//关LED1}if(hmi_key_value == 0x02){   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET); //关LED2}if(hmi_key_value == 0x03){   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET); //关LED3}if(hmi_key_value == 0x04){   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); //关LED4}if(hmi_key_value == 0x05){   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); //关LED5}LED_FLAG[hmi_key_value-1] = 0;}for(i=0;i<9;i++){usart1_rxBuf[i] = 0xff;}for(i=0;i<5;i++){HMI_SEND_BUF[i] = LED_FLAG[i];}PLC_Data_Wr2HMI(0X1000,0,5);//发送LED状态到触摸屏,改变LED显示图标;delay_ms(50);}
}
6). CLOSE_OPEN_IO ():开关LED
void SCAN_KEY(uint8_t io_key_value)
{ uint8_t i;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_10)==GPIO_PIN_RESET)//KEY1按下{delay_ms(150);//去抖if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_10)==GPIO_PIN_RESET){if(HMI_FLAG[0] == 0){WRITE_HMI(0X82,0x00,0x00,0,0,1);//熄灭屏幕HMI_FLAG[0] = 1;}else if(HMI_FLAG[0] == 1){WRITE_HMI(0X82,0X64,0x00,0,0,1);//点亮屏幕HMI_FLAG[0] = 0;}}for(i=0;i<50;i++){usart1_rxBuf[i] = 0x00;}usart1_counter = 0;}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11)==GPIO_PIN_RESET)//KEY2按下{delay_ms(150);//去抖if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11)==GPIO_PIN_RESET){TEMP += 1;HMI_SEND_BUF[0] = TEMP;PLC_Data_Wr2HMI(0X1110,0,1);//温度+}for(i=0;i<50;i++){usart1_rxBuf[i] = 0x00;}usart1_counter = 0;}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)==GPIO_PIN_RESET)//KEY3按下{delay_ms(150);//去抖if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)==GPIO_PIN_RESET){TEMP -= 1;HMI_SEND_BUF[0] = TEMP;PLC_Data_Wr2HMI(0X1110,0,1);//温度-}for(i=0;i<50;i++){usart1_rxBuf[i] = 0x00;}usart1_counter = 0;}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13)==GPIO_PIN_RESET)//KEY4按下{delay_ms(150);//去抖if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13)==GPIO_PIN_RESET){if(PLAY == 0){           WRITE_HMI(0X00A0,0X00,0x0E,0,0,1);PLAY =1;//播放}else if(PLAY == 1){                       WRITE_HMI(0X00A0,0X00,0x00,0,0,1);PLAY =0;//停止}}for(i=0;i<50;i++){usart1_rxBuf[i] = 0x00;}usart1_counter = 0;}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)==GPIO_PIN_RESET)//KEY5按{delay_ms(150);//去抖if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)==GPIO_PIN_RESET){if(VOLUME<250){VOLUME += 10;WRITE_HMI(0X00A1,VOLUME,0x00,0,0,2);//音量+delay_ms(50);HMI_SEND_BUF[0] = VOLUME;PLC_Data_Wr2HMI(0X1210,0,1);//写当前音量到触摸屏delay_ms(50);}}for(i=0;i<50;i++){usart1_rxBuf[i] = 0x00;}usart1_counter = 0;}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)==GPIO_PIN_RESET)//KEY6按下{delay_ms(150);//去抖if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)==GPIO_PIN_RESET){if(VOLUME >= 10){VOLUME -= 10;WRITE_HMI(0X00A1,VOLUME,0x00,0,0,2);//音量-delay_ms(50);HMI_SEND_BUF[0] = VOLUME;PLC_Data_Wr2HMI(0X1210,0,1);//写当前音量到触摸屏delay_ms(50);}           }for(i=0;i<50;i++){usart1_rxBuf[i] = 0x00;}usart1_counter = 0;}}7). delay_ms ():延时函数,不精确慎用
void delay_ms(uint16_t nms)
{uint16_t i,j;for(i=0;i<nms;i++){for(j=0;j<10000;j++){;}}
}
8). USART1_IRQHandler ():数据接收中断
void USART1_IRQHandler(void)
{HAL_UART_IRQHandler(&huart1);if(usart1_rxBuf[0] == 0x5a&&usart1_rxBuf[1] == 0xa5&&usart1_rxBuf[2]){if(usart1_counter >= 3&&usart1_counter<(usart1_rxBuf[2]+3)){usart1_rxBuf[usart1_counter] = usart1_data;usart1_counter++;}if(usart1_counter >= 3&&usart1_counter>=(usart1_rxBuf[2]+3)){HMI_HANDLEFLAG = 1;//接收完成标志}}if(usart1_counter < 3){   usart1_rxBuf[usart1_counter] = usart1_data; usart1_counter++;}if(HMI_HANDLEFLAG){usart1_counter = 0;}HAL_UART_Receive_IT(&huart1,&usart1_data,1);//开接收中断
}

更多内容:界面工程文件、MCU_STM32F103RCT6 程序、演示视频、硬件结构图
及原理图、使用说明以及相关介绍
更多内容点击这里

分享:STM32与迪文屏交互,轻松实现一些简单的功能!相关推荐

  1. STM32串口中断程序-迪文屏,

    STM32串口中断程序-迪文屏,串口接收准确数值 这几天一直在做原子开发板与迪文屏的通信,开发板向迪文屏写数据已经完成,但是从迪文屏读的数据总是无法返回开发板.原始及调试程序见下图: 在串口接收到从d ...

  2. 22、T5L 迪文屏 C51开发之Hello World例程

    T5L 迪文屏 C51开发之Hello World例程 1.写在前面 2.例程功能简介 3.GUI界面设计 4.C51代码设计 1.写在前面   前面已经介绍了如何使用DGUS Tool软件来进行迪文 ...

  3. 30、T5L 迪文屏 C51开发之 ADC模数转换

    T5L 迪文屏 C51开发之 ADC模数转换 1.介绍 2.例程功能介绍 3.GUI界面设计 4.C51程序设计 1.介绍   T5L 芯片内部的 ADC 模数转换外设,有一点需要注意的是此 ADC ...

  4. 1、迪文屏基于T5L_C51开发手势6宫格解锁

    演示视频 1.概述 基于迪文屏DMG32240C028-03WTC屏的滑动手势6宫格解锁功能,该功能运用了触摸屏状态读取和坐标读取的功能(系统变量接口0x0016),绘图功能,需要配合变量图标显示等基 ...

  5. 一种迪文屏软件在线升级方法

    --来自迪文开发者论坛 开发自己的项目中遇到文件升级不方便的问题,因此设计了一个在线升级方案,可以有效解决如下问题: 1. 当产品已发出需要修复Bug时,无法在线修复. 2. 无法判断新老版本,当数据 ...

  6. 【OKT507】迪文屏事件

    前言 本章介绍如何实现迪文屏与飞凌OKT507的uart事件通信. 代码 从上到下是uart_example.c.dwin.c.dwin.h.makefile #include "dwin. ...

  7. 【资料分享】迪文屏使用经验分享

    DIWEN 写在前面的话 我的屏幕 显示图片 SD卡 FLASH分配 举例工程 Diwen ico生成工具 使用经验总结 写在前面的话 以下内容是本人在观看迪文科技在哔哩哔哩的教学视频所做的笔记 几乎 ...

  8. 分享|基于迪文T5L智能屏的净水机智能控制系统方案

    --来自迪文开发者论坛用户开源案例 整体方案基于评估板 EKT043 设计,单 T5L 芯片处理屏幕显示触摸以及外部系统的控制: 接收并处理由高压传感器监测到的高.低压开关信号,实时显示数值在屏幕上: ...

  9. 迪文屏OS汇编代码开发-参数修改 保存 翻页(七)

    ; DWIN OS ;程序功能:上翻页,下翻页,参数修改,保存 ;软件环境: DWIN OS ASM Builder V1.5 ;硬件环境:DW K600+平台 ;变量 ;用户数据区地址从0x0600 ...

最新文章

  1. 使用线性回归的预测建模
  2. OC Autorelease
  3. java.util.concurrent.RejectedExecutionException
  4. 神雕侠侣服务器维修,《神雕侠侣》2019年6月13日更新维护新服开启公告
  5. Revit二次开发——新建墙类型
  6. 百度云大文件高速下载方法、软件
  7. C# 阿拉伯数字转换为中文数字/中文数字转换为阿拉伯数字
  8. 小程序的框架研究报告(开发框架、UI框架)
  9. 超实用的大学网课答案搜题软件及公众号有哪些?
  10. Arcgis去除矢量文件Z值和/或M值方法
  11. Arduino 寄存器(ADC)
  12. 三国志战略版:Daniel_张角分析
  13. 机器学习教程 之 SKlearn 中 PCA 算法的运用:人脸识别实例
  14. float和double的精度
  15. Launcher3-桌面布局+主要的类+启动流程
  16. IT职场人生系列之二十三:知识体系(专家与杂家)
  17. MySQL数据库引擎、数据事务与隔离级别
  18. Win10中解决Prolific PL2303出现错误代码10的问题
  19. Heritrix Eclipse下环境配置
  20. DAO 的去中心化程度判定:钟形曲线

热门文章

  1. Ultimaker2+使用指南
  2. 音视频系列2:基本知识
  3. 【芝麻IP代理】Python的五个数据项目,你知道吗?
  4. C++ 五子棋双人对战免费源码----鼠标操作(DEV-CPP)
  5. Facebook广告投放需要多少费用?如何设置Facebook广告预算?(干货教程)
  6. Java实现多线程聊天室
  7. 腾讯云运维考试题及答案
  8. 2021年低压电工试题及解析及低压电工复审模拟考试
  9. 【报告分享】2021年中国移动互联网半年度大报告-Mob研究院 (附下载)
  10. 【51单片机】开发工具的安装及使用