这次主要结构是, STM32+屏幕+录音板,它们之间通过串口进行连接
效果如下:
界面
代码如下:
迪文屏幕 void main(){ INIT_CPU(); //系统初始化 PORT_Init(); //IO口初始化
T0_Init();//定时器0初始化 T2_Init();//定时器2初始化 my_UART4_Init(115200); uart_init();// 串口初始化
while(1){ Uart_Handle_all(); OneMsHandle();//1Ms一次 TenMsHandle();
Read_0xF00();//数据自动上传 } }
u8 uartHandle(u8 *Tdata,u8 len) { u16 Wlen=0; u16 CRC_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]))) return 0;
//这个为写指令 if(Tdata[0]==0 && Tdata[1]!=0x06) { return 0; } else if(Tdata[0]!=DevAddr) //设备地址 { return 0; }
//这个为写指令 if(Tdata[1]!=0x03 && Tdata[1]!=0x06 && Tdata[1]!=0x10 ) { SendModbusAckErr(Tdata,1); return 0; }
Wlen=(Tdata[4]<<8|Tdata[5]); //长度 BegAddr=(Tdata[2]<<8|Tdata[3]); //开始地址
if(Tdata[1]==0x06) //写内存 { write_dgusii_vp(BegAddr,&Tdata[4],1); } else if(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); } else if(Tdata[1]==0x10) { memcpy(RetData,Tdata,6); CRC_1=CalcCrcAll(0xFFFF,(u8 *)&RetData,6); RetData[6]=CRC_1 ; RetData[7]=CRC_1>>8; SendModbusAckOK(RetData,8); } else if(Tdata[1]==0x06 && Tdata[0]) //当地址码为真,才应答 { memcpy(RetData,Tdata,8); SendModbusAckOK(RetData,8); }
return 1; }
void RecordPlaySliderLogo(void) { static u8 VolC=102; u8 data Readdtata[2]; VolCutDispLog_Para_s UpanPlayLog;
if(NowPage[1]!=21) { VolC=0x102; return; }
Read_Dgusii_Vp(0x17B8,Readdtata,1); if(VolC==Readdtata[1]) return; VolC=Readdtata[1];
UpanPlayLog.LogoLen=459;//长度 UpanPlayLog.CutPage=24;//剪切图形所在页面 UpanPlayLog.CutDispaddr=0x7600;//基本图形地址 UpanPlayLog.Vol=VolC;//0~100音量值 UpanPlayLog.CutbegXY[0]=245;//剪切图形左上角开始地址X UpanPlayLog.CutbegXY[1]=366;//剪切图形左上角开始地址Y UpanPlayLog.CutendXY[0]=UpanPlayLog.CutbegXY[0]+UpanPlayLog.LogoLen;//剪切图形右下角开始地址X UpanPlayLog.CutendXY[1]=366+12;//剪切图形右下角结束地址Y UpanPlayLog.localPageXY[0]=248; UpanPlayLog.localPageXY[1]=379;
VolCutDisp(&UpanPlayLog); }
Stm32如下: void HW_Init(void) { my_mem_init(SRAMIN); //初始化内部内存池
uart1_init(115200); //外置MP3 uart3_init(115200); //屏幕收发 uart5_init(115200); //内置 MP3 uart4_init(115200); //串口4初始化
LED_Init(); //初始化LED Mp3RecCtrIOinit(); }
void LoopHandle_task(void *p_arg) { Init_TotalSet(); Init_Mp3data(); DMT_ChangePage(1);
while(1) { LCD_Handle(); Mp3PlayProcess(); UdiskDisInOut(); vTaskDelay(LoopHandle_ms/portTICK_PERIOD_MS); } }
void DMT_Action1(void) { MainMeanKey(); UpanSDPlayKey(); EnterKeyRET();
RecordRPage(); RecordPlayPage();
AllRetKey(); }
录音板代码: void RECRToReady(void) { u8 BOper=0; u8 SecialNum=0;
if(!ModWriteReg[WR_RECFileReady][1]) return; BOper=ModWriteReg[WR_RECFileReady][1]; SecialNum=ModWriteReg[WR_RECFileReady][0]; ModWriteReg[WR_RECFileReady][1]=0; ModWriteReg[WR_RECFileReady][0]=0; ModReadReg[RD_RECisOk][0]=0;//清除目录准备
MsgUserPara[0]=BOper; MsgUserPara[1]=SecialNum; User_printf("%s\r\n",__FUNCTION__); task_post_msg(NULL, 1, MSG_MUSIC_RECtoReady); }
void RECSongToPoint(void) { u16 BOper=0;
BOper=ModWriteReg[WR_RECFilePoint][0]<<8|ModWriteReg[WR_RECFilePoint][1]; if(!BOper) return; MsgUserPara[0]=ModWriteReg[WR_RECFilePoint][0]; MsgUserPara[1]=ModWriteReg[WR_RECFilePoint][1];
ModWriteReg[WR_RECFilePoint][1]=0; ModWriteReg[WR_RECFilePoint][0]=0; ModReadReg[RD_RECisOk][1]=0;//清除歌曲准备
User_printf("%s\r\n",__FUNCTION__); task_post_msg(NULL, 1, MSG_MUSIC_RECtoBuffNum); }
有兴趣自已下载看看
|