迪文屏(K600+)驱动代码分享

通讯协议概述

截取串口通讯核心部分,指令说明及配置寄存器定义如下:

在这里插入图片描述

在这里插入图片描述

驱动代码分享

头文件:


/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __DGUS_H__
#define __DGUS_H__

#ifdef __cplusplus
 extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/* Exported constants --------------------------------------------------------*/

/* Exported macro ------------------------------------------------------------*/

#define DE_MSG_MIN_LEN        7
#define DE_MSG_MAX_LEN        50

#define  DE_ENABLE_CRC16    //启用CRC校验

/* Exported types ------------------------------------------------------------*/
typedef enum
{
    EN_ACT_WRITE_REG = 0X80,
    EN_ACT_READ_REG = 0X81,
    EN_ACT_WRITE_RAM = 0X82,
    EN_ACT_READ_RAM = 0X83,
    EN_ACT_WRITE_CURVE = 0X84,
    EN_ACT_MAX,
} EN_ACT;

typedef enum
{
    EN_REG_ADDR_VERSION = 0X00,     //DGUS版本号
    EN_REG_ADDR_LED_SET = 0X01,     //背光亮度控制 0x00-0x40
    EN_REG_ADDR_BZ_TIME = 0X02,     //蜂鸣器鸣叫,10ms

    EN_REG_ADDR_PIC_ID = 0X03,      //当前页面ID
    EN_REG_ADDR_TP_FLAG = 0X05,
    EN_REG_ADDR_TP_STATUS = 0X06,    //
    EN_REG_ADDR_TP_POSION = 0X07,
    EN_REG_ADDR_TPC_ENABLE = 0X0B,   // 0x00 触控不启动

    EN_REG_ADDR_RUN_TIME = 0X0C,
    EN_REG_ADDR_R0_RC = 0X10,
    EN_REG_ADDR_LED_STA = 0X1E,

    EN_REG_ADDR_RTC_COM_ADJ = 0X1F,   //写入0x5A申请修改RTC时间
    EN_REG_ADDR_RTC_NOW = 0X20,       //读写RTC时间

    EN_REG_ADDR_EN_LIB_OP = 0X40,     //读写字库
    EN_REG_ADDR_LIB_OP_MODE = 0X41,
    EN_REG_ADDR_LIB_ID = 0X42,
    EN_REG_ADDR_LIB_ADDRESS = 0X43,
    EN_REG_ADDR_LIB_VP = 0X46,
    EN_REG_ADDR_LIB_OP_LENGTH = 0X48,

    EN_REG_ADDR_KEY_CODE = 0X4F,     //用户键码
    EN_REG_ADDR_PLAY_MUSIC_SET = 0X50,
    EN_REG_ADDR_VOLUME_ADJ = 0X53,

    EN_REG_ADDR_EN_DBL_OP = 0X56,     //读写数据库
    EN_REG_ADDR_OP_MODE = 0X57,
    EN_REG_ADDR_DBL_ADDRESS = 0X58,
    EN_REG_ADDR_VP = 0X5C,
    EN_REG_ADDR_OP_LENGTH = 0X5E,

    EN_REG_ADDR_SCAN_STATUS = 0XE9,
    EN_REG_ADDR_TPCAL_TRIGER = 0XEA,    //写入0x5A 触摸屏校准
    EN_REG_ADDR_TRENDINE_CLEAR = 0XEB,
    EN_REG_ADDR_RESET_TRIGER = 0XEE,    //写入 0x5AA5 复位
} EN_REG_ADDR;

typedef enum
{
    EN_RAM_ADDR_VP_START = 0X0000,
    EN_RAM_ADDR_SP_START = 0X4000,
    EN_RAM_ADDR_HW_START = 0X6F00,

}EN_RAM_ADDR;

typedef enum 
{
    DB_OPER_MODE_WRITE = 0X50,
    DB_OPER_MODE_READ  = 0XA0,
}DB_OPER_MODE;

