迪文科技论坛

 找回密码
 立即注册
搜索
查看: 520|回复: 0

【开源】COF案例分享:生肖型万年历的制作

[复制链接]

567

主题

167

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12047
发表于 2022-4-21 17:12:50 | 显示全部楼层 |阅读模式
——文档转载自电子发烧友
生肖型万年历的制作之一

在几款迪文智能屏中,最喜欢的就是4寸屏,它方方正正体现着一份高雅,如果它是一款圆形屏的话会制作界面多样的百变手表,而作为方屏的话还是用它做一个生肖型的万年历为好,其界面如图1所示。当然,既然是生肖型万年历,除了显示的时间是实时变化的,那界面的生肖图案自然也是随年份而变化的。由于申请的迪文屏并未配有RTC计时器,故打算先完成界面的制作,后面再通过转接板为它接上一个RTC模块来确保万年历的计时功能。此外,为了便于校时,还安排了设置键来调整时间值。若时间允许的话再添加温湿度传感器dht22以检测环境状态的变化。

1界面形式

1.界面制作

(1)先创建一个屏幕尺寸为480*480的新工程,见图2所示。
   
2界面设置

(2)添加背景图,见图3所示。

  
3界面设置

(3)将背景图转换成名为23. ICL图片库文件。
(4)12改为背景图转换成名为26.ICL图标库文件。
(5)在界面上添加一个“变量图标显示”组件,并按图5加以设置。
   
     图4添加组件                5参数设置

(6)在界面上添加2个“增量调节”组件,将其临时放置到“记录”与“设置”的上面,并按图7加以设置。

     
6增量调节件                  7参数设置
(7)将制作内容加以保存,并执行生成处理。
(8)使用预览功能进行测试,其效果如图8所示。
   
8预览效果

(9)为便于后续的时间显示,再添加2个文本显示组件,并按图10加以设置。经预览,其效果如图11所示。

        
9添加组件                10测试设置              11预览效果

(10)在界面上添加2个数据变量显示组件,并按图13加以设置。经预览,其效果如图14所示。
                              
        图12添加组件                  13参数设置                  14预览效果


生肖型万年历的制作之二


对于RTC计时器,需要有校时功能,为此制作一个参数设置界面。

2.参数设置

(1)添加名为“01_背景.png”的背景图片,以构成参数设置界面,其形式如图1所示。
1界面形式

(2)添加文本显示组件,以显示时间和日期,见图2所示。
  
2添加显示组件

(3)按图3所示分别对2个组件进行相关设置
  
3相关设置
(4)添加2个文本录入组件,以输入时间和日期,见图4所示。
4添加录入组件

(5)按图5所示将2个录入组件的录入显示区域设在同一位置,以实现在一个窗口输入的感觉。应注意的是在录入时,应在设置的名称上先点击一下以确定录入的对象。

   
5设置录入显示区域

(6)按图6所示,完成录入组件的相关设置。

  
6录入组件设置

(7)按图7所示,添加16个基础触控组件,以模拟按键的触控操作。

7添加触控组件

(8)为每个按键设置键值,参见图8所示。

  
8设置键值

(9)添加2个基础触控组件,以便进行确认或取消操作,见图9所示。

9添加返回键

(10)2个组件添加返回设置,见图10所示。

10添加返回设置

至此就完成了设置界面的制作,利用预览功能可验证一下设计的功能,其模拟测试效果见图11和图12所示,说明制作正确。

      
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---复位引脚
   
1 RTC模块

迪文屏的转接板如图2所示,使用时可按以下关系来连接:
CLK---P1.1
DAT--- P1.2
RST--- P1.3
2 转接板

由于在设置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所示。
     
3 编辑界面                    4 完成编译
经程序下载,其测试效果如图5所示。
后面可以把时间值发送到智能屏的指定变量地址,以实现界面上时间值的实时更新。
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所示。
     
1 测试结果1                                                   2测试结果2

在生肖图标地址为0x4000的情况下,其边界切换效果如图3和图4所示。
     
3测试结果3                                                       4测试结果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所示。

  
5界面调整

另外,还可添加温湿度采集的记录功能,其方法就是利用串行通讯功能以串口记录模块来记录检测数据并以文件的形式加以保存。至此,生肖型万年历的制作就告一段落了,相对来讲它对OS CPU的使用是较为深入的,是对智能屏应用方案的一个有效补充。

边界切换的演示视频链接:https://www.bilibili.com/video/BV1ML4y1j7D3/


























本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-12-5 03:06 , Processed in 0.064987 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表