大明哥 发表于 2023-11-24 20:34:46

【开源】迪文82 83指令 STM32单片机 FreeRtos,小白速看 ,密码

这个贴子的代码,非常适合小白第一次使用迪文屏,用于单片机通信主要写了stm32和迪文原生态8283指令数据接口框架,进行通信。用了开机密码做个实验演示屏幕用的是DMG80480C043_01WTC
视频效果如下:https://v.youku.com/v_show/id_XNjE4MjA4MDY0MA==.html




迪文,用的是串口2,不需要编写屏幕代码,稍微搞下GUI界面就行了单片机用的是STM32F103VET6

先打开comm.c 这个文件,这个文件代码定义了,操作迪文屏幕内存代码
//主要是写屏幕内存u8 DWIN_WriteLen(u16 addr,u8 *data,u8 len){       u8ret=1;       EventBits_tEventValue;       u16waitTick=20;       xEventGroupClearBits(EventGroupHandler,EVENTBIT_DwinGetData);       DWIN_RECSTA=0;
       DWIN_SendByte(0x5a);       DWIN_SendByte(0xa5);       DWIN_SendByte(len*2+2+1);       DWIN_SendByte(0x82);       DWIN_SendByte(addr>>8);       DWIN_SendByte(addr&0xff);
       for(inti=0;i<len;i++)       {            DWIN_SendByte(data);            DWIN_SendByte(data);       }       wait_ReadWriteBit|=0x01;       if(waitTick)       {                     ret=0;                     EventValue=xEventGroupWaitBits((EventGroupHandle_t )EventGroupHandler,                                                                                   (EventBits_t                  )EVENTBIT_DwinGetData,                                                                         (BaseType_t                   )pdFALSE,                                                                                                    (BaseType_t                   )pdFALSE,                                                               (TickType_t                  )waitTick);                       if(EventValue&EVENTBIT_DwinGetData)                     {                            if(DWIN_RecBuff==0x5a &&                               DWIN_RecBuff==0xa5       &&                                    DWIN_RecBuff==0x82&&                                    DWIN_RecBuff==0x4f    &&                                    DWIN_RecBuff==0x4b)                                    {                                                 xEventGroupClearBits(EventGroupHandler,EVENTBIT_DwinGetData);                                                 ret=1;                                    }                                 DWIN_RECSTA=0;                     }       }       wait_ReadWriteBit&=~0x01;
       returnret;}
//主要是写屏幕内存,单字u8 DWIN_WriteOne(u16 addr,u16 data){       u8da;
       da=data>>8;       da=data&0xff;
       returnDWIN_WriteLen(addr,da,1);}

//主要是读屏幕内存u8 DWIN_ReadLen(u16 addr,u8 *data,u8 len){       u8ret=1;       EventBits_tEventValue;       u16waitTick=40;       xEventGroupClearBits(EventGroupHandler,EVENTBIT_DwinGetData);       DWIN_RECSTA=0;
       DWIN_SendByte(0x5a);       DWIN_SendByte(0xa5);       DWIN_SendByte(4);       DWIN_SendByte(0x83);       DWIN_SendByte(addr>>8);       DWIN_SendByte(addr&0xff);       DWIN_SendByte(len);
       wait_ReadWriteBit|=0x02;       if(waitTick)       {                     ret=0;                     EventValue=xEventGroupWaitBits((EventGroupHandle_t )EventGroupHandler,                                                                                   (EventBits_t                  )EVENTBIT_DwinGetData,                                                                         (BaseType_t                   )pdFALSE,                                                                                                    (BaseType_t                   )pdFALSE,                                                               (TickType_t                  )waitTick);                       if(EventValue&EVENTBIT_DwinGetData)                     {                            if(DWIN_RecBuff==0x5a&&                               DWIN_RecBuff==0xa5       &&                                    DWIN_RecBuff==0x83 &&                                    DWIN_RecBuff==(addr>>8)&&                                    DWIN_RecBuff==(addr&0xff)&&                                    DWIN_RecBuff==len)                                    {                                                 memcpy(data,&DWIN_RecBuff,len*2);                                                 ret=1;                                                 xEventGroupClearBits(EventGroupHandler,EVENTBIT_DwinGetData);                                    }                            DWIN_RECSTA=0;                     }       }       wait_ReadWriteBit&=~0x02;
       returnret;}
//清除屏幕内存void Clear_DWIN_Memory(u8 len,u16 addr){       DWIN_SendByte(0x5a);       DWIN_SendByte(0xa5);       DWIN_SendByte(len*2+2+1);       DWIN_SendByte(0x82);       DWIN_SendByte(addr>>8);       DWIN_SendByte(addr&0xff);
       for(inti=0;i<len;i++)       {            DWIN_SendByte(0);            DWIN_SendByte(0);       }      }
