分享:STM32与迪文屏交互,轻松实现一些简单的功能!
最近,托朋友用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与迪文屏交互,轻松实现一些简单的功能!相关推荐
- STM32串口中断程序-迪文屏,
STM32串口中断程序-迪文屏,串口接收准确数值 这几天一直在做原子开发板与迪文屏的通信,开发板向迪文屏写数据已经完成,但是从迪文屏读的数据总是无法返回开发板.原始及调试程序见下图: 在串口接收到从d ...
- 22、T5L 迪文屏 C51开发之Hello World例程
T5L 迪文屏 C51开发之Hello World例程 1.写在前面 2.例程功能简介 3.GUI界面设计 4.C51代码设计 1.写在前面 前面已经介绍了如何使用DGUS Tool软件来进行迪文 ...
- 30、T5L 迪文屏 C51开发之 ADC模数转换
T5L 迪文屏 C51开发之 ADC模数转换 1.介绍 2.例程功能介绍 3.GUI界面设计 4.C51程序设计 1.介绍 T5L 芯片内部的 ADC 模数转换外设,有一点需要注意的是此 ADC ...
- 1、迪文屏基于T5L_C51开发手势6宫格解锁
演示视频 1.概述 基于迪文屏DMG32240C028-03WTC屏的滑动手势6宫格解锁功能,该功能运用了触摸屏状态读取和坐标读取的功能(系统变量接口0x0016),绘图功能,需要配合变量图标显示等基 ...
- 一种迪文屏软件在线升级方法
--来自迪文开发者论坛 开发自己的项目中遇到文件升级不方便的问题,因此设计了一个在线升级方案,可以有效解决如下问题: 1. 当产品已发出需要修复Bug时,无法在线修复. 2. 无法判断新老版本,当数据 ...
- 【OKT507】迪文屏事件
前言 本章介绍如何实现迪文屏与飞凌OKT507的uart事件通信. 代码 从上到下是uart_example.c.dwin.c.dwin.h.makefile #include "dwin. ...
- 【资料分享】迪文屏使用经验分享
DIWEN 写在前面的话 我的屏幕 显示图片 SD卡 FLASH分配 举例工程 Diwen ico生成工具 使用经验总结 写在前面的话 以下内容是本人在观看迪文科技在哔哩哔哩的教学视频所做的笔记 几乎 ...
- 分享|基于迪文T5L智能屏的净水机智能控制系统方案
--来自迪文开发者论坛用户开源案例 整体方案基于评估板 EKT043 设计,单 T5L 芯片处理屏幕显示触摸以及外部系统的控制: 接收并处理由高压传感器监测到的高.低压开关信号,实时显示数值在屏幕上: ...
- 迪文屏OS汇编代码开发-参数修改 保存 翻页(七)
; DWIN OS ;程序功能:上翻页,下翻页,参数修改,保存 ;软件环境: DWIN OS ASM Builder V1.5 ;硬件环境:DW K600+平台 ;变量 ;用户数据区地址从0x0600 ...
最新文章
- 使用线性回归的预测建模
- OC Autorelease
- java.util.concurrent.RejectedExecutionException
- 神雕侠侣服务器维修,《神雕侠侣》2019年6月13日更新维护新服开启公告
- Revit二次开发——新建墙类型
- 百度云大文件高速下载方法、软件
- C# 阿拉伯数字转换为中文数字/中文数字转换为阿拉伯数字
- 小程序的框架研究报告(开发框架、UI框架)
- 超实用的大学网课答案搜题软件及公众号有哪些?
- Arcgis去除矢量文件Z值和/或M值方法
- Arduino 寄存器(ADC)
- 三国志战略版:Daniel_张角分析
- 机器学习教程 之 SKlearn 中 PCA 算法的运用:人脸识别实例
- float和double的精度
- Launcher3-桌面布局+主要的类+启动流程
- IT职场人生系列之二十三:知识体系(专家与杂家)
- MySQL数据库引擎、数据事务与隔离级别
- Win10中解决Prolific PL2303出现错误代码10的问题
- Heritrix Eclipse下环境配置
- DAO 的去中心化程度判定:钟形曲线