extern const uint8_t DGUS_MSG_HEAD[2];


/* Exported functions ------------------------------------------------------- */
extern void DgusPowerReset(void);
extern void DgusGetVer(void);
extern void DgusReadPageNum(void);
extern uint8_t DgusMsgCheck(const uint8_t *pMsg, uint8_t MsgLen);
extern void DgusBeepRing(uint8_t TimeLen);
extern void DgusChangePage(uint16_t PageNum);
extern void DgusKeyCodeSet(uint8_t KeyCode);

extern void DgusOperDataBase(DB_OPER_MODE enMode, uint32_t AddrDB, uint16_t AddrRam, uint16_t Len);
extern uint8_t DgusOperRam(EN_ACT enAct, uint16_t RamAddr, const uint8_t *pBuf, uint8_t BufLen);

#ifdef __cplusplus
 }
#endif
 
#endif 

/************************ (C) COPYRIGHT  *****END OF FILE****/

源文件:

/**
  ******************************************************************************
  * @file    
  * @author  
  * @version 
  * @date    
  * @brief   
  ******************************************************************************
  * @attention
  *****************************************************************************/
  
/* Includes ------------------------------------------------------------------*/

#include "dgus.h"
#include <string.h>
#include <stdint.h>
#include <stdio.h>
#include "lcd_msg.h"
#include "crc16.h"
#include "debug.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/*Private variables ---------------------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
const uint8_t DGUS_MSG_HEAD[2] = {0x5A,0xA5};


/**
* @brief  UartMsgCheck
* @param  None
* @retval None
*/
uint8_t DgusMsgCheck(const uint8_t *pMsg, uint8_t MsgLen)
{
    const uint8_t *pHead = pMsg;
    uint8_t CmdLen = pMsg[2];
    uint8_t CmdAct = pMsg[3];

    if ((MsgLen < DE_MSG_MIN_LEN) || (MsgLen != (CmdLen + sizeof(DGUS_MSG_HEAD) + sizeof(CmdLen))))
    {
        return 0;
    }

    if (memcmp(pHead, DGUS_MSG_HEAD, sizeof(DGUS_MSG_HEAD)) != 0)
    {
        return 0;
    }

    if (CmdAct >= EN_ACT_MAX) //
    {
        return 0;
    }

#ifdef DE_ENABLE_CRC16
        uint8_t DataLen = pMsg[sizeof(DGUS_MSG_HEAD)];
        uint16_t ExpectCrcVal = CRC16(pMsg + sizeof(DGUS_MSG_HEAD) + sizeof(uint8_t), DataLen - sizeof(uint16_t));
        uint8_t RawCrcL = pMsg[sizeof(DGUS_MSG_HEAD) + sizeof(uint8_t) + DataLen - sizeof(uint16_t)];
        uint8_t RawCrcH = pMsg[sizeof(DGUS_MSG_HEAD) + sizeof(uint8_t) + DataLen - sizeof(uint8_t)];
        uint16_t RawCrcVal = (RawCrcH << 8) + RawCrcL;

        if (ExpectCrcVal != RawCrcVal)
        {
            return 0;
        }
#endif
    
    return 1;
}

