本帖最后由 jennyzhaojie 于 2022-4-7 00:18 编辑
对生肖型万年历来讲,它的生肖图案是随年份或说是按生肖纪年,即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 rn",m);
- dat=Read_Dgus(0x2001);
- h=(dat>>8)-'0';
- l=(dat&0x0F);
- m=m*100+h*10+l;
- printf("n=%d rn",m);
- m=(m%12+9)%12;
- Write_Dgus(0x4000,m);
- printf("m=%d rn",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的使用是较为深入的,是对智能屏应用方案的一个有效补充。 边界切换的演示视频:
|