stm32连接串口屏HF043
前言
我们先来看下串口屏,下图:
可以看到串口屏接线只需四根,就可以实现对屏幕的控制。我在某宝购买的型号HF043串口屏,价格80多,我加了demo板,其实只需要买屏和线就够了,一定要有USB转TTL模块哦。我的屏幕是4.3寸(不带触摸功能),欧克克,让我们开始吧。
一、软件设置串口屏
一般商家会自带软件,可以对串口屏进行设置,比如添加图片、动画,或者按键、文字、进度条、指针等。
软件的使用也很简单,新建一个页面Page0,添加一些自己想要的按键文案,如图(自己随意):
上图中可以看到,屏幕上一些简单设置,可在右侧编辑具体颜色、文字等,左边可以添加图片,添加好后,先下载再设置动画。
中间的命令行及串口可以对屏幕进行测试,我们也可以把这些命令用单片机串口输出,直接控制串口屏,就像stm32和esp8266用AT指令互动一样。
我是先把屏幕动画,图案设置好,再利用单片机输出命令控制它。
我们先来看下效果:
串口屏stm32互动
二、代码设置
先来看main.c,关键地方我写了注释,大家也可以尝试换其他命令尝试下。
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "key.h"
#include "led.h"typedef unsigned long uint32; //连线RX连接PA10,TX连接PA9
extern unsigned char val[];
int main(void)
{ vu8 key1=0;unsigned char i,k;unsigned char ret;char buf[128];unsigned char key=0xff;unsigned char data_h,data_l;unsigned short data;SystemInit();//初始化RCC 设置系统主频为72MHZdelay_init(); //延时初始化uart_init(115200); //串口初始化为115200SPI_Flash_Init(); delay_ms(500);SPI_Flash_Read(&data_h,0,1); SPI_Flash_Read(&data_l,1,1); data=data_h*256+data_l; KEY_Init();LED_Init();while(1){ delay_ms(500); key1=KEY_Scan(0);if(key1){switch(key1){case WKUP_PRES: //控制蜂鸣器UartSend("JUMP(1);\r\n");//翻页CheckBusy();delay_ms(100);break; case KEY1_PRES:UartSend("SET_BTN(3,1);SET_POINT(2,90);SET_PROG(1,50);\r\n");//控制按键、指针、进度条CheckBusy();LED1=!LED1;delay_ms(10); break;case KEY0_PRES:UartSend("SET_BTN(3,0);SET_POINT(2,150);SET_PROG(1,100);\r\n");CheckBusy();LED0=!LED0;delay_ms(100);break;}}}
}
串口使用到了stm32f103的串口1,库文件如下:usart.h
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "sys.h" extern u8 USART_RX_BUF[64]; //接收缓冲,最大63个字节.末字节为换行符
extern u8 USART_RX_STA; //接收状态标记 void uart_init(u32 bound);
void UartSend(char * databuf) ;
void CheckBusy(void) ;
#endif
这个是usart.c,大家把它们添加到模板里。
#include "sys.h"
#include "usart.h"
#include "delay.h"typedef unsigned long uint32; //加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle; }; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{ while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch;
}
#endif /*使用microLib的方法*//*
int fputc(int ch, FILE *f)
{USART_SendData(USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch;
}
int GetKey (void) { while (!(USART1->SR & USART_FLAG_RXNE));return ((int)(USART1->DR & 0x1FF));
}
*/
int UartGet (void) { while (!(USART1->SR & USART_FLAG_RXNE));return ((int)(USART1->DR & 0x1FF));
} extern u8 rx_flag_finished;
extern u8 RX_BUF[];
extern u8 rx_count;
extern u8 ok;
void CheckBusy(void)
{while(1){if(ok==0x0f)break;} ok=0;
}void get_var(unsigned char *val){ for(;;){ if((RX_BUF[0]=='V')&&(RX_BUF[1]=='A')&&(RX_BUF[2]=='R')){RX_BUF[0]=0;RX_BUF[1]=0;RX_BUF[2]=0;val[0]=RX_BUF[3];val[1]=RX_BUF[4];val[2]=RX_BUF[5];val[3]=RX_BUF[6];rx_flag_finished=0; rx_count=0;break; } }}char rch[5][3]; //xxx:xxx,xxx,xxx,xxx
u8 i=0;
u8 p=0;//
u8 cmd=0; //==1
u8 cmdok=0; //==1
u8 ok=0x00;
void getch(u8 c)
{ if (c=='{'){ i=0;cmd=1;p=0;}else if(c=='}'){ cmd=0;cmdok=1;}else if((c==':')||(c==',')){p++;i=0;} else if (cmd==1){ if (i<3) rch[p][i]=c;i++;}else if(c=='O'){ok=(ok&0x00)|(0x01);} else if(c=='K'){ok=(ok&0x0d)|(0x02);} else if(c=='\r'){ok=(ok&0x0b)|(0x04);}else if(c=='\n'){ok=(ok&0x07)|(0x08);}}
unsigned char val[4];
unsigned char GetValue(void)
{ unsigned char m,n;while(1){ if(cmdok==1){ if ((rch[0][0]=='V')&&(rch[0][1]=='A')&&(rch[0][2]=='R')){ /*第一个字节*/if ((rch[1][2]>=0x30) && (rch[1][2]<=0x39))//100以上的数 { val[0]=(rch[1][0]-0x30)*100+(rch[1][1]-0x30)*10+(rch[1][2]-0x30);}else if((rch[1][1]>=0x30) && (rch[1][1]<=0x39)) //10以上的数{val[0]=(rch[1][0]-0x30)*10+(rch[1][1]-0x30);} else if((rch[1][0]>=0x30) && (rch[1][0]<=0x39)){val[0]=(rch[1][0]-0x30); }/*第二个字节*/if ((rch[2][2]>=0x30) && (rch[2][2]<=0x39))//100以上的数{ val[1]=(rch[2][0]-0x30)*100+(rch[2][1]-0x30)*10+(rch[2][2]-0x30); }else if((rch[2][1]>=0x30) && (rch[2][1]<=0x39)) //10以上的数{val[1]=(rch[2][0]-0x30)*10+(rch[2][1]-0x30);} else if((rch[2][0]>=0x30) && (rch[2][0]<=0x39)){val[1]=(rch[2][0]-0x30); }/*第三个字节*/if ((rch[3][2]>=0x30) && (rch[3][2]<=0x39))//100以上的数{ val[2]=(rch[3][0]-0x30)*100+(rch[3][1]-0x30)*10+(rch[3][2]-0x30);}else if((rch[3][1]>=0x30) && (rch[3][1]<=0x39)) //10以上的数{val[2]=(rch[3][0]-0x30)*10+(rch[3][1]-0x30);} else if((rch[3][0]>=0x30) && (rch[3][0]<=0x39)){val[2]=(rch[3][0]-0x30); }/*第四个字节*/if ((rch[4][2]>=0x30) && (rch[4][2]<=0x39))//100以上的数{ val[3]=(rch[4][0]-0x30)*100+(rch[4][1]-0x30)*10+(rch[4][2]-0x30);}else if((rch[4][1]>=0x30) && (rch[4][1]<=0x39)) //10以上的数{val[3]=(rch[4][0]-0x30)*10+(rch[4][1]-0x30);} else if((rch[4][0]>=0x30) && (rch[4][0]<=0x39)){val[3]=(rch[4][0]-0x30); } for(n=0;n<5;n++)for(m=0;m<3;m++)rch[n][m]=0;cmdok=0;break;}// cmdok=0;} }
}unsigned char GetKey(unsigned char *rval)
{ unsigned char m,n;while(1){ if(cmdok==1){ if ((rch[0][0]=='U')&&(rch[0][1]=='P')){ *rval=1;cmdok=0;for(n=0;n<5;n++)for(m=0;m<3;m++)rch[n][m]=0;break; }else if ((rch[0][0]=='D')&&(rch[0][1]=='N')){*rval=0;cmdok=0;for(n=0;n<5;n++)for(m=0;m<3;m++)rch[n][m]=0;break; }}} }void UartSend(char * databuf)
{ u8 i=0;while (1){ if ((*databuf)!=0)//直到数据都发送完成 { USART_SendData(USART1, *databuf); //发送一个字节数据while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}; //databuf++;//i++;}else return;}
}u8 USART_RX_BUF[64]; //接收缓冲,最大64个字节.
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u8 USART_RX_STA=0; //接收状态标记#ifdef AUTO_TEST#define AUTO_NEXT
#else#define MANUA_NEXT
#endif#define AUTO_NEXT //自动
//#define MANUA_NEXT //手动#define KEY_UP GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)//定义“下一步”按键
#define KEY_DOWM GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)//定义上一步”按键
#define KEY_Stop GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)//定义"暂停"void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC, ENABLE);//_KEY_STEP PC0 UPGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉GPIO_Init(GPIOC, &GPIO_InitStructure);//_KEY_STEP PC1 DOWNGPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉GPIO_Init(GPIOC, &GPIO_InitStructure);//_KEY_Stop PC2 暂停GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOC, &GPIO_InitStructure);//_LED PD2GPIO_SetBits(GPIOD,GPIO_Pin_2); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD, &GPIO_InitStructure); // GPIO_SetBits(GPIOD,GPIO_Pin_2);//USART1_TX PA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);//USART1_RX PA.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure); //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断USART_Cmd(USART1, ENABLE); //使能串口 }//extern void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite);
extern void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite);u8 RX_BUF[4];
u8 rx_flag_finished=0;
u8 rx_count=0;
void USART1_IRQHandler(void) //??1??????
{u8 Res=1;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //????(?????????0x0d 0x0a??){Res =USART_ReceiveData(USART1);//(USART1->DR); //????????getch(Res);}
}
完整工程
qq-hh-My_Project_stm32/stm32串口屏 at master · qq-hh/qq-hh-My_Project_stm32 (github.com)https://github.com/qq-hh/qq-hh-My_Project_stm32/tree/master/stm32%E4%B8%B2%E5%8F%A3%E5%B1%8F
stm32连接串口屏HF043相关推荐
- STM32与串口屏交互(USART HMI)
STM32与串口屏交互(USART HMI) 一.前期准备 二.串口屏上位机使用方法以及界面设计 三.STM32软件编程 四.单片机发送数据的字符串指令汇总 五.总结 不管是备战电赛还是准备毕设,一块 ...
- STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏
STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...
- 我的stm32学习——串口屏的使用
一.前言 本来打算来学校前写这篇博客,拖拖拉拉拖到现在,开学都3天了,终于在星期四的凌晨敲下了这一行字,本篇博客记录开发串口屏的心得,望大佬指点. 我买的是3.2寸的陶晶驰串口屏,其分辨率为400*2 ...
- 连接串口_气压计PTB330连接HMI串口屏
本篇约1700字10图 分享人:张彦飞 (菏泽) ---全文概述 这是一篇"小创造"的开发经验分享. 在用振筒气压仪故障,购买新气压显示仪器的申请迟迟未通过,聪明的机务员巧用备件, ...
- STM32串口屏应用
今天搞到一块串口屏,真的是打开了一个新世界的大门.不禁感慨,这么好的东西,怎么现在才知道呢,悔了悔了. 型号TJC4827T043_011. 一开始上手的时候一脸闷逼,这玩意怎么用.但是这块屏的资料很 ...
- USART HMI智能串口屏与单片机双向通讯
目录 ·HMI串口屏介绍 ·HMI串口屏开发实操 ·准备 ·界面认识 ·写命令 ·下载 ·HMI串口屏与单片机(stm32)双向通信 [ 功能实现: STM32控制串口屏对应的数值.文本完成相应变化 ...
- 【逗老师的无线电】MMDVM串口屏相关开发
哎呀呀,终于研究通透了MMDVM的串口屏相关了. 目录 一.Nextion和陶晶驰串口屏 NXT和TJC的设计软件资源 二.MMDVM与串口屏通信原理 1.指令发送 1.1.文本更新指令 1.2.页面 ...
- 陶晶驰stm32_陶晶驰HMI3.5寸串口屏的详解之梳理F4总结系列准备篇(二)
基于stm32的串口屏教程.用过的人都说好,哈哈哈,减少了我们很多不太必要的麻烦步骤. 程序资料包CSDN下载地址:https://download.csdn.net/download/qq_3835 ...
- 大彩串口屏和STM32 HAL库使用经验
1.硬件方面 首先查看背面电路板J5跳线,有一块丝印写着"OFF=RS232 ON=TTL",附近有个J5焊点先找到.如果是和单片机连接的,则要把此焊点连接起来.如果是和PC模拟的 ...
最新文章
- 动态人脸识别系统服务器,动态人脸识别监控管理平台的设计与实现
- Transformer 眼中世界 Vs. CNN 眼中世界
- OneNote代码高亮插件(NoteHighLight)
- 滚动条加载功能实现(懒加载)
- (十二)运行环境(加载、性能优化、安全)【这些会了,你就可以飞了】
- 两平面平行方向向量关系_一文读懂 GDT 中的平面度
- php数组的奇数_PHP - 查找数组元素是奇数还是偶数
- 不重启的情况下清除网络共享的密码
- ArrayList非线程安全
- 百度SEO标题关键词伪原创组合工具
- 【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)
- 开机后黑屏看不到桌面_电脑开机后黑屏不显示桌面解决方法
- 大数据的本质和核心是什么
- 南阳 oj 6174问题
- RTC电池供电时二极管选择注意
- GPU和CPU跑程序的代码区别
- SQL 关于时区的处理案例
- 积小胜为大胜 投资大师教你三种有效的投资方法
- 盘点10个堪称神器,却不为人所知的小众软件
- pytorch Module里的children()与modules()的区别
热门文章
- vscode下载缓慢问题解决
- 非洲多个国家互联网电商消费者增长高达30%的幅度
- iPhone,iPad横屏竖屏的判断
- winphone 边框(Border)
- 发那科机器人电柜没电怎么回事_发那科机器人电路板故障怎么维修?
- springboot项目系列-论坛系统05全局异常处理+日志处理+MD5加密
- 程序汪8万接的共享口罩项目,开发周期1个月
- @EnableCircuitBreaker过时
- 动力电池相关安全性测试标准
- 用了enctype=multipart/form-data,request出的数据为null