/************************************版权申明******************************************** ** 广州大彩光电科技有限公司 ** http://www.gz-dc.com **-----------------------------------文件信息-------------------------------------------- ** 文件名称: hmi_driver.c ** 修改时间: 2018-05-18 ** 文件说明: 用户MCU串口驱动函数库 ** 技术支持: Tel: 020-82186683 Email: hmi@gz-dc.com Web:www.gz-dc.com -------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------*/ #include "hmi_driver.h" #define TX_8(P1) SEND_DATA((P1)&0xFF) //发送单个字节 #define TX_8N(P,N) SendNU8((uint8 *)P,N) //发送N个字节 #define TX_16(P1) TX_8((P1)>>8);TX_8(P1) //发送16位整数 #define TX_16N(P,N) SendNU16((uint16 *)P,N) //发送N个16位整数 #define TX_32(P1) TX_16((P1)>>16);TX_16((P1)&0xFFFF) //发送32位整数 #if(CRC16_ENABLE) static uint16 _crc16 = 0xffff; /*! * \brief 添加CRC16校验 * \param buffer 待校验的数据 * \param n 数据长度,包含CRC16 * \param pcrc 校验码 */ static void AddCRC16(uint8 *buffer,uint16 n,uint16 *pcrc) { uint16 i,j,carry_flag,a; for (i=0; i>1; if (carry_flag==1) *pcrc=*pcrc^0xa001; } } } /*! * \brief 检查数据是否符合CRC16校验 * \param buffer 待校验的数据,末尾存储CRC16 * \param n 数据长度,包含CRC16 * \return 校验通过返回1,否则返回0 */ uint16 CheckCRC16(uint8 *buffer,uint16 n) { uint16 crc0 = 0x0; uint16 crc1 = 0xffff; if(n>=2) { crc0 = ((buffer[n-2]<<8)|buffer[n-1]); AddCRC16(buffer,n-2,&crc1); } return (crc0==crc1); } /*! * \brief 发送一个字节 * \param c */ void SEND_DATA(uint8 c) { AddCRC16(&c,1,&_crc16); SendChar(c); } /*! * \brief 帧头 */ void BEGIN_CMD() { TX_8(0XEE); _crc16 = 0XFFFF; //开始计算CRC16 } /*! * \brief 帧尾 */ void END_CMD() { uint16 crc16 = _crc16; TX_16(crc16); //发送CRC16 TX_32(0XFFFCFFFF); } #else//NO CRC16 #define SEND_DATA(P) SendChar(P) //发送一个字节 #define BEGIN_CMD() TX_8(0XEE) //帧头 #define END_CMD() TX_32(0XFFFCFFFF) //帧尾 #endif /*! * \brief 延时 * \param n 延时时间(毫秒单位) */ void DelayMS(unsigned int n) { int i,j; for(i = n;i>0;i--) for(j=1000;j>0;j--) ; } /*! * \brief 串口发送送字符串 * \param 字符串 */ void SendStrings(uchar *str) { while(*str) { TX_8(*str); str++; } } /*! * \brief 串口发送送N个字节 * \param 个数 */ void SendNU8(uint8 *pData,uint16 nDataLen) { uint16 i = 0; for (;i=908 /*! * \brief 设置文本为整数值,要求FIRMWARE_VER>=908 * \param screen_id 画面ID * \param control_id 控件ID * \param value 文本数值 * \param sign 0-无符号,1-有符号 * \param fill_zero 数字位数,不足时左侧补零 */ void SetTextInt32(uint16 screen_id,uint16 control_id,uint32 value,uint8 sign,uint8 fill_zero) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x07); TX_16(screen_id); TX_16(control_id); TX_8(sign?0X01:0X00); TX_8((fill_zero&0x0f)|0x80); TX_32(value); END_CMD(); } /*! * \brief 设置文本单精度浮点值,要求FIRMWARE_VER>=908 * \param screen_id 画面ID * \param control_id 控件ID * \param value 文本数值 * \param precision 小数位数 * \param show_zeros 为1时,显示末尾0 */ void SetTextFloat(uint16 screen_id,uint16 control_id,float value,uint8 precision,uint8 show_zeros) { uint8 i = 0; BEGIN_CMD(); TX_8(0xB1); TX_8(0x07); TX_16(screen_id); TX_16(control_id); TX_8(0x02); TX_8((precision&0x0f)|(show_zeros?0x80:0x00)); for (i=0;i<4;++i) { //需要区分大小端 #if(0) TX_8(((uint8 *)&value)[i]); #else TX_8(((uint8 *)&value)[3-i]); #endif } END_CMD(); } void SetTextDouble(uint16 screen_id,uint16 control_id,double value,uint8 precision,uint8 show_zeros) { uint8 i = 0; BEGIN_CMD(); TX_8(0xB1); TX_8(0x07); TX_16(screen_id); TX_16(control_id); TX_8(0x03); TX_8((precision&0x0f)|(show_zeros?0x80:0x00)); for (i=0;i<8;++i) { //需要区分大小端 #if(0) TX_8(((uint8 *)&value)[i]); #else TX_8(((uint8 *)&value)[7-i]); #endif } END_CMD(); } #endif /*! * \brief 设置进度值 * \param screen_id 画面ID * \param control_id 控件ID * \param value 数值 */ void SetProgressValue(uint16 screen_id,uint16 control_id,uint32 value) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x10); TX_16(screen_id); TX_16(control_id); TX_32(value); END_CMD(); } /*! * \brief 设置仪表值 * \param screen_id 画面ID * \param control_id 控件ID * \param value 数值 */ void SetMeterValue(uint16 screen_id,uint16 control_id,uint32 value) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x10); TX_16(screen_id); TX_16(control_id); TX_32(value); END_CMD(); } /*! * \brief 设置仪表值 * \param screen_id 画面ID * \param control_id 图片控件ID * \param value 数值 */ void Set_picMeterValue(uint16 screen_id,uint16 control_id,uint16 value) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x10); TX_16(screen_id); TX_16(control_id); TX_16(value); END_CMD(); } /*! * \brief 设置滑动条 * \param screen_id 画面ID * \param control_id 控件ID * \param value 数值 */ void SetSliderValue(uint16 screen_id,uint16 control_id,uint32 value) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x10); TX_16(screen_id); TX_16(control_id); TX_32(value); END_CMD(); } /*! * \brief 设置选择控件 * \param screen_id 画面ID * \param control_id 控件ID * \param item 当前选项 */ void SetSelectorValue(uint16 screen_id,uint16 control_id,uint8 item) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x10); TX_16(screen_id); TX_16(control_id); TX_8(item); END_CMD(); } /*! * \brief 获取控件值 * \param screen_id 画面ID * \param control_id 控件ID */ void GetControlValue(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x11); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 开始播放动画 * \param screen_id 画面ID * \param control_id 控件ID */ void AnimationStart(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x20); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 停止播放动画 * \param screen_id 画面ID * \param control_id 控件ID */ void AnimationStop(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x21); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 暂停播放动画 * \param screen_id 画面ID * \param control_id 控件ID */ void AnimationPause(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x22); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 播放制定帧 * \param screen_id 画面ID * \param control_id 控件ID * \param frame_id 帧ID */ void AnimationPlayFrame(uint16 screen_id,uint16 control_id,uint8 frame_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x23); TX_16(screen_id); TX_16(control_id); TX_8(frame_id); END_CMD(); } /*! * \brief 播放上一帧 * \param screen_id 画面ID * \param control_id 控件ID */ void AnimationPlayPrev(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x24); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 播放下一帧 * \param screen_id 画面ID * \param control_id 控件ID */ void AnimationPlayNext(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x25); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 曲线控件-添加通道 * \param screen_id 画面ID * \param control_id 控件ID * \param channel 通道号 * \param color 颜色 */ void GraphChannelAdd(uint16 screen_id,uint16 control_id,uint8 channel,uint16 color) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x30); TX_16(screen_id); TX_16(control_id); TX_8(channel); TX_16(color); END_CMD(); } /*! * \brief 曲线控件-删除通道 * \param screen_id 画面ID * \param control_id 控件ID * \param channel 通道号 */ void GraphChannelDel(uint16 screen_id,uint16 control_id,uint8 channel) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x31); TX_16(screen_id); TX_16(control_id); TX_8(channel); END_CMD(); } /*! * \brief 曲线控件-添加数据 * \param screen_id 画面ID * \param control_id 控件ID * \param channel 通道号 * \param pData 曲线数据 * \param nDataLen 数据个数 */ void GraphChannelDataAdd(uint16 screen_id,uint16 control_id,uint8 channel,uint16 *pData,uint16 nDataLen) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x32); TX_16(screen_id); TX_16(control_id); TX_8(channel); TX_16(nDataLen * 2); TX_16N(pData,nDataLen); END_CMD(); } /*! * \brief 曲线控件-清除数据 * \param screen_id 画面ID * \param control_id 控件ID * \param channel 通道号 */ void GraphChannelDataClear(uint16 screen_id,uint16 control_id,uint8 channel) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x33); TX_16(screen_id); TX_16(control_id); TX_8(channel); END_CMD(); } /*! * \brief 曲线控件-设置视图窗口 * \param screen_id 画面ID * \param control_id 控件ID * \param x_offset 水平偏移 * \param x_mul 水平缩放系数 * \param y_offset 垂直偏移 * \param y_mul 垂直缩放系数 */ void GraphSetViewport(uint16 screen_id,uint16 control_id,int16 x_offset,uint16 x_mul,int16 y_offset,uint16 y_mul) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x34); TX_16(screen_id); TX_16(control_id); TX_16(x_offset); TX_16(x_mul); TX_16(y_offset); TX_16(y_mul); END_CMD(); } /*! * \brief 开始批量更新 * \param screen_id 画面ID */ void BatchBegin(uint16 screen_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x12); TX_16(screen_id); } /*! * \brief 批量更新按钮控件 * \param control_id 控件ID * \param value 数值 */ void BatchSetButtonValue(uint16 control_id,uint8 state) { TX_16(control_id); TX_16(1); TX_8(state); } /*! * \brief 批量更新进度条控件 * \param control_id 控件ID * \param value 数值 */ void BatchSetProgressValue(uint16 control_id,uint32 value) { TX_16(control_id); TX_16(4); TX_32(value); } /*! * \brief 批量更新滑动条控件 * \param control_id 控件ID * \param value 数值 */ void BatchSetSliderValue(uint16 control_id,uint32 value) { TX_16(control_id); TX_16(4); TX_32(value); } /*! * \brief 批量更新仪表控件 * \param control_id 控件ID * \param value 数值 */ void BatchSetMeterValue(uint16 control_id,uint32 value) { TX_16(control_id); TX_16(4); TX_32(value); } /*! * \brief 计算字符串长度 */ uint32 GetStringLen(uchar *str) { uchar *p = str; while(*str) { str++; } return (str-p); } /*! * \brief 批量更新文本控件 * \param control_id 控件ID * \param strings 字符串 */ void BatchSetText(uint16 control_id,uchar *strings) { TX_16(control_id); TX_16(GetStringLen(strings)); SendStrings(strings); } /*! * \brief 批量更新动画\图标控件 * \param control_id 控件ID * \param frame_id 帧ID */ void BatchSetFrame(uint16 control_id,uint16 frame_id) { TX_16(control_id); TX_16(2); TX_16(frame_id); } #if FIRMWARE_VER>=908 /*! * \brief 批量设置控件可见 * \param control_id 控件ID * \param visible 帧ID */ void BatchSetVisible(uint16 control_id,uint8 visible) { TX_16(control_id); TX_8(1); TX_8(visible); } /*! * \brief 批量设置控件使能 * \param control_id 控件ID * \param enable 帧ID */ void BatchSetEnable(uint16 control_id,uint8 enable) { TX_16(control_id); TX_8(2); TX_8(enable); } #endif /*! * \brief 结束批量更新 */ void BatchEnd() { END_CMD(); } /*! * \brief 设置倒计时控件 * \param screen_id 画面ID * \param control_id 控件ID * \param timeout 倒计时(秒) */ void SeTimer(uint16 screen_id,uint16 control_id,uint32 timeout) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x40); TX_16(screen_id); TX_16(control_id); TX_32(timeout); END_CMD(); } /*! * \brief 开启倒计时控件 * \param screen_id 画面ID * \param control_id 控件ID */ void StartTimer(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x41); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 停止倒计时控件 * \param screen_id 画面ID * \param control_id 控件ID */ void StopTimer(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x42); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 暂停倒计时控件 * \param screen_id 画面ID * \param control_id 控件ID */ void PauseTimer(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x44); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 设置控件背景色 * \details 支持控件:进度条、文本 * \param screen_id 画面ID * \param control_id 控件ID * \param color 背景色 */ void SetControlBackColor(uint16 screen_id,uint16 control_id,uint16 color) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x18); TX_16(screen_id); TX_16(control_id); TX_16(color); END_CMD(); } /*! * \brief 设置控件前景色 * \details 支持控件:进度条 * \param screen_id 画面ID * \param control_id 控件ID * \param color 前景色 */ void SetControlForeColor(uint16 screen_id,uint16 control_id,uint16 color) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x19); TX_16(screen_id); TX_16(control_id); TX_16(color); END_CMD(); } /*! * \brief 显示\隐藏弹出菜单控件 * \param screen_id 画面ID * \param control_id 控件ID * \param show 是否显示,为0时focus_control_id无效 * \param focus_control_id 关联的文本控件(菜单控件的内容输出到文本控件) */ void ShowPopupMenu(uint16 screen_id,uint16 control_id,uint8 show,uint16 focus_control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x13); TX_16(screen_id); TX_16(control_id); TX_8(show); TX_16(focus_control_id); END_CMD(); } /*! * \brief 显示\隐藏系统键盘 * \param show 0隐藏,1显示 * \param x 键盘显示位置X坐标 * \param y 键盘显示位置Y坐标 * \param type 0小键盘,1全键盘 * \param option 0正常字符,1密码,2时间设置 * \param max_len 键盘录入字符长度限制 */ void ShowKeyboard(uint8 show,uint16 x,uint16 y,uint8 type,uint8 option,uint8 max_len) { BEGIN_CMD(); TX_8(0x86); TX_8(show); TX_16(x); TX_16(y); TX_8(type); TX_8(option); TX_8(max_len); END_CMD(); } #if FIRMWARE_VER>=921 /*! * \brief 多语言设置 * \param ui_lang 用户界面语言0~9 * \param sys_lang 系统键盘语言-0中文,1英文 */ void SetLanguage(uint8 ui_lang,uint8 sys_lang) { uint8 lang = ui_lang; if(sys_lang) lang |= 0x80; BEGIN_CMD(); TX_8(0xC1); TX_8(lang); TX_8(0xC1+lang);//校验,防止意外修改语言 END_CMD(); } #endif #if FIRMWARE_VER>=921 /*! * \brief 开始保存控件数值到FLASH * \param version 数据版本号,可任意指定,高16位为主版本号,低16位为次版本号 * \param address 数据在用户存储区的存放地址,注意防止地址重叠、冲突 */ void FlashBeginSaveControl(uint32 version,uint32 address) { BEGIN_CMD(); TX_8(0xB1); TX_8(0xAA); TX_32(version); TX_32(address); } /*! * \brief 保存某个控件的数值到FLASH * \param screen_id 画面ID * \param control_id 控件ID */ void FlashSaveControl(uint16 screen_id,uint16 control_id) { TX_16(screen_id); TX_16(control_id); } /*! * \brief 保存某个控件的数值到FLASH * \param screen_id 画面ID * \param control_id 控件ID */ void FlashEndSaveControl() { END_CMD(); } /*! * \brief 从FLASH中恢复控件数据 * \param version 数据版本号,主版本号必须与存储时一致,否则会加载失败 * \param address 数据在用户存储区的存放地址 */ void FlashRestoreControl(uint32 version,uint32 address) { BEGIN_CMD(); TX_8(0xB1); TX_8(0xAB); TX_32(version); TX_32(address); END_CMD(); } #endif #if FIRMWARE_VER>=921 /*! * \brief 设置历史曲线采样数据值(单字节,uint8或int8) * \param screen_id 画面ID * \param control_id 控件ID * \param value 采样点数据 * \param channel 通道数 */ void HistoryGraph_SetValueInt8(uint16 screen_id,uint16 control_id,uint8 *value,uint8 channel) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x60); TX_16(screen_id); TX_16(control_id); TX_8N(value,channel); END_CMD(); } /*! * \brief 设置历史曲线采样数据值(双字节,uint16或int16) * \param screen_id 画面ID * \param control_id 控件ID * \param value 采样点数据 * \param channel 通道数 */ void HistoryGraph_SetValueInt16(uint16 screen_id,uint16 control_id,uint16 *value,uint8 channel) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x60); TX_16(screen_id); TX_16(control_id); TX_16N(value,channel); END_CMD(); } /*! * \brief 设置历史曲线采样数据值(四字节,uint32或int32) * \param screen_id 画面ID * \param control_id 控件ID * \param value 采样点数据 * \param channel 通道数 */ void HistoryGraph_SetValueInt32(uint16 screen_id,uint16 control_id,uint32 *value,uint8 channel) { uint8 i = 0; BEGIN_CMD(); TX_8(0xB1); TX_8(0x60); TX_16(screen_id); TX_16(control_id); for (;i100%时水平方向缩小,反正放大) * \param max_zoom 缩放限制,一屏最多显示采样点数 * \param min_zoom 缩放限制,一屏最少显示采样点数 */ void HistoryGraph_SetTimeZoom(uint16 screen_id,uint16 control_id,uint16 zoom,uint16 max_zoom,uint16 min_zoom) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x63); TX_16(screen_id); TX_16(control_id); TX_8(0x02); TX_16(zoom); TX_16(max_zoom); TX_16(min_zoom); END_CMD(); } #endif #if SD_FILE_EN /*! * \brief 检测SD卡是否插入 */ void SD_IsInsert(void) { BEGIN_CMD(); TX_8(0x36); TX_8(0x01); END_CMD(); } /*! * \brief 打开或创建文件 * \param filename 文件名称(仅ASCII编码) * \param mode 模式,可选组合模式如上FA_XXXX */ void SD_CreateFile(uint8 *filename,uint8 mode) { BEGIN_CMD(); TX_8(0x36); TX_8(0x05); TX_8(mode); SendStrings(filename); END_CMD(); } /*! * \brief 以当前时间创建文件,例如:20161015083000.txt * \param ext 文件后缀,例如 txt */ void SD_CreateFileByTime(uint8 *ext) { BEGIN_CMD(); TX_8(0x36); TX_8(0x02); SendStrings(ext); END_CMD(); } /*! * \brief 在当前文件末尾写入数据 * \param buffer 数据 * \param dlc 数据长度 */ void SD_WriteFile(uint8 *buffer,uint16 dlc) { BEGIN_CMD(); TX_8(0x36); TX_8(0x03); TX_16(dlc); TX_8N(buffer,dlc); END_CMD(); } /*! * \brief 读取当前文件 * \param offset 文件位置偏移 * \param dlc 数据长度 */ void SD_ReadFile(uint32 offset,uint16 dlc) { BEGIN_CMD(); TX_8(0x36); TX_8(0x07); TX_32(offset); TX_16(dlc); END_CMD(); } /*! * \brief 获取当前文件长度 */ void SD_GetFileSize() { BEGIN_CMD(); TX_8(0x36); TX_8(0x06); END_CMD(); } /*! * \brief 关闭当前文件 */ void SD_CloseFile() { BEGIN_CMD(); TX_8(0x36); TX_8(0x04); END_CMD(); } #endif//SD_FILE_EN /*! * \brief 记录控件-触发警告 * \param screen_id 画面ID * \param control_id 控件ID * \param value 告警值 * \param time 告警产生的时间,为0时使用屏幕内部时间 */ void Record_SetEvent(uint16 screen_id,uint16 control_id,uint16 value,uint8 *time) { uint8 i = 0; BEGIN_CMD(); TX_8(0xB1); TX_8(0x50); TX_16(screen_id); TX_16(control_id); TX_16(value); if(time) { for(i=0;i<7;++i) TX_8(time[i]); } END_CMD(); } /*! * \brief 记录控件-解除警告 * \param screen_id 画面ID * \param control_id 控件ID * \param value 告警值 * \param time 告警解除的时间,为0时使用屏幕内部时间 */ void Record_ResetEvent(uint16 screen_id,uint16 control_id,uint16 value,uint8 *time) { uint8 i = 0; BEGIN_CMD(); TX_8(0xB1); TX_8(0x51); TX_16(screen_id); TX_16(control_id); TX_16(value); if(time) { for(i=0;i<7;++i) TX_8(time[i]); } END_CMD(); } /*! * \brief 记录控件- 添加常规记录 * \param screen_id 画面ID * \param control_id 控件ID * \param record 一条记录(字符串),子项通过分号隔开,例如:第一项;第二项;第三项; */ void Record_Add(uint16 screen_id,uint16 control_id,uint8 *record) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x52); TX_16(screen_id); TX_16(control_id); SendStrings(record); END_CMD(); } /*! * \brief 记录控件-清除记录数据 * \param screen_id 画面ID * \param control_id 控件ID */ void Record_Clear(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x53); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 记录控件-设置记录显示偏移 * \param screen_id 画面ID * \param control_id 控件ID * \param offset 显示偏移,滚动条位置 */ void Record_SetOffset(uint16 screen_id,uint16 control_id,uint16 offset) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x54); TX_16(screen_id); TX_16(control_id); TX_16(offset); END_CMD(); } /*! * \brief 记录控件-获取当前记录数目 * \param screen_id 画面ID * \param control_id 控件ID */ void Record_GetCount(uint16 screen_id,uint16 control_id) { BEGIN_CMD(); TX_8(0xB1); TX_8(0x55); TX_16(screen_id); TX_16(control_id); END_CMD(); } /*! * \brief 读取屏幕RTC时间 */ void ReadRTC(void) { BEGIN_CMD(); TX_8(0x82); END_CMD(); } /*! * \brief 播放音乐 * \param buffer 十六进制的音乐路径及名字 */ void PlayMusic(uint8 *buffer) { uint8 i = 0; BEGIN_CMD(); if(buffer) { for(i=0;i<19;++i) TX_8(buffer[i]); } END_CMD(); }