生肖型万年历的制作之一
在几款迪文智能屏中,最喜欢的就是4寸屏,它方方正正体现着一份高雅,如果它是一款圆形屏的话会制作界面多样的百变手表,而作为方屏的话还是用它做一个生肖型的万年历为好,其界面如图1所示。当然,既然是生肖型万年历,除了显示的时间是实时变化的,那界面的生肖图案自然也是随年份而变化的。由于申请的迪文屏并未配有RTC计时器,故打算先完成界面的制作,后面再通过转接板为它接上一个RTC模块来确保万年历的计时功能。此外,为了便于校时,还安排了设置键来调整时间值。若时间允许的话再添加温湿度传感器dht22以检测环境状态的变化。
1.界面制作
(1)先创建一个屏幕尺寸为480*480的新工程,见图2所示。
(2)添加背景图,见图3所示。
(3)将背景图转换成名为23. ICL图片库文件。 (4)将12改为背景图转换成名为26.ICL图标库文件。 (5)在界面上添加一个“变量图标显示”组件,并按图5加以设置。
(6)在界面上添加2个“增量调节”组件,将其临时放置到“记录”与“设置”的上面,并按图7加以设置。
(7)将制作内容加以保存,并执行生成处理。 (8)使用预览功能进行测试,其效果如图8所示。
(9)为便于后续的时间显示,再添加2个文本显示组件,并按图10加以设置。经预览,其效果如图11所示。
(10)在界面上添加2个数据变量显示组件,并按图13加以设置。经预览,其效果如图14所示。
对于RTC计时器,需要有校时功能,为此制作一个参数设置界面。
2.参数设置
(1)添加名为“01_背景.png”的背景图片,以构成参数设置界面,其形式如图1所示。
(2)添加文本显示组件,以显示时间和日期,见图2所示。
(3)按图3所示分别对2个组件进行相关设置 (4)添加2个文本录入组件,以输入时间和日期,见图4所示。
(5)按图5所示将2个录入组件的录入显示区域设在同一位置,以实现在一个窗口输入的感觉。应注意的是在录入时,应在设置的名称上先点击一下以确定录入的对象。
(6)按图6所示,完成录入组件的相关设置。
(7)按图7所示,添加16个基础触控组件,以模拟按键的触控操作。
(8)为每个按键设置键值,参见图8所示。
(9)添加2个基础触控组件,以便进行确认或取消操作,见图9所示。
(10)对2个组件添加返回设置,见图10所示。
至此就完成了设置界面的制作,利用预览功能可验证一下设计的功能,其模拟测试效果见图11和图12所示,说明制作正确。
生肖型万年历的制作之三
迪文智能屏与一般的串口屏有较大的不同,它采用的是单芯片双核ASIC IC,其中一个核是GUI CPU,用于运行DGUS II系统;一个核是OS CPU,用于运行用户8051代码或迪文OS系统,使用户在应用中可用省掉CPU。 在完成了GUI的制作后,可用利用OS CPU通过编程来驱动外部的RTC模块来进行计时处理,且可借助RTC模块上的后备电池来维持掉电后的运行。
3. RTC计时
RTC模块的外观如图1所示,该模块所使用的芯片为DS1302,并向外提供了5个连接引脚,除2个电源引脚外,其它3个引脚的作用如下: CLK---时钟引脚 DAT---数据引脚 RST---复位引脚
迪文屏的转接板如图2所示,使用时可按以下关系来连接: CLK---P1.1 DAT--- P1.2 RST--- P1.3
由于在设置RTC是执行写操作,而在读取时间值时是读操作,故在使用时应注意DAT引脚的输入输出模式的转换。 DS1302的应用程序比较容易获得,在用于迪文智能屏时,需注意运行几个问题。 (1)对RTC引脚的定义 sbit RST=P1^3; sbit IO=P1^2; sbit SCK=P1^1; (2)对RTC的初始化 RTC的初始化函数为: void ds1302_init(void) { SetPinOut(1,1); SetPinOut(1,2); SetPinOut(1,3); delay_us(2); RST=0; SCK=0; }
(3)对RTC的读写 要对RTC进行读写,依赖的函数有2个,即字节写入函数和字节读取函数,其内容如下: void ds1302_write_byte(uchar addr, uchar d) { uchar i; RST=1; SetPinOut(1,2); addr = addr & 0xFE; for(i = 0; i < 8; i ++) { IF(addr & 0x01) { IO=1; } else { IO=0; } SCK=1; delay_us(1); SCK=0; delay_us(1); addr = addr >> 1; } for(i = 0; i < 8; i ++) { if (d & 0x01) { IO=1; } else { IO=0; } SCK=1; delay_us(1); SCK=0; delay_us(1); d = d >> 1; } RST=0; }
uchar ds1302_read_byte(uchar addr) { uchar i,temp; RST=1; addr = addr | 0x01; SetPinOut(1,2); for(i = 0; i < 8; i ++) { if (addr & 0x01) { IO=1; } else { IO=0; } SCK=1; delay_us(1); SCK=0; delay_us(1); addr = addr >> 1; } }
(4)时间的读写 读取时间的函数为: void ds1302_read_time(void) { time_buf[1]=ds1302_read_byte(ds1302_year_add); time_buf[2]=ds1302_read_byte(ds1302_month_add); time_buf[3]=ds1302_read_byte(ds1302_date_add); time_buf[4]=ds1302_read_byte(ds1302_hr_add); time_buf[5]=ds1302_read_byte(ds1302_min_add); time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f; time_buf[7]=ds1302_read_byte(ds1302_day_add); }
这里,为便于测试是将时间值存放到数组中。 (5)测试主程序 在主程序的控制下,可通过串口对时间值进行输出显示,其程序如下: void main(void) { InitCPU(); StartTimer(1,500); ds1302_init(); delay_ms(10); ds1302_write_time(); printf("Entry Main!\r\n"); while(1) { ds1302_read_time(); readtime[8]=(time_buf[4]>>4); readtime[9]=(time_buf[4]&0x0F); readtime[10]=(time_buf[5]>>4); readtime[11]=(time_buf[5]&0x0F); readtime[12]=(time_buf[6]>>4); readtime[13]=(time_buf[6]&0x0F); if(readtime[13]!=sec_buf) { sec_buf=readtime[13]; UART2_Sendbyte(readtime[8]+'0'); delay_us(2); UART2_Sendbyte(readtime[9]+'0'); delay_us(2); UART2_Sendbyte(':'); delay_us(2); UART2_Sendbyte(readtime[10]+'0'); delay_us(2); UART2_Sendbyte(readtime[11]+'0'); delay_us(2); UART2_Sendbyte(':'); delay_us(2); UART2_Sendbyte(readtime[12]+'0'); delay_us(2); UART2_Sendbyte(readtime[13]+'0'); delay_us(2); printf("\r\n"); delay_ms(500); } } }
C51的程序编辑界面如图3所示,通过编译其结果如图4所示。 经程序下载,其测试效果如图5所示。 后面可以把时间值发送到智能屏的指定变量地址,以实现界面上时间值的实时更新。
生肖型万年历的制作之四
对生肖型万年历来讲,它的生肖图案是随年份或说是按生肖纪年,即12年一轮回。若改为天干地支纪年,则是60年一个甲子,则需要再配上10个天干(甲乙丙丁戊己庚辛壬癸)和12地支(子鼠丑牛寅虎卯兔辰龙巳蛇午马未羊申猴酉鸡虚狗亥猪)的汉字图标库。在开始的时候,为了能展示生肖图案是通过上下调节键来切换显示的,在完整的作品中则要求自动按年份来切换。由于界面设计中是不支持数学表达式的,因此这个问题只能交给C51编程来实现。自动更新生肖图标的方式是,在出现年份变动时,通过计算处理求解出对应的生肖图标编号,再通过更新其地址变量的值来更换显示内容。 经归纳,在公元纪年中,其变化公式为: n= (N%12+9)%12 其中,N表示年份,n则是生肖图标编号。
相应的检测函数为: void rq_Read(void) { u8 h,l; u16 m,dat; dat=Read_Dgus(0x2000); h=(dat>>8)-'0'; l=(dat&0x0F); m=h*10+l; printf("q=%d \r\n",m); dat=Read_Dgus(0x2001); h=(dat>>8)-'0'; l=(dat&0x0F); m=m*100+h*10+l; printf("n=%d \r\n",m); m=(m%12+9)%12; Write_Dgus(0x4000,m); printf("m=%d \r\n",m); }
其下载测试,其结果分别见图1和图2所示。
在生肖图标地址为0x4000的情况下,其边界切换效果如图3和图4所示。
也就是说,2023年是兔年,而2024年是龙年,说明功能正确! 除了在设置日期时会进行生肖图标的更换,在出现年份变化时也需要进行图标更新处理,其图标更新函数为: void rq_change(void) { u16 m,dat; IF(readtime[3]!= np) { np= readtime[3]; dat=readtime[0]*1000+ readtime[1]*100+ readtime[2]*10+ readtime[3]; m=(dat%12+9)%12; Write_Dgus(0x4000,m); } }
其中,变量dat存放的是年份,变量m存放的是生肖图标的序号。此外,为了增强生肖型万年历的功能,在生肖纪年与显示的基础上,可添加温湿度检测功能,并以光隔继电器来控制环境温湿度变化。在设置页面应添加温湿度限制设置项,在主界面应添加控制状态指示等,见图5所示。
另外,还可添加温湿度采集的记录功能,其方法就是利用串行通讯功能以串口记录模块来记录检测数据并以文件的形式加以保存。至此,生肖型万年历的制作就告一段落了,相对来讲它对OS CPU的使用是较为深入的,是对智能屏应用方案的一个有效补充。
边界切换的演示视频链接:https://www.bilibili.com/video/BV1ML4y1j7D3/
|