固定机柜音乐播放主机系统,已经量产,屏幕用的是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生成工具,把音乐生成了WAE文件,这样烧录的时候,把文件烧录到对应的位置。
节假日是不是挺漂亮?如何做的呢?主要用了3个控件:
1个是增量调节,触摸用
1个用了文本显示:
1个用了,位图显示图标:
总体的就是,当检测到触摸按下,就显示字体,然后再显示按下的图片背景。
好了,咱们暂停说到这里。
|