- 2025-02-06
-
发表了主题帖:
【泰坦触觉 TITAN Core开发套件】触觉感知控制器的实现
对于听障人群来说,在特定的环境下,听力的缺失是致命。为了弥补和降低这方面的损失,触觉感知控制器的作用是不可或缺的。
该触觉感知控制器要解决的问题是,通过相应的传感器感知周围的危险并其以触觉感知的方式传递给他们。
此外,是将健听人群所感知的情况,通过按键的触发以固定的触觉方式通知给他们。
归结到硬件设计上就是以ETEB-6001DPX-V1开发板为控制中心,通过4个A/D检测通道来采集火焰、易燃气体、热释及土壤湿度传感器的输出信号,并以触发触觉马达输出报警提示。另外就是指定4个有特定等级含义的触摸键,通过人为的触发使触觉马达发出提示信号,以及时呼唤他们尽快搜寻周围环境的变化或了解触摸信号的含义。
另外,为指示相应的通知信号已发出,还配置了对应的TFT显示屏,并红色的方框来标识出是何种情况下触发的触觉提示。
为显示汉字,所配备的显示函数为:
汉字显示函数:
void showhanzi16h(unsigned int x,unsigned int y,unsigned char index,unsigned char s)
{
unsigned char i,j,k;
const unsigned char *temp=hanzi16;
temp+=index*32;
for(j=0;j<16;j++)
{
for(k=0;k<2;k++)
{
for(i=0;i<8;i++)
{
if((*temp&(1<<i))!=0)
{
POINT_COLOR=WHITE;
}
else
{
POINT_COLOR=RED;
}
LCD_DrawPoint(x+j,y-k*8-i);
}
temp++;
}
}
}
实现图标显示的函数为:
void show_tbh(unsigned int x,unsigned int y,unsigned int n)
{
unsigned int i,j,k;
unsigned int da;
k=0;
for(i=0;i<50;i++)
{
for(j=0;j<50;j++)
{
if(n==0) da=gImage_t1[k*2];
if(n==1) da=gImage_t2[k*2];
if(n==2) da=gImage_t3[k*2];
if(n==3) da=gImage_t4[k*2];
if(n==4) da=gImage_t5[k*2];
if(n==5) da=gImage_t6[k*2];
if(n==6) da=gImage_t7[k*2];
if(n==7) da=gImage_t8[k*2];
da<<=8;
if(n==0) da|=gImage_t1[k*2+1];
if(n==1) da|=gImage_t2[k*2+1];
if(n==2) da|=gImage_t3[k*2+1];
if(n==3) da|=gImage_t4[k*2+1];
if(n==4) da|=gImage_t5[k*2+1];
if(n==5) da|=gImage_t6[k*2+1];
if(n==6) da|=gImage_t7[k*2+1];
if(n==7) da|=gImage_t8[k*2+1];
POINT_COLOR=da;
LCD_DrawPoint(x+i,y+j);
k++;
}
}
}
实现界面显示效果的函数为:
void jm(void)
{
LCD_Clear(RED);
show_tbh(45,20,7);
show_tbh(45,97,0);
show_tbh(45,174,5);
show_tbh(45,250,6);
show_tbh(145,20,1);
show_tbh(145,97,2);
show_tbh(145,174,4);
show_tbh(145,250,3);
POINT_COLOR=YELLOW;
LCD_DrawLine(32, 0, 32, 319);
BACK_COLOR=RED;
POINT_COLOR=WHITE;
LCD_ShowStringh(10,80," 8:30:00");
showhanzi16h(10,240,0,0);
showhanzi16h(10,220,1,0);
showhanzi16h(10,200,2,0);
showhanzi16h(10,180,3,0);
showhanzi16h(10,160,4,0);
showhanzi16h(10,140,5,0);
showhanzi16h(10,120,6,0);
showhanzi16h(110,295,7,0);
showhanzi16h(110,275,8,0);
showhanzi16h(110,220,9,0);
showhanzi16h(110,200,10,0);
showhanzi16h(110,142,11,0);
showhanzi16h(110,122,12,0);
showhanzi16h(110,67,13,0);
showhanzi16h(110,47,14,0);
showhanzi16h(210,295,15,0);
showhanzi16h(210,275,16,0);
showhanzi16h(210,220,17,0);
showhanzi16h(210,200,18,0);
showhanzi16h(210,142,19,0);
showhanzi16h(210,122,17,0);
showhanzi16h(210,67,20,0);
showhanzi16h(210,47,19,0);
}
图1 图标显示效果
为按键所用引脚的配置函数为:
static void KEY_Init(void)
{
IOC_Init_TypeDef init;
IOC_ConfigStructInit(&init);
init.mode = IOC_AF_MODE_0;
init.dir = GPIO_DIR_IN_OUT;
init.pull = IOC_PULL_NONE;
IOC_Config(IOC_PIN_GPIO_PLL_REF, &init);
GPIO_PortOutputDisable(GPIO0, GPIO_PIN_11);
GPIO_PortOutputDisable(GPIO0, GPIO_PIN_12);
GPIO_PortOutputDisable(GPIO0, GPIO_PIN_13);
GPIO_PortOutputDisable(GPIO0, GPIO_PIN_15);
}
图2 连接触摸式按键
进行功能测试的主程序为:
int main(void)
{
EVB_LEDInit();
tft_Init();
LCD_Clear(RED);
LCD_Clear(RED);
show_tbh(45,20,7);
show_tbh(45,97,0);
show_tbh(45,174,5);
show_tbh(45,250,6);
show_tbh(145,20,1);
show_tbh(145,97,2);
show_tbh(145,174,4);
show_tbh(145,250,3);
POINT_COLOR=YELLOW;
LCD_DrawLine(32, 0, 32, 319);
BACK_COLOR=RED;
POINT_COLOR=WHITE;
LCD_ShowStringh(10,80," 8:30:00");
showhanzi16h(10,240,0,0);
showhanzi16h(10,220,1,0);
showhanzi16h(10,200,2,0);
showhanzi16h(10,180,3,0);
showhanzi16h(10,160,4,0);
showhanzi16h(10,140,5,0);
showhanzi16h(10,120,6,0);
showhanzi16h(110,295,7,0);
showhanzi16h(110,275,8,0);
showhanzi16h(110,220,9,0);
showhanzi16h(110,200,10,0);
showhanzi16h(110,142,11,0);
showhanzi16h(110,122,12,0);
showhanzi16h(110,67,13,0);
showhanzi16h(110,47,14,0);
showhanzi16h(210,295,15,0);
showhanzi16h(210,275,16,0);
showhanzi16h(210,220,17,0);
showhanzi16h(210,200,18,0);
showhanzi16h(210,142,19,0);
showhanzi16h(210,122,17,0);
showhanzi16h(210,67,20,0);
showhanzi16h(210,47,19,0);
SW_Init();
GPIO_WritePin(GPIO2, GPIO_PIN_00, RESET);
while (1)
{
if(GPIO_ReadPin(GPIO0, GPIO_PIN_12)==SET)
{
showhanzi16h(210,295,15,1);
showhanzi16h(210,275,16,1);
GPIO_WritePin(GPIO2, GPIO_PIN_00, RESET);
}
else
{
showhanzi16h(210,295,15,0);
showhanzi16h(210,275,16,0);
GPIO_WritePin(GPIO2, GPIO_PIN_00,SET);
}
if(GPIO_ReadPin(GPIO0, GPIO_PIN_11)==SET)
{
showhanzi16h(210,220,17,1);
showhanzi16h(210,200,18,1);
}
else
{
showhanzi16h(210,220,17,0);
showhanzi16h(210,200,18,0);
}
if(GPIO_ReadPin(GPIO0, GPIO_PIN_15)==SET)
{
showhanzi16h(210,142,19,1);
showhanzi16h(210,122,17,1);
}
else
{
showhanzi16h(210,142,19,0);
showhanzi16h(210,122,17,0);
}
if(GPIO_ReadPin(GPIO0, GPIO_PIN_13)==SET)
{
showhanzi16h(210,67,20,1);
showhanzi16h(210,47,19,1);
}
else
{
showhanzi16h(210,67,20,0);
showhanzi16h(210,47,19,0);
}
delay_1us(20);
}
}
经程序的编译和运行,其测试效果如图3所示,说明程序符合预期效果。
图3 危险提示状态
-
发表了主题帖:
【复旦微车规MCU FM32FT0A测评】仪表数据读取(1)
在常规的流变分析仪设计中,离不开以下设备和仪表的使用:
1)变频器
通过变频器来控制伺服电机的启停及转速的设置
2)温度控制仪
通过温度控制仪来控制加热棒以使高分子聚合物处于融和状态
3)应变器
各种应变器是用来检测高分子聚合物在相应的温度下,它的温度、压力、扭矩及转速等参数,以配置不同性能的产品。
由于流变仪控制的对象及检测的参数比较多,单凭常规的串行通讯是难以解决问题的,为此在多数情况下是采用基于RS485的多设备协议通讯。
为了简化设计,对温度、压力及扭矩的检测,多是采用相应的应变器来获得4~20mA的电流信号,再通过变换器件将其转化为0~5V的电压信号,进而通过多通道的A/D转换器转化为数字信号以供分析处理和波形绘制。而对于转速信号及部分的扭矩信号,则是通过在定位时间内的脉冲信号捕捉和计数来获得。
这样,RS485协议通讯的主体就只落在变频器和温度控制仪的身上。
变频器及相关指令:
这里选用的变频器型号是S1100,其控制启停指令如下:
使电机启动的指令为:
:01 06 2000 0004 D5 OD 0A
其校验码=D5,即:01H+06H+20H+00H+00H+04H=2BH,2BH取反+1=D5H。
使电机停止的指令为:
:01 06 2000 0002 D7 OD 0A
其校验码=D7,即:01H+06H+20H+00H+00H+02H=29H,29H取反+1=D7H。
温度控制仪及相关指令:
为保证控制温度的质量,这里选用的是岛电公司出产的MR13温度调节器,其读写温度的指令如下:
设置温度
以设置温度为200(0xC8)度为例,其指令为:
@021W04000,00C8:EACRLF
读取温度
以读取地址400H的温度为例,其指令为:
@021R04000:DECR LF
在读取温度时,除了发出读取指令,还要接收和提取数据值。
设接收到返回信息为:@021R00,0064:40 CR LF
则其检测的温度值为:0064H=100度。
后续在介绍指令的发送及其相应的处理,这里先作一下铺垫。
-
回复了主题帖:
【新年花灯】莫负时光砥砺前行
秦天qintian0303 发表于 2025-2-6 08:49
简化才不容易呢
哈哈,主要是参与活动凑个热闹。
-
回复了主题帖:
【新年花灯】莫负时光砥砺前行
秦天qintian0303 发表于 2025-2-5 21:11
第一个有点像跳棋,不过看着效果都不错
主要是为了简化程序有些粗糙
- 2025-02-05
-
回复了主题帖:
【新年花灯】莫负时光砥砺前行
rto 发表于 2025-2-5 17:06
很有创意,花灯也漂亮,电子人的新年过的真好。希望楼主多发点类似主题。
好的,继续努力。
-
回复了主题帖:
【新年花灯】莫负时光砥砺前行
se7ens 发表于 2025-2-5 17:01
很有创意,LED沙漏和LED时钟,都是用51做的吗
沙漏用的芯片是STC2051,旋转时钟用的STC8052。
- 2025-02-04
-
回复了主题帖:
【复旦微车规MCU FM32FT0A测评】触摸功能检测
哈哈,为了能直观地观察其触摸后的变化情况,于是为它配了串口输出来显示状态信息。
- 2025-02-03
-
发表了主题帖:
【复旦微车规MCU FM32FT0A测评】语音提示功能的实现
流变分析器的工作过程中,涉及接触高温和物体缠绕的物体,为防止意外的出现,适时地发出语音提示是十分必要的安全措施之一。
将串口与MP3语音模块相结合,在适当的时机触发语音播报即可实现这样要求。
MP3语音模块及其引脚排列如图1所示,在一般情况下,它只需与开发板连接3条线,即5V电源、GND及串口发送信号端,这里是连接UART4_TX即引脚PB3。
图1 模块引脚排列
MP3语音模块工作的波特率为9600bps,为便于其控制指令是存放在数组中,即:
uint8_t cmd3[] = {0X7E, 0xFF, 0x06, 0X03, 00, 00, 01, 0xFE, 0xF7, 0XEF};
实现指定提示内容的指令生成函数为:
void playn(uint16_t index)
{
int i;
uint8_t checksum = 0;
cmd3[5] = (uint8_t)(index >> 8);
cmd3[6] = (uint8_t)(index);
for (i=2; i<8; i++)
{
checksum += cmd3[i];
}
cmd3[8] = (uint8_t)~checksum;
}
基于感应触发的语音提示功能测试主程序为:
int main(void)
{
uint8_t f,p,i;
IWDT_Init(FL_IWDT_PERIOD_4000MS);
FL_Init();
SVD_Init(SVD_MONTIOR_VDD, FL_SVD_WARNING_THRESHOLD_GROUP11, FL_SVD_REFERENCE_1P0V);
while(false == SVD_Result_Confirmed(SVD_HIGHER_THRESHOLD, 2000U/*us*/));
RMU_BOR_Init(FL_RMU_BOR_THRESHOLD_2P00V);
SystemClockInit();
MF_UART4_Init();
TSI_Init();
FL_IWDT_ReloadCounter(IWDT);
TSI_Widget_EnableAll();
FL_IWDT_ReloadCounter(IWDT);
TSI_Start();
FL_IWDT_ReloadCounter(IWDT);
f=0;
p=0;
while(1)
{
FL_IWDT_ReloadCounter(IWDT);
PowerDownMonitoring();
TSI_Debug_Handler();
FL_IWDT_ReloadCounter(IWDT);
if(TSI_GETSTAT_SCAN_CPLT())
{
TSI_CLRSTAT_SCAN_CPLT();
TSI_Widget_UpdateAll();
if(TSI_WidgetList.slider.sliderStatus==1)
{
f=TSI_WidgetList.slider.centerPos/50;
if(f!=p)
{
printf("N= %d\n\r",f);
playn(f);
for(i=0;i<10;i++)
{
FL_UART_WriteTXBuff(UART4, cmd3[i]);
while(FL_UART_IsActiveFlag_TXBuffEmpty(UART4) != 0x01UL);
}
p=f;
}
}
}
}
}
经程序的编译与下载,其测试效果如图2和图3所示,说明设计功能正确。
图2 触发值测试
图3 提示指令测试
-
回复了主题帖:
【复旦微车规MCU FM32FT0A测评】触摸功能检测
Jacktang 发表于 2025-2-3 10:20
输出触摸状态是之所以加判别处理,是因为它太灵敏了
看起来太灵敏也不是好事
哈哈,恰到好处才是好,有道是过犹不及呀!
-
回复了主题帖:
【新年花灯】莫负时光砥砺前行
Jacktang 发表于 2025-2-3 10:06
新年花灯真漂亮,电子人的新年过的真好
感谢支持!!!
- 2025-02-02
-
发表了主题帖:
【新年花灯】莫负时光砥砺前行
本帖最后由 jinglixixi 于 2025-2-3 10:40 编辑
我们生活在蓬勃向上的时代,时间滴答作响,让我们莫夫时光砥砺前行!
[localvideo]85f9f153a153275c8b79ebfb684b03e0[/localvideo]
时间滴答作响
[localvideo]d92234983bbdb7eaecb295d61913d866[/localvideo]
莫负时光砥砺前行
- 2025-02-01
-
发表了主题帖:
【MCXA156开发板测评】+基于串口屏的桌面化管控(2)
前面介绍了数据的显示与更新,这次要说是波形曲线的绘制。
要实现数据曲线的绘制,其方法也很简单,就是向指定的通道发送相应的数据。
以向通道0发送数据120,其指令为:
61 64 64 20 31 37 2C 30 2C 31 32 30 FF FF FF
即:add 17,0,120 0xff 0xff 0xff
实现波形绘制的测试效果如图3所示,其中通道0为粉色,通道1为黄色,通道2为红色。
图3 波形测试
绘制锯齿波曲线的程序为:
i=0;
while (1)
{ // 无需要清除前导0
HT[9]=(i%1000)/100+0x30;
HT[10]=(i%100)/10+0x30;
HT[11]=i%10+0x30;
LPUART_WriteBlocking(DEMO_LPUART, HT, 15);
i=(i+1)%252;
}
图5 绘制波形
演示视频:
[localvideo]43d02488b45e1112c4f1d4541d8f4505[/localvideo]
绘制温度曲线的程序为:
while (1)
{
result = P3T1755_ReadTemperature(&p3t1755Handle, &temperature);
if (result == kStatus_Success)
{
//PRINTF("\r\nTemperature:%f \r\n", temperature);
wd=250-temperature*2;
HT[9]=(wd%1000)/100+0x30;
HT[10]=(wd%100)/10+0x30;
HT[11]=wd%10+0x30;
LPUART_WriteBlocking(DEMO_LPUART, HT, 15);
}
SDK_DelayAtLeastUs(1000000, CLOCK_GetCoreSysClkFreq());
}
绘制采集数据曲线的程序为:
while (1)
{
LPADC_DoSoftwareTrigger(DEMO_LPADC_BASE, 1U);
while (!LPADC_GetConvResult(DEMO_LPADC_BASE, &mLpadcResultConfigStruct));
ad=250-((mLpadcResultConfigStruct.convValue) >> g_LpadcResultShift)/32;
HT[9]=(ad%1000)/100+0x30;
HT[10]=(ad%100)/10+0x30;
HT[11]=ad%10+0x30;
LPUART_WriteBlocking(DEMO_LPUART, HT, 15);
SDK_DelayAtLeastUs(1000000, CLOCK_GetCoreSysClkFreq());
}
-
回复了主题帖:
【复旦微车规MCU FM32FT0A测评】波形绘制与数据记录
秦天qintian0303 发表于 2025-2-1 08:31
串口屏还好相当于有另一个系统帮你处理了
相当于2个设备并行
- 2025-01-27
-
回复了主题帖:
【复旦微车规MCU FM32FT0A测评】波形绘制与数据记录
lugl4313820 发表于 2025-1-27 15:13
强呀,可以一个屏来适配N款单片机,这不是爽歪歪?不用重复造轮子了。
只是在界面需要变化时要重新来一遍,还有就是有的屏会在长时间不用的情况下,失去串口通讯的问题,但其触摸操作类的功能还存在,所用还要时不时的用一下,不好用了就改为它用。
-
回复了主题帖:
【复旦微车规MCU FM32FT0A测评】串口通讯与LED控制
lugl4313820 发表于 2025-1-27 11:27
复旦微的板子,他家的资料是否齐全呀,我好几年前用过一次,感觉有就难度。
首次申请到,感觉不如通常的板子顺手,尤其是它的频繁复位,简直没法做开发。
-
回复了主题帖:
【MCXA156开发板测评】+基于串口屏的桌面化管控(1)
lugl4313820 发表于 2025-1-27 11:25
看到这里,老师是不是用串口屏在做项目呀?
哦,是以前做项目留下的,用着比较顺手些。
-
回复了主题帖:
【复旦微车规MCU FM32FT0A测评】波形绘制与数据记录
lugl4313820 发表于 2025-1-27 11:11
老师,你这屏很大呀,驱动占不占内存呀?
是款7寸的串口屏,界面设计完成后一次性下载到显示屏的FLASH中,后期就只是串口发指令了。
-
发表了主题帖:
【复旦微车规MCU FM32FT0A测评】波形绘制与数据记录
在数据检测系统中,数据的地位是十分重要的,为了便于后期的数据分析,需对数据加以保存。
要进行数据保存,既困难,也简单。困难在于要有存储监制来保存,而一般的系统是难以支撑文件系统的。
简单则在于有了数据记录模块的出现,借助串行通讯就可将数据保存到文件中。
为与数据记录模块进行通讯,这里使用的UART4,其引脚占用见图1所示。
图1 引脚占用
图2 连接与测试
由于数据记录模块工作时的波特率为9600bps,故在使用时要按此来设置波特率。
在满足这些条件后,即可如下的主程序来实现数据保存的测试。
int main(void)
{
u16 i;
FL_Init();
MF_Config_Init();
MF_UART4_Init();
i=0;
while(1)
{
GetVoltage = GetSingleChannelVoltage_POLL(FL_ADC_EXTERNAL_CH6);
printf("%d,%d \r\n",i,GetVoltage);
FL_DelayMs(500);
i=i+1;
}
}
经程序的编译与下载,其测试效果如图3所示。
图3串口输出测试
在接入数据记录模块后,其数据被存入TF卡,其文件名是由“urc+数字串”构成,其记录文件的格式及内容如图4所示。
图4 记录形式
此外,通过与串口屏的配合还可绘制出采集数据的波形曲线。
依照串口屏的使用方式,显示采样值的指令被存放到数组中,其格式为:
uint8_t sj[15]={0x74,0x31,0x2E,0x74,0x78,0x74,0x3D,0x22,0x31,0x32,0x33,0x22,0xFF,0xFF,0xFF};
对于绘制波形曲线的指令也存放在数组中,其格式为:
uint8_t hz[15]={0x61,0x64,0x64,0x20,0x31,0x37,0x2C,0x30,0x2C,0x31,0x32,0x30,0xFF,0xFF,0xFF};
在使用时,只需用检测值替代数组中的数据部分即可。
在以串口测试输出时,其输出内容如图5所示。
图5 输出测试
实现检测数据显示与波形绘制的主程序为:
int main(void)
{
u16 i,v,u;
uint8_t hz[15]={0x61,0x64,0x64,0x20,0x31,0x37,0x2C,0x30,0x2C,0x31,0x32,0x30,0xFF,0xFF,0xFF};
uint8_t sj[15]={0x74,0x31,0x2E,0x74,0x78,0x74,0x3D,0x22,0x31,0x32,0x33,0x22,0xFF,0xFF,0xFF};
/* 使能IWDT */
IWDT_Init(FL_IWDT_PERIOD_4000MS);
/* Initialize FL Driver Library */
/* SHOULD BE KEPT!!! */
FL_Init();
/* 使能SVD, 阈值4.157V(falling)~4.257V(rising) */
SVD_Init(SVD_MONTIOR_VDD, FL_SVD_WARNING_THRESHOLD_GROUP11, FL_SVD_REFERENCE_1P0V);
/* 确认SVD监测结果是否高于阈值,如否则持续等待 */
while(false == SVD_Result_Confirmed(SVD_HIGHER_THRESHOLD, 2000U/*us*/));
/* 使能BOR */
RMU_BOR_Init(FL_RMU_BOR_THRESHOLD_2P00V);
/* Initialize all configured peripherals */
/* SHOULD BE KEPT!!! */
MF_Config_Init();
FL_IWDT_ReloadCounter(IWDT);
MF_UART4_Init();
i=0;
FL_IWDT_ReloadCounter(IWDT);
while(1)
{
/* 清狗 */
FL_IWDT_ReloadCounter(IWDT);
/* 电源掉电监测处理 */
PowerDownMonitoring();
/* 功能执行 */
GetVoltage = GetSingleChannelVoltage_POLL(FL_ADC_EXTERNAL_CH6);
v=250-GetVoltage/20; // =x/20
u=GetVoltage/20;
hz[9]=(v%1000)/100+0x30;
sj[8]=(u%1000)/100+0x30;
hz[10]=(v%100)/10+0x30;
sj[9]=(u%100)/10+0x30;
hz[11]=v%10+0x30;
sj[10]=u%10+0x30;
for(i=0;i<15;i++)
{
FL_UART_WriteTXBuff(UART4, hz[i]); //将发送数据写入发送寄存器
while(FL_UART_IsActiveFlag_TXBuffEmpty(UART4) != 0x01UL){}; // 等待发送完成
}
FL_IWDT_ReloadCounter(IWDT);
for(i=0;i<15;i++)
{
FL_UART_WriteTXBuff(UART4, sj[i]); //将发送数据写入发送寄存器
while(FL_UART_IsActiveFlag_TXBuffEmpty(UART4) != 0x01UL){}; // 等待发送完成
}
FL_DelayMs(500);
FL_IWDT_ReloadCounter(IWDT);
}
}
经程序的编译与下载,其测试效果如图6所示。这样就圆满地解决了开发板无法完成实现波形绘制的问题。
图6 显示效果
- 2025-01-26
-
回复了主题帖:
【复旦微车规MCU FM32FT0A测评】A/D数据采集与显示
lemonboard 发表于 2025-1-26 09:56
嘿嘿,人家获取的是电压真实值。
话说,它没有对采样值进行滤波处理吗?
应该是没有,估计它也不好实现,因为复位频繁难以支撑。
- 2025-01-25
-
发表了主题帖:
【MCXA156开发板测评】+基于串口屏的桌面化管控(1)
具有触摸功能的串口屏,相较于普通的TFT显示屏更适于进行桌面化管控。
区别于常规的界面设计,串口屏是通过软件先在电脑上进行效果设计及测试,在完成效果设计后,是通过串口一次性将设计结果全部下载给串口屏。
在使用时,是通过串口向显示屏发送指令来更新显示的内容或绘制的波形曲线。此外,它还可以通过触摸操作来选取功能或是设置参数。
本次使用的串口屏为7寸触摸屏,分辨率为800*480像素点。
其主界面如图1所示,它的设计界面如图2所示。
图1 主界面
图2 设计界面
在完成界面设计后,必须记录好设计时的关键信息,否则会影响后期的使用。
以更新日期为例,它是通过向标识地址发送数据来实现更新处理的。
若将日期更新为“2025-1-16”,其发送的指令为:
74 38 2E 74 78 74 3D 22 32 30 32 35 2D 30 31 2D 31 36 22 FF FF FF
即:t8.txt=“2025-01-16”0xff 0xff 0xff
若将时间更新为“12:30:00”,其发送的指令为:
74 39 2E 74 78 74 3D 22 31 32 3A 33 30 3A 30 30 22 FF FF FF
即:t9.txt=“12:30:00”0xff 0xff 0xff
其它内容的更新处理类此,这里就不再赘述。
使用触摸功能进行日期和时间设置的界面如图4所示,通过触摸相应的区域可改变设置的类型,通过模拟键盘可输入设置内容,通过功能项的触发,可将设置数据发送给开发板,以改变系统的计时值。
图3 连接接口
图4 设置界面
开发板的接收设置时间并更新显示的程序为:
uint8_t RQ[20]={0X74,0x39,0x2E,0x74,0x78,0x74,0x3D,0x22,0x31,0x32,0x3A,0x33,0x30,0x3A,0x30,0x30,0x22,0xFF,0xFF,0xFF};
LPUART_ReadBlocking(DEMO_LPUART, &ch, 7);
strncpy(rxbuff,&ch,strlen(&ch));
if(rxbuff[0]=='T')
{
RQ[8]=rxbuff[1];
RQ[9]=rxbuff[2];
RQ[11]=rxbuff[3];
RQ[12]=rxbuff[4];
RQ[14]=rxbuff[5];
RQ[15]=rxbuff[6];
LPUART_WriteBlocking(DEMO_LPUART, RQ, 20);
}
实现电子时钟计时效果的程序为:
int main(void)
{
uint32_t h,m,s;
Uint8_t f;
RESET_ReleasePeripheralReset(kUTICK0_RST_SHIFT_RSTn);
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
PRINTF("clock:\r\n");
UTICK_Init(EXAMPLE_UTICK);
strncpy(rxbuff,&ch,strlen(&ch));
f=1;
while (f)
{
if(rxbuff[0]=='T')
{
RQ[8]=rxbuff[1];
RQ[9]=rxbuff[2];
RQ[11]=rxbuff[3];
RQ[12]=rxbuff[4];
RQ[14]=rxbuff[5];
RQ[15]=rxbuff[6];
LPUART_WriteBlocking(DEMO_LPUART, RQ, 20);
f=0;
h=(RQ[8]-0x30)*10+(RQ[9]-0x30);
m=(RQ[11]-0x30)*10+(RQ[12]-0x30);
S=(RQ[14]-0x30)*10+(RQ[15]-0x30);
}
}
while (true)
{
UTickDelay(UTICK_TIME_1S);
if(s<59)
{
s=s+1;
}
else
{
s=0;
if(m<59)
{
m=m+1;
}
else
{
m=0;
h=(h+1)%24;
}
}
RQ[8]=h/10+0x30;
RQ[9]=h%10++0x30;
RQ[11]=m/10+0x30;
RQ[12]=m%10++0x30;
RQ[14]=s/10+0x30;
RQ[15]=s%10++0x30;
LPUART_WriteBlocking(DEMO_LPUART, RQ, 20);
}
}