/**
* @brief  DgusLcdMsgSend
* @param  
* @retval 
*/
static uint8_t DgusLcdMsgSend(const uint8_t*pBuf, uint8_t BufLen)
{
    uint8_t Ret = 0;
    uint8_t Index = 0;
    uint8_t DateLen = BufLen;
    uint8_t SendBuf[DE_MSG_MAX_LEN] = {0};

#ifdef DE_ENABLE_CRC16
    uint16_t CrcVal = CRC16(pBuf, BufLen);
    uint8_t CrcValL = CrcVal & 0xFF;
    uint8_t CrcValH = (CrcVal >> 8) & 0xFF;
    DateLen += sizeof(uint16_t);
#endif

    memcpy(SendBuf + Index, DGUS_MSG_HEAD, sizeof(DGUS_MSG_HEAD));
    Index += sizeof(DGUS_MSG_HEAD);
    memcpy(SendBuf + Index, &DateLen, sizeof(DateLen));
    Index += sizeof(DateLen);
    memcpy(SendBuf + Index, pBuf, BufLen);
    Index += BufLen;

#ifdef DE_ENABLE_CRC16
    memcpy(SendBuf + Index, &CrcValL, sizeof(uint8_t));
    Index += sizeof(uint8_t);
    memcpy(SendBuf + Index, &CrcValH, sizeof(uint8_t));
    Index += sizeof(uint8_t);
#endif

    Ret = LcdMsgSend(SendBuf, Index);
    return Ret;
}

/**
* @brief  DgusOperRam
* @param
* @retval
*/
uint8_t DgusOperRam(EN_ACT enAct, uint16_t RamAddr, const uint8_t *pBuf, uint8_t BufLen)
{
    if (enAct > EN_ACT_READ_RAM)
    {
        return 0;
    }
    
//    DebugPrintf("DgusOperRam,Act = %04x,Addr = %04x\r\n",enAct,RamAddr);

    uint8_t Ret = 0;
    uint8_t Index = 0;
    uint8_t Act = enAct;
    uint8_t Buf[DE_MSG_MAX_LEN] = { 0 };

    memcpy(Buf + Index, &Act, sizeof(Act));
    Index += sizeof(Act);
    memcpy(Buf + Index, &RamAddr, sizeof(RamAddr));
    Buf[Index] = (RamAddr >> 8) & 0xFF;
    Index += 1;
    Buf[Index] = RamAddr & 0xFF;
    Index += 1;
    memcpy(Buf + Index, pBuf, BufLen);
    Index += BufLen;

    Ret = DgusLcdMsgSend(Buf, Index);
    return Ret;
}

//-----------------------------------------------------------------------------------------------------
/**
* @brief  DgusOperReg
* @param  
* @retval 
*/
static uint8_t DgusOperReg(EN_ACT enAct, EN_REG_ADDR enRegAddr, const uint8_t *pBuf, uint8_t BufLen)
{
    if (enAct > EN_ACT_READ_REG)
    {
        return 0;
    }

    uint8_t Ret = 0;
    uint8_t Index = 0;
    uint8_t Act = enAct;
    uint8_t RegAddr = enRegAddr;
    uint8_t Buf[DE_MSG_MAX_LEN] = { 0 };
    memcpy(Buf + Index, &Act, sizeof(Act));
    Index += sizeof(Act);

    memcpy(Buf + Index, &RegAddr, sizeof(RegAddr));
    Index += sizeof(RegAddr);
    memcpy(Buf + Index, pBuf, BufLen);
    Index += BufLen;

    Ret = DgusLcdMsgSend(Buf,Index);
    return Ret;
}


/**
* @brief  控制蜂鸣器发声
* @param  None
* @retval 单位:10ms
*/

void DgusBeepRing(uint8_t TimeLen)
{
    DgusOperReg(EN_ACT_WRITE_REG, EN_REG_ADDR_BZ_TIME, &TimeLen, sizeof(TimeLen));
}

/**
* @brief  控制切换界面
* @param  None
* @retval 单位:10ms
*/

void DgusChangePage(uint16_t PageNum)
{
    uint8_t Buf[2] = { 0 };
    Buf[0] = (PageNum >> 8) & 0xFF;
    Buf[1] = PageNum & 0xFF;

    DgusOperReg(EN_ACT_WRITE_REG, EN_REG_ADDR_PIC_ID, Buf, sizeof(Buf));
}

/**
* @brief  DgusKeyCodeSet
* @param  None
* @retval None
*/
void DgusKeyCodeSet(uint8_t KeyCode)
{
    DgusOperReg(EN_ACT_WRITE_REG, EN_REG_ADDR_KEY_CODE, &KeyCode, sizeof(KeyCode));
}

