前言

我们先来看下串口屏,下图:

可以看到串口屏接线只需四根,就可以实现对屏幕的控制。我在某宝购买的型号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相关推荐

  1. STM32与串口屏交互(USART HMI)

    STM32与串口屏交互(USART HMI) 一.前期准备 二.串口屏上位机使用方法以及界面设计 三.STM32软件编程 四.单片机发送数据的字符串指令汇总 五.总结 不管是备战电赛还是准备毕设,一块 ...

  2. STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...

  3. 我的stm32学习——串口屏的使用

    一.前言 本来打算来学校前写这篇博客,拖拖拉拉拖到现在,开学都3天了,终于在星期四的凌晨敲下了这一行字,本篇博客记录开发串口屏的心得,望大佬指点. 我买的是3.2寸的陶晶驰串口屏,其分辨率为400*2 ...

  4. 连接串口_气压计PTB330连接HMI串口屏

    本篇约1700字10图 分享人:张彦飞 (菏泽) ---全文概述 这是一篇"小创造"的开发经验分享. 在用振筒气压仪故障,购买新气压显示仪器的申请迟迟未通过,聪明的机务员巧用备件, ...

  5. STM32串口屏应用

    今天搞到一块串口屏,真的是打开了一个新世界的大门.不禁感慨,这么好的东西,怎么现在才知道呢,悔了悔了. 型号TJC4827T043_011. 一开始上手的时候一脸闷逼,这玩意怎么用.但是这块屏的资料很 ...

  6. USART HMI智能串口屏与单片机双向通讯

    目录 ·HMI串口屏介绍 ·HMI串口屏开发实操 ·准备 ·界面认识 ·写命令 ·下载 ·HMI串口屏与单片机(stm32)双向通信 [ 功能实现: STM32控制串口屏对应的数值.文本完成相应变化 ...

  7. 【逗老师的无线电】MMDVM串口屏相关开发

    哎呀呀,终于研究通透了MMDVM的串口屏相关了. 目录 一.Nextion和陶晶驰串口屏 NXT和TJC的设计软件资源 二.MMDVM与串口屏通信原理 1.指令发送 1.1.文本更新指令 1.2.页面 ...

  8. 陶晶驰stm32_陶晶驰HMI3.5寸串口屏的详解之梳理F4总结系列准备篇(二)

    基于stm32的串口屏教程.用过的人都说好,哈哈哈,减少了我们很多不太必要的麻烦步骤. 程序资料包CSDN下载地址:https://download.csdn.net/download/qq_3835 ...

  9. 大彩串口屏和STM32 HAL库使用经验

    1.硬件方面 首先查看背面电路板J5跳线,有一块丝印写着"OFF=RS232 ON=TTL",附近有个J5焊点先找到.如果是和单片机连接的,则要把此焊点连接起来.如果是和PC模拟的 ...

最新文章

  1. 动态人脸识别系统服务器,动态人脸识别监控管理平台的设计与实现
  2. Transformer 眼中世界 Vs. CNN 眼中世界
  3. OneNote代码高亮插件(NoteHighLight)
  4. 滚动条加载功能实现(懒加载)
  5. (十二)运行环境(加载、性能优化、安全)【这些会了,你就可以飞了】
  6. 两平面平行方向向量关系_一文读懂 GDT 中的平面度
  7. php数组的奇数_PHP - 查找数组元素是奇数还是偶数
  8. 不重启的情况下清除网络共享的密码
  9. ArrayList非线程安全
  10. 百度SEO标题关键词伪原创组合工具
  11. 【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)
  12. 开机后黑屏看不到桌面_电脑开机后黑屏不显示桌面解决方法
  13. 大数据的本质和核心是什么
  14. 南阳 oj 6174问题
  15. RTC电池供电时二极管选择注意
  16. GPU和CPU跑程序的代码区别
  17. SQL 关于时区的处理案例
  18. 积小胜为大胜 投资大师教你三种有效的投资方法
  19. 盘点10个堪称神器,却不为人所知的小众软件
  20. pytorch Module里的children()与modules()的区别

热门文章

  1. vscode下载缓慢问题解决
  2. 非洲多个国家互联网电商消费者增长高达30%的幅度
  3. iPhone,iPad横屏竖屏的判断
  4. winphone 边框(Border)
  5. 发那科机器人电柜没电怎么回事_发那科机器人电路板故障怎么维修?
  6. springboot项目系列-论坛系统05全局异常处理+日志处理+MD5加密
  7. 程序汪8万接的共享口罩项目,开发周期1个月
  8. @EnableCircuitBreaker过时
  9. 动力电池相关安全性测试标准
  10. 用了enctype=multipart/form-data,request出的数据为null