//用于显示文本的内容void DWIN_DispString(u16 addr,char *data){       u8sendstr;       u8len=0;       memset(sendstr,0,sizeof(sendstr));
       strcpy((char*)sendstr,data);       len=strlen(data);       if(len/2)       {            len/=2;            len++;       }       else       {            len/=2;       }
       DWIN_WriteLen(addr,sendstr,len);}//用于切换界面void DMT_ChagePage(u16 page){       u8Charr[]={0x5a,0x01,page>>8,page&0xff};       DWIN_WriteLen(0x84,Charr,2);}
//用于处理接收到的数据void DWIN_GetDataHandle(void){       EventBits_tEventValue;       if(wait_ReadWriteBit)            return;
       EventValue=xEventGroupWaitBits((EventGroupHandle_t )EventGroupHandler,                                                                          (EventBits_t                )EVENTBIT_DwinGetData,                                                                (BaseType_t                )pdTRUE,                                                                                      (BaseType_t                )pdFALSE,                                                                (TickType_t               )0);
       if(EventValue&EVENTBIT_DwinGetData)       {            if(DWIN_RecBuff==0x5a&&                      DWIN_RecBuff==0xa5    &&                      DWIN_RecBuff==0x83)                      {                                 DWIN_RECHandle(DWIN_RecBuff<<8|DWIN_RecBuff,                                                                                     &DWIN_RecBuff,DWIN_RecBuff);                      }            DWIN_RECSTA=0;       }}
再看到实际的页面dwin_data_handle.c 这个文件,主要是处理接收的屏幕数据typedef enum{       addr_inputWinScreat=0x1039,}touch_cmd_addr;
#define WinScreat "12345678"
void ScreatCmp(u16 addr,u8 *data,u16 len){       charsctbuf;
       data+=2;       memset(sctbuf,0,sizeof(sctbuf));       for(inti=0;i<(len-1)*2;i++)       {            if(data==0xff&&                      data==0xff)                     break;            sctbuf=data;       }
       if(strlen(WinScreat)==strlen(sctbuf)&&               !memcmp(WinScreat,sctbuf,strlen(sctbuf)))       {                     DMT_ChagePage(1);       }       else       {                     DWIN_DispString(0x1007,"密码错误\r\n密码:12345678");       }}
//len是字长度void DWIN_RECHandle(u16 addr,u8 *data,u16len){       switch(addr)       {            caseaddr_inputWinScreat:                     ScreatCmp(addr,data,len);            break;
       }}


其它,关于代码如何去实现的,大家可以下载代码,参考下。

tang12 发表于 2024-7-6 10:32:31

大佬,能教教我吗,我是小白,在KEIL中创建软件工程具体怎么做啊,不是很懂

大明哥 发表于 2024-7-6 10:47:44

tang12 发表于 2024-7-6 10:32
大佬,能教教我吗,我是小白,在KEIL中创建软件工程具体怎么做啊,不是很懂
...

一般不用创建工程,比如你要你迪文的keil工程,你找一个迪文的KEIL T5L工程,作为基本版本,复制整个工程,重命名,在上面修改就好了。

tang12 发表于 2024-7-6 11:02:37

是我直接再F:\极光蔚蓝这几个文件我在哪可以进行编码啊?:'(

smshu 发表于 2024-7-6 17:13:51

你好,请问一下,数据变量要输入对应的十六进制,代码如何实现啊:dizzy::dizzy:

大明哥 发表于 2024-7-8 09:53:32

smshu 发表于 2024-7-6 17:13
你好,请问一下,数据变量要输入对应的十六进制,代码如何实现啊 ...

迪文原生支持16进制变量输入没有,自已做一个键盘输入界面,0~f 数字,在这个输入界面上,用T5L做一个回显文本框,实时显示,点击确定之后,把变量转换为你需要的16进制,放到你所需要的内存里面。也不难,自已写个实现。

大明哥 发表于 2024-7-8 09:54:20

tang12 发表于 2024-7-6 11:02
是我直接再这几个文件我在哪可以进行编码啊?

KEIL编译,最好不要有中文路径

下载资料公用号 发表于 2024-7-29 11:27:39

请问那个这个用到modbus通信了吗?这个stm单片机需要设置什么吗?

大明哥 发表于 2024-7-29 19:23:18

下载资料公用号 发表于 2024-7-29 11:27
请问那个这个用到modbus通信了吗?这个stm单片机需要设置什么吗?

设置串口波特率,设置串口接收

wyx123 发表于 2024-7-30 10:23:42

请问这个项目大概的意思是屏幕输入密码 数据通过串口传给stm32,stm32判断密码是否正确,如果正确就执行切换页面?切换到收音机那个页面吗
页: [1] 2
查看完整版本: 【开源】迪文82 83指令 STM32单片机 FreeRtos,小白速看 ,密码