/**
* @brief
* @param  None
* @retval None
*/
void DgusPowerReset(void)
{
    uint8_t Buf[] = {0x5A,0xA5};
    DgusOperReg(EN_ACT_WRITE_REG, EN_REG_ADDR_RESET_TRIGER, Buf, sizeof(Buf));
}

/**
* @brief
* @param  None
* @retval None
*/
void DgusGetVer(void)
{
    uint8_t Buf = 0x01;
    DgusOperReg(EN_ACT_READ_REG, EN_REG_ADDR_VERSION, &Buf, sizeof(Buf));
}

/**
* @brief  读取当前页面号
* @param  None
* @retval 
*/

void DgusReadPageNum(void)
{
    uint8_t Len = 2;
    DgusOperReg(EN_ACT_READ_REG, EN_REG_ADDR_PIC_ID, &Len, sizeof(Len));
}

/**
* @brief
* @param  None
* @retval None
*/
void DgusOperDataBase(DB_OPER_MODE enMode, uint32_t AddrDB, uint16_t AddrRam, uint16_t Len)
{
    uint8_t Buf[10] = {0};

    Buf[0] = 0x5A;
    Buf[1] = (uint8_t)enMode;

    Buf[2] = (AddrDB >> 24) & 0xFF;
    Buf[3] = (AddrDB >> 16) & 0xFF;
    Buf[4] = (AddrDB >> 8) & 0xFF;
    Buf[5] = (AddrDB >> 0) & 0xFF;

    Buf[6] = ((AddrRam >> 8) & 0xFF);
    Buf[7] = ((AddrRam >> 0) & 0xFF);

    Buf[8] = ((Len >> 8) & 0xFF);
    Buf[9] = ((Len >> 0) & 0xFF);

    DgusOperReg(EN_ACT_WRITE_REG, EN_REG_ADDR_EN_DBL_OP, Buf, sizeof(Buf));
}


小结

1、代码中串口发送函数及CRC校验函数需用户自己实现。
2、如发现错误及可优化的地方请不吝赐教。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
迪文科技K600 是一款智能硬件设备,它主要用于智能家居控制和人工智能助手的使用,下面是它的使用教程: 1.安装与连接:首先,将迪文科技K600 插入电源插座,并确保设备的指示灯亮起。然后,开启手机或电脑的Wi-Fi功能,搜索并连接到设备的Wi-Fi热点,确保设备与移动设备处于同一个无线网络下。 2.配置设备:打开手机或电脑上的迪文科技K600 官方应用程序,按照应用程序中的提示进行设备的配置。通常,您需要创建一个账号,并将设备与此账号绑定。在绑定成功后,您可以根据自己的喜好设置设备的名称、时区等。 3.使用智能助手:迪文科技K600 支持多种智能助手,例如Apple Siri、Amazon Alexa和Google Assistant。根据您所使用的智能助手,您需要在应用程序中进行相应的设置和授权。设置完成后,您可以使用自己的声音指令来控制设备,例如播放音乐、调节亮度、查询天气等。 4.控制智能家居设备:迪文科技K600 能够实现对智能家居设备的控制。首先,在应用程序中添加智能家居设备,比如智能灯泡、智能插座等。然后,您可以通过图形界面或声控的方式控制这些设备的开关、亮度、温度等。 5.多设备控制:通过迪文科技K600,您可以控制多个智能设备,包括手机、电视、音箱等。在设备配置中,将这些设备添加到应用程序中,并进行相应设置。此后,您可以使用迪文科技K600的功能来控制这些设备,实现智能家居的整体控制。 总之,迪文科技K600 是一款功能强大的智能硬件设备,通过简单的设置和操作,您可以享受到智能助手和智能家居设备带来的便利和舒适。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值