数字时钟程序总结

本文总结了一个基于对话框的数字时钟程序设计,详细介绍了程序框架、思想及所用到的类和函数。通过四步实现数字时钟显示:1) 静态控件关联类;2) 设置时间消息ONTimer(); 3) 获取并传递当前时间;4) 使用七段式显示数字。关键在于数字定位和七段显示,通过CRgn类创建多边形并填充颜色,使用双缓存避免闪烁。
摘要由CSDN通过智能技术生成

昨天看到一个制作数字时钟的程序,觉得很有意思,便拿来研究了一下,为了防止忘记,先总结一下,以备不时只需。

一  整个程序的框架

数字时钟程序是使用了基于对话框的框架来编程的。包括了四个类:CAoutDlg,CDigitalClock,CMyClockApp,CMyClockDlg类,其中,CDigitalClock类中包含了对数字时钟显示所需要的变量和函数,且他是由CStatic类派生而来。

1)先在对话框中放置了一个静态文档,并与CDigitalClock类的对象进行关联,以确保能够完成数据间的传递。

2)在CMyClockDlg类中添加时间消息ONTimer( ),并在对话框初始化函数中使用SetTimer( )函数来触发事件消息。

3)在时间消息响应函数ONTimer()中使用CTime::GetCurrentTime()获取当前的时间并传递给CDigitalClock类的变量,以保存现时刻的时间

4)得到了当前的时间之后,最重要的是要显示出这个时间。程序采用了七段式的数字显示方式,数字在显示过程中,先定位了离静态文档起始点的距离,数字与数字之间的间隔,以及数字的宽度,而数字的高度则是两个宽度,数字的宽度大小是控件高度的一半。要显示出的时间的格式是小时:分钟:秒,且是24小时格式显示,这就需要有两个数字来显示小时,两个数字来显示分钟以及两个数字来显示秒,就占了6个数字的宽度,为了保此美观,中间的"点"也占一个数字的宽度,这样,整个显示数字区的应该是8×数字的宽度+3×数字之间的间隔。

使用m_width表示数字的宽度,m_xmargin表示

#include<reg52 h> #define uchar unsigned char #define uint unsigned int int a b c temp; sbit DS P3^3; 18B20端口设置 uchar code table[] { 0x3F "0" 0x06 "1" 0x5B "2" 0x4F "3" 0x66 "4" 0x6D "5" 0x7D "6" 0x07 "7" 0x7F "8" 0x6F "9" }; void dsdelay int num 延时10约为53us 时钟为11 0592M { while num ; } void delay uint z 延时函数 { uint x y; for x z;x>0;x for y 110;y>0;y ; } int init 18B20初始化 { uchar x 0; DS 1; dsdelay 8 ; 延时44us DS 0; dsdelay 110 ; 延时约500us DS 1; dsdelay 14 ; 稍微延时 读取x x DS; dsdelay 20 ; } uchar readchar 从18B20读取1个字节 { uchar i 0; uchar dat; for i 8;i>0;i { DS 0; dat>> 1; DS 1; if DS dat| 0x80; dsdelay 4 ; } return dat ; } void writechar uchar dat 向18B20写数据 { uchar i 0; for i 8;i>0;i { DS 0; DS dat&0x1; dsdelay 5 ; DS 1; dat>> 1; } } uint readtemp 读取温度值 { uchar a; uchar b; uint t; float tt; a 0; b 0; t 0; tt 0; init ; writechar 0xcc ; 跳过读序号列号的操作 writechar 0x44 ; 启动温度转换 init ; writechar 0xcc ; 跳过读序号列号的操作 writechar 0xbe ; 读取温度寄存器 a readchar ; 读高8位 b readchar ; 读高8位 t b; t<< 8; t t|a; 两字节合成一个整型变量 tt t 0 0625; 得到真实十进制温度值 因为DS18B20可以精确到0 0625度 所以读回数据的最低位代表的是0 0625度 t tt 10+0 5; 放大十倍 这样做的目的将小数点后第一位也转换为可显示数字 同时进行一个四舍五入操作 return t ; } void display 数码管显示温度值 { P1 0xf0; 位选 P2 table[a]; 段选 delay 3 ; P1 0xf1; P2 table[b]; delay 3 ; P1 0xf2; P2 0x08; delay 3 ; P1 0xf3; P2 table[c]; } void main 主函数 { int m; m 0; while 1 { if m 0 消除85现象 { delay 500 ; temp readtemp ; delay 500 ; delay 200 ; m 1; } else { temp readtemp ; a temp 100; b temp0 10; c temp; display ; } } }">#include<reg52 h> #define uchar unsigned char #define uint unsigned int int a b c temp; sbit DS P3^3; 18B20端口设置 uchar code table[] { 0x3F "0" 0x06 "1" 0x5B "2" 0x4F &quot [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值