串口屏界面设计
提示:串口屏的使用
利用VSCode C#生成需要的背景图片。
上位机软件 USART HMI 控件进行设置。
背景图如下:
控件设置如下:
功能实现
- 加载界面
进度条增加,1S后跳到主界面
if(j0.val<=80)
j0.val+=8
else if(j0.val<100)
j0.val+=1
if(j0.val==100)
page main
- 其他界面 用按键板通过串口实现
按键长按与短按定义不同功能
void BTN_ParaSelectPressed(void)
{
static uint8_t oldState=BTN_RELEASE;
static uint16_t count=0;
static uint8_t longPress = 0,changpage = 0;
//仅调试模式 可以更改参数
if(para.workModeState != 3)
{
return;
}
if((btn_state[2] == BTN_PRESSED) && (oldState == BTN_PRESSED))
{
if(!longPress)
{
count ++;
if(count > 20)
{
longPress = 1;
}
}
else //进入了长按状态下
{
if(!changpage)
{
count ++;
if(count >= 3) //发起一次页面切换
{
count = 0;
changpage = 1;
//更新UI界面
UI_PageSwitch(10);
}
}
}
}
//参数选择按键短按 参数被选中时字体变为红色 一共有三种参数选择
else if((btn_state[2] == BTN_RELEASE) && (oldState == BTN_PRESSED))
{
count = 0;
if(longPress > 0)
{
oldState = btn_state[2];
return;
}
para.paraNum ++;
para.paraNum %= 4;
UI_selectParameter(para.paraNum); //改变选中颜色
//参数选择回到初始值 就将设置的参数进行保存
if(para.paraNum == 0)
{
Changeparameter_Sign = 1 ;
}
}
else //清除按键标志
{
count = 0;
if(1 == longPress)
{
changpage = 0;
longPress = 0;
}
}
oldState = btn_state[2];
}
页面切换
void UI_PageSwitch(uint8_t num)
{
switch(num){
case 0:
sendBuf("page main",9);
UI_commandEND();
break;
case 1:
sendBuf("page input",10);
UI_commandEND();
break;
case 2:
sendBuf("page version",12);
UI_commandEND();
break;
case 10:
sendBuf("page menu",9);
UI_commandEND();
break;
}
}
通信流程
串口屏与按键板通信
按键板,通过按键改变键值状态,调用回调函数扫描按键状态。再通过串口2向屏幕发送数据。
改变颜色
if(running)
sendBuf("t4.pco=1055",11);
else
sendBuf("t4.pco=63488",12);
改变图片
len = sprintf(buffer,"p2.pic=%d",para.EXI_1+2);
sendBuf(buffer,len);
UI_commandEND();
改变数据
if(para.paraoffset % 100 >= 10)
{
len = sprintf(buf,"t2.txt=\"%d.%dmm\"",para.paraoffset/100,para.paraoffset%100);
}
else
{
len = sprintf(buf,"t2.txt=\"%d.0%dmm\"",para.paraoffset/100,para.paraoffset%100);
}
按键板与主板通信
按键板更新的参数和动作通过USART1发送给主板,主板解包后将数据保存。同样上电后,主板将保存的数据发到按键板上进行显示。
参数更新
void Updata_Parameter()
{
uint8_t i;
unsigned char check_code ;
if(Changeparameter_Sign == 0)
return ;
Changeparameter_Sign = 0;
//若板子被3.3V供电未重启 按键板重启 报文不发送 直接返回
ModBusRegister[0] = 0x0A;
ModBusRegister[1] = 0x0A;
ModBusRegister[2] = para.running ;
ModBusRegister[3] = para.workModeState ;
ModBusRegister[4] = para.paraspeed ;
ModBusRegister[5] = para.paralimit ;
ModBusRegister[6] = (para.paraoffset & 0xff00) >> 8;
ModBusRegister[7] = para.paraoffset & 0x00ff;
for(i=0;i<8;i++)
{
check_code += ModBusRegister[i];
}
ModBusRegister[8] = check_code;
ModBusRegister[9] = 0x0D;
sendBuf(ModBusRegister,10);
}
动作执行
void Updata_act()
{
uint8_t i = 0;
uint8_t check_code = 0;
if(Changeact_Sign == 0)
return ;
Changeact_Sign = 0;
buf[0] = 0x0E;
buf[1] = 0x06;
buf[2] = para.SL; //送料动作
buf[3] = 0x11;//备用
for(i=0;i<4;i++)
{
check_code += buf[i];
}
buf[4] = check_code;
buf[5] = 0x0D;
sendBuf(buf,6);
//发送完清掉
para.SL = 0;
}
小结
其他细节可以参考这个:https://blog.csdn.net/qq_46336588/article/details/119424722