固定机柜音乐播放主机系统 已经量产 屏幕用的是DMG12480C068_03WTC
视频查看使用效果地址:
首重介绍,这个也是用modbus 作为主要通信工具 这个项目,大家值得一看,里面运用了许多的知识点,这里我挑几个讲讲 大致为屏幕为从机,单片机为主控。
一:modbus和T5L 的用户程序编写 之前我也讲过,T5L的之前我也给过源码,这次我们就简单的说下T5L的用户从机modbus源码。 用keil 点开,我的源码。 int main(void) { INIT_CPU(); T2_Init(); UART4_Init(); EA=1; // UART4_SendStr("hello",sizeof("hello")); WDT_ON();//打开开门狗 while(1) { WDT_RST();//喂狗 Process(); } } INIT_CPU(); 这个我们先不用管 主要看的是UART4_Init(); void UART4_Init(void) { //UART4 波特率设置: //BODE2_DIV_H:L=CPU 主频/(8*波特率) 。 //206438400/8/115200=224=0xe0 //206438400/8/921600=28=0x1C //206438400/8=25804800/230400=112=0x70 SCON2T=0x80; SCON2R=0x80; BODE2_DIV_H=0x00; //FCLK/(8*DIV) BODE2_DIV_L=0x1C;//; 921600 波特率 // BODE2_DIV_H=0x00; //FCLK/(8*DIV) // BODE2_DIV_L=0x70; //ES3T=1; ES2R=1; EA=1; } 设置波特率,这里我们设置为921600
其它115200 ,这里我计算好了,大家直接填入BODE2_DIV_L,这个寄存器即可,如果说想懂得如何计算,可以查看迪文 T5L ASIC应用开发指南.pdf, 这里也上传一个文档,给大家参考学习
就是文档这里写着 主要是查看,Process函数 void Process(void) { SpecialAddrValAutoUp(); OneMsHandle(); TenMsHandle(); } void OneMsHandle(void) { if(!OnemsFlag) return; OnemsFlag=0; MainMachineHandle(); } void MainMachineHandle(void) { if(UartDataHandle) { uartHandle(Uart4_Rx,uart4_rx_count); CLR_UartMp3(); } } 下面是主要的从机modbus 逻辑 bool uartHandle(u8 *Tdata,u8 len) { u16Wlen=0; u16CRC_1=0,BegAddr=0; u8 xdata RetData[Uart4_Rx_Maxlen+10]; u8 errnum=0; CRC_1=CalcCrcAll(0xffff,Tdata,len-2); if(CRC_1!= ((Tdata[len-1])<<8 | (Tdata[len-2]))) returnfalse; //这个为写指令 if(Tdata[0]==0&& Tdata[1]!=0x06) { returnfalse; } elseif(Tdata[0]!=DevAddr) //设备地址 { returnfalse; } //这个为写指令 if(Tdata[1]!=0x03&& Tdata[1]!=0x06 && Tdata[1]!=0x10 ) { SendModbusAckErr(Tdata,1); returnfalse; } Wlen=(Tdata[4]<<8|Tdata[5]); //长度 BegAddr=(Tdata[2]<<8|Tdata[3]); //开始地址 if(Tdata[1]==0x06)//写内存 { write_dgusii_vp(BegAddr,&Tdata[4],1); } elseif(Tdata[1]==0x10) { write_dgusii_vp(BegAddr,&Tdata[7],Wlen); } //读操作响应 //[01][0x03][00][6B][00][02][CRC高][CRC低] if(Tdata[1]==0x03) { RetData[0]=Tdata[0]; RetData[1]=0x03; RetData[2]=Wlen*2; read_dgusii_vp(BegAddr,&RetData[3],Wlen); CRC_1=CalcCrcAll(0xFFFF,RetData,3+Wlen*2); RetData[Wlen*2+3]=CRC_1; RetData[Wlen*2+3+1]=CRC_1>>8; SendModbusAckOK(RetData,3+Wlen*2+2); } elseif(Tdata[1]==0x10) { memcpy(RetData,Tdata,6); CRC_1=CalcCrcAll(0xFFFF,(INT8U*)&RetData,6); RetData[6]=CRC_1; RetData[7]=CRC_1>>8; SendModbusAckOK(RetData,8); } elseif(Tdata[1]==0x06 && Tdata[0]) //当地址码为真,才应答 { memcpy(RetData,Tdata,8); SendModbusAckOK(RetData,8); } returntrue; }
二:时间的艺术字显示 大家先看图片,下面是时间显示,是不是很漂亮 这里用的是艺术字控件
每一个时间变量用图片扣出来,放图标上面,如下 最后生成一个96的图标 当时间改变,就该变这个艺术字的变量,即可
三 任意界面,任意触摸控件弹出菜单 这个是个小知识点,估计很多人不知道,可以弹出任意小窗口,和迪文的标准弹出小窗口不同的后门
在界面上,有2个小小的隐藏的触摸按键,一般人是按不到的,如下
没错就是它,几乎每个 页面都 有,主要是给程序用的,当有需要某个时间点,弹出窗口,程序上就会用模拟按压,点这里,然后就会出现你设定的弹窗
关于模拟按压,就要看文档T5L_DGUS2应用指南_V63.pdf 就是这个变量,往这个变量上加,模拟触摸,就会弹出菜单
四 关于点击按键,出现的音效 主要是利用了,这个屏幕后面有个喇叭,可以播放一定的小文件的,音乐 这里设置语音的ID是1
指向的是 这个按键音乐,而这个按键音乐,如何包含进去呢?
利用了
这里的WAE生成工具,把音乐生成了, 这个文件,这样烧录的时候,把文件烧录到对应的位置 五 显示节假日
先看图片
节假日是不是挺漂亮的,如何做的呢,主要用了3个控件 1个是增量调节,触摸用
1个用了文本显示
放假,字体
1个用了,位图显示图标
总体的就是,当检测到触摸按下,就显示字体,然后再显示按下的图片背景
好了,咱们暂停说到这里。
|