钟表源程序代码
- 格式:docx
- 大小:21.77 KB
- 文档页数:5
void CTest13_4Doc::m_TickAdd(){this->m_sec ++;if(this->m_sec == 60){this->m_min ++;this->m_sec = 0;}if(this->m_min == 60){this->m_hour ++;this->m_min = 0;}if(this->m_hour>= 12){this->m_hour -= 12;}}void CTest13_4Doc::M_MoveClockHands(){intpx, py;double degree;//设置秒针的终点坐标degree = this->m_sec * 6 - 90;px = cos((degree/180.0)*PI)* sLen + 250;py = sin((degree/180)*PI)* sLen + 250;this->m_secEndPoint.x = px;this->m_secEndPoint.y= py;//设置分针的终点坐标degree = this->m_min * 6 - 90;px = cos((degree/180.0)*PI) * mLen + 250;py = sin((degree/180)*PI) * mLen + 250;this->m_minEndPoint.x = px;this->m_minEndPoint.y = py;//设置时针的终点坐标degree = this->m_hour * 30 - 90;px = cos((degree/180.0)*PI) * hLen + 250;py = sin((degree/180.0)*PI) * hLen + 250;this->m_hourEndPoint.x = px;this->m_hourEndPoint.y = py;}BOOL CTest13_4Doc::OnNewDocument(){if (!CDocument::OnNewDocument())return FALSE;// TODO: add reinitialization code herethis->m_Rect = CRect(100,100,400,400);this->m_org = this->m_Rect.CenterPoint();this->m_centerRect = CRect(m_Rect.TopLeft().x+140, m_Rect.TopLeft().y+140,m_Rect.BottomRight().x-140, m_Rect.BottomRight().y-140);CTime time = CTime::GetCurrentTime();this->m_hour = time.GetHour();this->m_min = time.GetMinute();this->m_sec = time.GetSecond();//设置时钟指针的终点位置// this->M_MoveClockHands();//设置指针的长度hLen = 80;mLen = 100;sLen = 120;// (SDI documents will reuse this document)return TRUE;}void CTest13_4View::OnDraw(CDC* pDC){CTest13_4Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);SetTimer(0, 1000, NULL);CPen *oldPen, *cPen;CBrush *oldBrush, *cBrush;//画出大的圆cPen = new CPen(PS_SOLID, 3, RGB(255,132,123));cBrush = new CBrush(RGB(123,132,123));oldPen = pDC->SelectObject(cPen);oldBrush = pDC->SelectObject(cBrush);pDC->Ellipse(pDoc->m_Rect);pDC->SelectObject(oldPen);pDC->SelectObject(oldBrush);//画出中心的一个圆cBrush = new CBrush(RGB(255,132,123));pDC->SelectObject(cBrush);pDC->Ellipse(pDoc->m_centerRect);pDC->SelectObject(oldBrush);//得到矩形的另个点,画出四个分线cPen = new CPen(PS_SOLID, 2, RGB(255,222,123));oldPen = pDC->SelectObject(cPen);CPointtl = pDoc->m_Rect.TopLeft();CPointbr = pDoc->m_Rect.BottomRight();pDC->MoveTo((br.x+tl.x)/2, tl.y);pDC->LineTo((br.x+tl.x)/2, tl.y+20);pDC->MoveTo((br.x+tl.x)/2, br.y);pDC->LineTo((br.x+tl.x)/2, br.y-20);pDC->MoveTo(tl.x, (br.y+tl.y)/2);pDC->LineTo(tl.x+20, (br.y+tl.y)/2);pDC->MoveTo(br.x, (br.y+tl.y)/2);pDC->LineTo(br.x-20, (br.y+tl.y)/2);pDC->SelectObject(oldPen);//画出刻度pDC->MoveTo(326,122);pDC->LineTo(320,134);pDC->MoveTo(377,175);pDC->LineTo(365,183);////pDC->MoveTo(377,323);pDC->LineTo(365,317);pDC->MoveTo(326,378);pDC->LineTo(320,365);////pDC->MoveTo(175,377);pDC->LineTo(183,365);pDC->MoveTo(122,326);pDC->LineTo(134,320);////pDC->MoveTo(122,177);pDC->LineTo(134,183);pDC->MoveTo(177,122);pDC->LineTo(183,134);//画出三个时针、分针、秒针//hourpDC->MoveTo(pDoc->m_org);pDC->LineTo(pDoc->m_hourEndPoint);//minutinpDC->MoveTo(pDoc->m_org);pDC->LineTo(pDoc->m_minEndPoint);//secondpDC->MoveTo(pDoc->m_org);pDC->LineTo(pDoc->m_secEndPoint);// TODO: add draw code for native data here}void CTest13_4View::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call default CTest13_4Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDoc->m_TickAdd();pDoc->M_MoveClockHands();this->InvalidateRect(CRect(130,130,370,370));CView::OnTimer(nIDEvent);}void CTest13_4View::OnLButtonDblClk(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call default CTest13_4Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);changeTimectime;if(ctime.DoModal() == IDOK){pDoc->m_hour = ctime.m_Hour;pDoc->m_min = ctime.m_Min;pDoc->m_sec = ctime.m_Sec;//改变系统时间if(ctime.m_ChangeSysTime){CTime time = CTime::GetCurrentTime();SYSTEMTIME tm;tm.wYear = time.GetYear();tm.wDay = time.GetDay();tm.wMonth =time.GetMonth();tm.wHour = ctime.m_Hour;tm.wMinute = ctime.m_Min;tm.wSecond = ctime.m_Sec;tm.wMilliseconds = 0;SetLocalTime(&tm);}pDoc->M_MoveClockHands();}CView::OnLButtonDblClk(nFlags, point);}大体上就用到了上面几个函数,用到的变量自己看着加吧!。
flashas3.0时钟源代码// 文件 1.DTimer.aspackage{import flash.display.Shape;import flash.display.Sprite;import flash.display.StageAlign;import flash.display.StageScaleMode; import flash.text.StaticText;import flash.events.*;import flash.text.T extField;import flash.text.T extFormat;public class DTimer extends Sprite{// 设置时钟宽度public var w:uint=200;// 设置时钟高度public var h:uint=200;// 设置时钟半径public var radius:uint;// 设置时钟中心位置public var centerX:int;public var centerY:int;// 定义三个形状表示时钟指针public var hourHand:Shape;public var minuteHand:Shape;public var secondHand:Shape;// 定义时钟样式public var bgColor:uint=0xeeeeff;public var hourHandColor:uint=0x003366;public var minuteHandColor:uint=0x000099; public var secondHandColor:uint=0xcc0033; public var x0:uint;public var y0:uint;public var x1:uint;public var y1:uint;public var txt:TextField;// 定义时间public var currentTime:Date;public function init():void{// 绘制表盘drawBorder();// 绘制表盘显示文字drawLabels();// 绘制指针createHands();Drawlss();// 显示文本CreateTxt();}public function DTimer(w:uint){this.w=w;this.h=w; // 是圆盘所以取一样this.radius=Math.round(this.w/2);this.centerX=this.radius;this.centerY=this.radius;}public function drawBorder(){graphics.lineStyle(0.5,0x999999);graphics.beginFill(bgColor);graphics.drawCircle(centerX,centerY,radius); graphics.endFill();}public function drawLabels(){for(var i:Number=1;i<=12;i++){var label:TextField=new TextField();label.text=i.toString();// 小时位置var angleInRadians:Number=i*30*(Math.PI/180);/* 度*π弧度==---------180弧度*180度==------------π即:π弧度等于180度*/label.x=centerX+(0.9*radius*Math.sin(angleInRadians))-5; label.y=centerY-(0.9*radius*Math.cos(angleInRadians))-9;trace(Math.sin(angleInRadians));// 格式化文本内容var tf:TextFormat=new TextFormat();tf.font="Arial";tf.bold="true";tf.size=12;label.setTextFormat(tf);addChild(label);}}// 绘制分钟对应位置public function Drawlss(){for(var i:Number=0;i<=60;i++){var lshape:Shape=new Shape();Drawls(lshape,i*6,0x000000,1);addChild(lshape);}}// 绘制分针方法public function Drawls(hand:Shape,rot:uint,color:uint,thickness:Number):void{ var angleInRadius:Number=rot*(Math.PI/180);x1=centerX+(radius*Math.sin(angleInRadius));y1=centerY-(radius*Math.cos(angleInRadius));if(rot%30==0){x0=centerX+(0.95*radius*Math.sin(angleInRadius));y0=centerY-(0.95*radius*Math.cos(angleInRadius));}else{x0=centerX+(0.97*radius*Math.sin(angleInRadius));y0=centerY-(0.97*radius*Math.cos(angleInRadius));}hand.graphics.lineStyle(thickness,color);hand.graphics.moveTo(x0,y0);hand.graphics.lineTo(x1,y1);}public function createHands():void{var hourHandShape:Shape=new Shape();drawHand(hourHandShape,Math.round(radius*0.5),hourHa ndColor,3.0);this.hourHand=Shape(addChild(hourHandShape));this.hourHand.x=centerX;this.hourHand.y=centerY;// 绘制分针var minuteHandShape:Shape=new Shape();drawHand(minuteHandShape,Math.round(radius*0.8),minut eHandColor,2.0);this.minuteHand=Shape(addChild(minuteHandShape));this.minuteHand.x=centerX;this.minuteHand.y=centerY;// 绘制秒针var secondHandShape:Shape=new Shape();drawHand(secondHandShape,Math.round(radius*0.9),secon dHandColor,0.5);this.secondHand=Shape(addChild(secondHandShape));this.secondHand.x=centerX;this.secondHand.y=centerY;}public function drawHand(hand:Shape,distance:uint,color:uint,thickness:Numbe r):void{hand.graphics.lineStyle(thickness,color);hand.graphics.moveTo(0,distance);hand.graphics.lineTo(0,0);}public function draw():void{currentTime=new Date();showTime(currentTime);showT(currentTime);}public function CreateTxt():void{txt=new TextField();txt.width=300;txt.x=centerX-radius;txt.y=centerY-radius-20;addChild(txt);}public function showT(time:Date){var seconds:uint=time.getSeconds();var minutes:uint=time.getMinutes();var hours:uint=time.getHours();var year:uint=time.getFullYear();var month:uint=time.getMonth()+1;var date:uint=time.getDate();this.txt.text="现在时间是"+year+"年"+month+"月"+date+"日"+hours+"时"+minutes+"分"+seconds+"秒";}public function showTime(time:Date):void{var seconds:uint=time.getSeconds();var minutes:uint=time.getMinutes();var hours:uint=time.getHours();this.secondHand.rotation=180+(seconds*6);this.minuteHand.rotation=180+(minutes*6);this.hourHand.rotation=180+(hours*30)+(minutes*0.5);}}}//文件2. SimpleClock.aspackage{import flash.display.Sprite;import DTimer;import flash.events.TimerEvent;import flash.utils.Timer;public class SimpleClock extends Sprite{public var face:DTimer;public var ticker:Timer;public static const millisecondsPerMinute:int=1000*60;public static const millisecondsPerHour:int=1000*60*60;public static const millisecondsPerDay:int=1000*60*60*24;public function initClock(faceSize:Number=200){var invoiceDate:Date=new Date();var millisecondsPerDay:int=1000*60*60*24;var dueDate:Date =new Date(invoiceDate.getTime()+(30*millisecondsPerDay));var oneHourFromNow:Date=new Date();oneHourFromNow.setTime(oneHourFromNow.getTime()+m illisecondsPerHour);// 创建表盘,初始化参数face=new DTimer(Math.max(20,faceSize));face.init();addChild(face);face.draw();// 创建Timer对象ticker=new Timer(1000);ticker.addEventListener(TimerEvent.TIMER,onTick);ticker.start();}public function onTick(event:TimerEvent){face.draw();}}}// 文件3.DateTimer.aspackage{import flash.display.Sprite;import DTimer;import SimpleClock;public class DateTimer extends Sprite{ public function DateTimer(){var sc:SimpleClock=new SimpleClock(); sc.x=165;sc.y=100;addChild(sc);sc.initClock();}}}。
附录程序清单:#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int/*七段共阴管显示定义*/uchar codedispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};/*定义并初始化变量*/uchar seconde=0;uchar minite=0;uchar hour=12;uchar mstcnt=0;sbit P1_0=P1^0; // second 调整定义sbit P1_1=P1^1; //minite调整定义sbit P1_2=P1^2; //hour调整定义/*函数声明*/void delay(uchar k ); //延时子程序void time_pro( ); //时间处理子程序void display( ); //显示子程序void keyscan( ); //键盘扫描子程序/*****************************//*延时子程序*//****************************/void delay (uchar k){uchar j;while((k--)!=0){for(j=0;j<125;j++){;}}}/**************************//*时间处理子程序*//**************************/void time_pro( void){if(seconde==60) //秒钟设为60进制{ seconde=0;minite++;if( minite==60) //分钟设为60进制{ minite=0;hour++;if(hour==24) //时钟设为24进制{hour=0; }}}}/*****************************//* 显示子程序*//*****************************/void display(void){P2=0xfe;P0=dispcode[hour/10]; //显示小时的十位delay(4);P2=0xfd;P0=(dispcode[(hour%10)])|0X80; //显示小时的个位 delay(4);P2=0xfb;P0=dispcode[minite/10]; //显示分的十位delay(4);P2=0xf7;P0=(dispcode[minite%10])|0X80; //显示分的个位 delay(4);P2=0xef;P0=dispcode[seconde/10]; //显示秒的十位delay(4);P2=0xdf;P0=dispcode[seconde%10]; //显示秒的个位delay(4);}/*******************************/ /*键盘扫描子程序*//*******************************/ void keyscan (void){if(P1_0==0) //按键1秒的调整{delay(30);if(P1_0==0){seconde++;if(seconde==60){seconde=0; }}}if(P1_1==0) //按键2分的调整 {delay(30);if(P1_1==0){minite++;if(minite==60){minite=0;}}}if(P1_2==0) //按键3小时的调整 {delay(30);if(P1_2==0){hour++;if(hour==24){hour=0; }}}}void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次 {TH0=0x3c;TMOD = 0x11;mstcnt++;if(mstcnt==20){seconde++;mstcnt=0; //对计数单元的清零}}/**************************//*主函数*//**************************/void main(void){ P1=0xff; //初始化p1口,全设为1TMOD = 0x11; //time0为定时器,方式1TH0=0x3c; //预置计数初值TL0=0xb0;EA=1;ET0=1;TR0=1;while (1){keyscan( ); //按键扫描time_pro( ); //时间处理display( ); //显示时间}}。
//c语言钟表程序源码#include<graphics.h>#include<conio.h>#include<math.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<windows.h>#pragma comment(lib, "winmm.lib")#define pi 3.14159typedef struct{double x;double y;} Line;void InitL(Line *L, double x, double y){L->x=x;L->y=y;}void DrawL(Line L){setcolor(BLUE);line(L.x, L.y, 240, 240);}void ClearL(Line L){setcolor(RGB(255, 240, 245));line(L.x, L.y, 240, 240);}void MoveL(Line *L, double m, double n){L->x=240+190*m;L->y=240-190*n;}void main(){PlaySound (TEXT("FilePath"), NULL, SND_ASYNC | SND_NODEFAULT | SND_LOOP);system("mode con cols=45 lines=15");system("color 79");initgraph(480, 480);loadimage(NULL, _T("IMAGE"), _T("BackGroud"));fillcircle(240,240,240);//画表盘setfillcolor(BLACK);fillrectangle(232, 35, 235, 84);fillrectangle(243, 35, 258, 38);fillrectangle(255, 39, 258, 57);fillrectangle(243, 58, 258, 61);fillrectangle(243, 62, 246, 80);fillrectangle(243, 81, 258, 84);//画12fillrectangle(40, 215, 60, 218);fillrectangle(40, 219, 43, 237);fillrectangle(57, 219, 60, 237);fillrectangle(40, 238, 60, 241);fillrectangle(57, 242, 60, 260);fillrectangle(40, 261, 60, 264);//画9fillrectangle(420, 215, 440, 218);fillrectangle(438, 219, 441, 237);fillrectangle(420, 238, 440, 241);fillrectangle(438, 242, 441, 260);fillrectangle(420, 261, 440, 264);//画3fillrectangle(230, 390, 250, 393);fillrectangle(230, 394, 233, 412);fillrectangle(230, 413, 250, 416);fillrectangle(230, 417, 233, 435);fillrectangle(247, 417, 250, 435);fillrectangle(230, 436, 250, 439);//画6int i;for(i=5; i<=60; i+=5){setcolor(RED);line(240+240*sin(pi/30*i), 240-240*cos(pi/30*i), 240+210*sin(pi/30*i),240-210*cos(pi/30*i));} //画出四个长的时刻针for(i=1; i<=60; i++){if(i%5==0) continue;setcolor(RED);line(240+240*sin(pi/30*i), 240-240*cos(pi/30*i), 240+225*sin(pi/30*i), 240-225*cos(pi/30*i));}Line L, M;time_t t=time(0);int h, m, s, a;char hour[3], min[3], sec[3];strftime( hour, sizeof(hour), "%I",localtime(&t));strftime( min, sizeof(min), "%M",localtime(&t));strftime( sec, sizeof(sec), "%S",localtime(&t));h=atoi(hour);m=atoi(min);s=atoi(sec);//画出其他时刻针InitL(&L, 240+190*sin(pi/30*(s+1)), 240-190*cos(pi/30*(s+1)));for(a=1; a; a++){DrawL(L);setcolor(GREEN);line(240, 240, 240+150*sin((pi/1800*(a+s))+(pi/30*m)), 240-150*cos(pi/1800*(a+s)+(pi/30*m)));setcolor(BLACK);line(240, 240, 240+130*sin(pi/108000*a+(pi/6*h)+(pi/360*m)), 240-130*cos(pi/108000*a+(pi/6*h)+(pi/360*m)));Sleep(1000);ClearL(L);MoveL(&L, sin(pi/30*a+(pi/30*s)), cos(pi/30*a+(pi/30*s))); //秒针的移动setcolor(RGB(255, 240, 245));line(240, 240, 240+150*sin(pi/1800*(a+s)+(pi/30*m)), 240-150*cos(pi/1800*(a+s)+(pi/30*m)));setcolor(RGB(255, 240, 245));line(240, 240, 240+130*sin(pi/108000*a+(pi/6*h)+(pi/360*m)), 240-130*cos(pi/108000*a+(pi/6*h)+(pi/360*m)));} //表针的移动getch();closegraph(); }。
例题18-5程序代码(1)选项字设置程序onchip.asm(可参阅附录E)OPT CSEG AT 0080H ; 地址定位在0080H单元OPTION: DB 00H ; 0080H定义为00H,不使用看门狗定时器,可由软件停止内部低速振荡器DB 00H ; 0081H定义为00H,选择1.59 V POC模式DB 00H ; 0082H为保留区域DB 00H ; 0083H为保留区域DB 03H ; 0084H定义为03H,允许片上调试,END(2)C语言程序#pragma sfr //使用特殊功能寄存器#pragma access //使用绝对地址指令#pragma EI //使用开中断和关中断功能#pragma DI#pragma interrupt INTKR inter RB1 //定义按键中断inter#pragma interrupt INTRTC half_sec_INTERRUPT//使用INTRTC中断功能,命名中断为half_sec_INTERRUPTvoid freshddisplaybuffer(); //显示缓冲区刷新函数void play4bit(); //显示函数void d_c_inter(); //切换函数void set_inter(); //调时函数void set_hour(); //闹钟时显示函数void set_minute(); //闹钟分显示函数void hour_inter(); //闹钟调时函数void minute_inter(); //闹钟调分函数void delay(); //延时函数void noise(); //闹钟响铃函数unsigned int half_second=0,second=0; //初始化使0.5秒单元=0,秒单元=0unsigned int minute=0,hour=0; //初始化使分单元=0,小时单元=0unsigned int day=1,month=1; //初始化使日单元=1,月单元=1unsigned int year=2001; //初始化使年单元=2001unsigned int hour1=0; //初始化闹钟时单元=0unsigned int minute1=0; //初始化闹钟分单元=0unsigned int temp; //临时变量unsigned intnumbercode[10]={0x070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070b};//数字"0"~"9"的显示码unsigned char i=0;/*显示转换标志,i=0显示年,i=1显示月,i=2显示月和日,i=3显示时,i=4显示时和分,i=5显示分和秒*/unsigned char j=0; //定义INTRTC中断标志变量junsigned char KEY=0; //定义全局变量KEYunsigned int buffyear[4]; //年的数码显示缓存区unsigned int buffm[4]; //月的数码显示缓存区unsigned int buffmd[4]; //月和日的数码显示缓存区unsigned int buffh[4]; //时的数码显示缓存区unsigned int buffhm[4]; //时和分的数码显示缓存区unsigned int buffms[4]; //分和秒的数码显示缓存区unsigned int buffhm1[4]; //闹钟的时和分数码显示缓冲区//--------------------------------------------------------------------计算当前月中天数的函数unsigned int m_days(unsigned int mmonth){unsigned int days;if ( (mmonth==4)||(mmonth==6)||(mmonth==9)||(mmonth==11))days=30; //4,6,9,11月为30天else if (mmonth==2){if ((year%4==0 && year %100!=0)||(year%400==0))days=29; //闰年2月为29天elsedays=28; //平年2月为28天}elsedays=31; //1,3,5,7,8,10,12月为31天return (days);}//-------------------------------------------------------------------显示函数void play4bit(){unsigned int dp=0; // dp为显示位数计数unsigned int b[4]; //显示输出缓存区unsigned int LCD_addr; //定义LCD地址LCD_addr=0xFA46; //初始化LCD地址为0xFA46while(dp<4) //4个LED显示器依次显示一遍{switch(i){case 0:b[dp]=buffyear[dp];break; //若显示转换标志为0,显示年case 1:b[dp]=buffm[dp];break; //若显示转换标志为1,显示月case 2:b[dp]=buffmd[dp];break; //若显示转换标志为2,显示月和日case 3:b[dp]=buffh[dp];break; //若显示转换标志为3,显示时case 4:b[dp]=buffhm[dp];break; //若显示转换标志为4,显示时和分case 5:b[dp]=buffms[dp];break; //若显示转换标志为5,显示分和秒 }pokew (LCD_addr,b[dp]); //显示器位控制码送位控制存储单元delay(); //延时函数pokew(LCD_addr,0x0000); //关闭显示LCD_addr=LCD_addr-2;dp++; //显示位计数加1}}//--------------------------------------------------------------------闹钟时显示函数void set_hour(){unsigned int dp=2;unsigned int a[4];unsigned int LCD_addr;LCD_addr=0xFA42;buffhm1[3]=numbercode[hour1/10]; //时的显示码放入时和分的数码显示缓存buffhm1[2]=numbercode[hour1%10];buffhm1[2] |= 0x0800; //在时的个位后显示一个点“•”while(dp<4) //4个LED显示器依次显示一遍{a[dp]=buffhm1[dp];pokew (LCD_addr,a[dp]); //显示器位控制码送位控制存储单元delay(); //延时函数pokew(LCD_addr,0x0000);LCD_addr=LCD_addr-2;dp++; //显示计数器加1}}//--------------------------------------------------------------------闹钟秒显示函数void set_minute (){unsigned int dp=0;unsigned int b[4];unsigned int LCD_addr;LCD_addr=0xFA46;buffhm1[1]=numbercode[minute1/10]; //时的显示码放入时和分的数码显示缓存buffhm1[0]=numbercode[minute1%10];while(dp<2) //4个LED显示器依次显示一遍{b[dp]=buffhm1[dp];pokew (LCD_addr,b[dp]); //显示器位控制码送位控制存储单元delay(); //延时函数pokew(LCD_addr,0x0000);LCD_addr=LCD_addr-2;dp++; //显示计数器加1}}//--------------------------------------------------------------------闹钟调时函数void hour_inter(){if(hour1<23)hour1++;else hour1=0;}//---------------------------------------------------------------------闹钟调分函数void minute_inter(){if(minute1<59)minute1++;else minute1=0;}//--------------------------------------------------------------------时间函数void time(){if (j != 0) //0.5秒标志到了吗?{j = 0;half_second++;if (half_second%2==0) //判断到了1秒吗?{second++;if (second>=60) //秒大于60时,分加1{second=0;minute++;if (minute>=60) //分大于60时,时加1{minute=0;hour++;if (hour>=24) //时大于24时,天加1 {hour=0;day++;temp=m_days(month); //判断该月是多少天if (day>=temp) //该月最后一天到时,月加1 {day=1;month++;if (month>=13) //月大于12后年加1{month=1; year++;}}}}}}}}//------------------------------------------------------------------------按键中断处理函数void inter(){DI(); //关中断switch(P4 & 0x3F) //判断那个按键按下{case 0x3e:KEY=1; //按键key1按下break;case 0x3d:KEY=2; //按键key2按下break;case 0x3b:KEY=3; //按键key3按下break;case 0x37:KEY=4; //按键key4按下break;case 0x2f:KEY=5; //按键key5按下break;case 0x1f:KEY=6; //按键key6按下break;default:break;}EI(); //开中断}//----------------------------------------------------------------------切换时间函数void d_c_inter(){DI(); //关中断if(i<5){i++;} //显示切换标志i小于5,i加1else{i=0;} //显示切换标志i等于5,i清“0”EI(); //开中断}//------------------------------------------------------------------------调整时间函数void set_inter(){unsigned int x,y;DI(); //关中断x=year%1000; //取年的个位数到变量x中y=year%1000; //取年的个位数到变量y中switch(i){case 0:{if(x<9) x++; //如果年的个位数小于9,年加1else x=0; //如果年的个位数等于9,年的个位清“0”year=(year-y)+x; break;}case 1:{if(month<12) month++; //月计数值小于12,月值加1else month=1; break; //月计数值等于12,月值清“0”}case 2:{temp=m_days(month); //判断该月是多少天if(day>=temp) day=1; //日计数值是该月最后一天时,day=1 else day++; //日计数值不是该月最后一天时,daybreak;}case 3:{if(hour<23) hour++; //时计数值小于23,时值加1else hour=0; //时计数值等于23,时值清“0”break;}case 4:{if(minute<59) minute++; //分计数值小于59,分值加1else minute=0; //分计数值等于59,分值清“0”break;}case 5:{if(second<59) second++; //秒计数值小于59,秒值加1else second=0; //秒计数值等于59,秒值清“0”break;}}EI(); //开中断}//---------------------------------------------------------------------闹钟响铃函数void noise(){if(hour1==hour&&minute1==minute&&P3.4==1){CKS=0X80; //打开蜂鸣器输出,输出频率为7.81kHz的音频delay(); //延时BZOE=0; //关闭蜂鸣器}}//-------------------------------------------------------------------延时函数void delay(){int i;for(i=0;i<=100;i++);}//---------------------------------------------------------------主函数void main(){PCC =0x00; // CPU的时钟选择(5.0MHz)PFALL=0x0F; //所有接LCD引脚指定为LCD引脚LCDC0=0x45; //确定LCD的显示频率LCDMD=0x10; // LCD电源设置为1/5VDDLCDM=0xC0; //LCD显示开IPM4 = 0x3F; //P4的6个端口设置输入模式PU4 = 0x3F; //接通上拉电阻KRM = 0x3F; //允许6个按键中断KRMK = 0;P3.4 = 0; //LED灯初始化为灭PM3.4=0; //P3.3和P3.4端口设置为输出模式P3.3 = 0;PM3.3=0;RTCMK=0; //允许产生中断OSCSELS = 1; //启动副系统时钟RTCCL = 0; //实时计数器的输入时钟为副系统时钟RTCC0 = 0x09; //停止计数器操作,禁止RTC1HZ 引脚输出,//RTCCL 引脚输出,选择24小时系统,选择//0.5秒一次固定周期中断RTCE = 1; //启动计数器工作EI(); //开中断while(1){switch(KEY){case 0: //如果没有按键{time(); //调用时间函数noise(); //调用闹钟响铃函数freshddisplaybuffer(); //调用显示缓冲区刷新函数play4bit(); //调用显示函数break;}case 1: //按键key1被按下{time(); //调用时间函数d_c_inter(); //调用切换时间函数freshddisplaybuffer(); //调用显示缓冲区刷新函数play4bit(); //调用显示函数KEY=0;break;}case 2:{time();set_hour(); //调用闹钟时显示函数set_minute(); //调用闹钟分显示函数KEY=7;break;}case 3: //按键key3被按下{time(); //调用时间函数set_inter(); //调用时间调整函数freshddisplaybuffer(); //调用显示缓冲区刷新函数play4bit(); //调用显示函数KEY=0;break;}case 4:{time(); //调用时间函数P3.4=~P3.4; //切换LED灯亮灭情况KEY=0;break;}case 5:{time();//调用时间函数hour_inter(); //调用闹钟调时函数set_hour(); //调用闹钟显示函数KEY=7;break;}case 6:{time(); //调用时间函数minute_inter(); //调用闹钟调分函数set_minute(); //调用闹钟显示函数KEY=7;break;}case 7:{time(); //调用时间函数noise(); //调用闹钟响铃函数set_hour(); //调用闹钟时显示函数set_minute(); //调用闹钟分显示函数break;}}}}//-------------------------------------------------------------------实时计数器(0.5s)中断处理函数void half_sec_INTERRUPT(){DI();j=1; //每隔0.5s j的值赋值1EI();}//---------------------------------------------------------------------显示缓冲区刷新函数void freshddisplaybuffer(void){buffyear[3]=numbercode[(year/100)/10]; //年的显示码放入年的数码显示缓存区buffyear[2]=numbercode[(year/100)%10];buffyear[1]=numbercode[(year%100)/10];buffyear[0]=numbercode[(year%100)%10];buffm[3]=0x070d; //月的显示码放入年的数码显示缓存区buffm[2]=0x070d;buffm[1]=numbercode[month/10];buffm[0]=numbercode[month%10];buffmd[3]=numbercode[month/10]; //月和日的显示码放入年的数码显示缓存区buffmd[2]=numbercode[month%10];buffmd[2] |= 0x0800; //在月的个位后显示一个点“•”buffmd[1]=numbercode[day/10]; //日的显示码放入月和日的数码显示缓存buffmd[0]=numbercode[day%10];buffh[3]=0x070d; //时的显示码放入月和日的数码显示缓存buffh[2]=0x070d;buffh[1]=numbercode[hour/10];buffh[0]=numbercode[hour%10];buffhm[3]=numbercode[hour/10]; //时的显示码放入时的数码显示缓存区buffhm[2]=numbercode[hour%10];buffhm[2] |= 0x0800; //时的显示码放入时和分的数码显示缓存buffhm[1]=numbercode[minute/10]; //在时的个位后显示一个点“•”buffhm[0]=numbercode[minute%10];buffms[3]=numbercode[minute/10]; //分的显示码放入时和分的数码显示缓存区buffms[2]=numbercode[minute%10];buffms[2] |= 0x0800; //在时的个位后显示一个点“•”buffms[1]=numbercode[second/10]; //秒的显示码放入分和秒的数码显示缓存区buffms[0]=numbercode[second%10];}。
2.源程序ORG 0000HLJMP STARTORG 000BHLJMP TIME;********初始化*********START: MOV SP, #50HMOV 20H,#00H ;定义秒MOV 21H,#00H ;定义分MOV 22H,#00H ;定义时MOV 23H,#01H ;定义闹钟分钟MOV 24H,#01H ;定义闹钟小时MOV 25H,#00HMOV 26H,#01HMOV 30H,#00H ;定义秒BCDMOV 31H,#00HMOV 32H,#00H ;定义分BCDMOV 33H,#00HMOV 34H,#00H ;定义小时BCDMOV 35H,#00HMOV 36H,#01HMOV 37H,#00HMOV 38H,#01HMOV 39H,#00HMOV 50H,#00H ;按键次数MOV TMOD,#01H ;16位计数器MOV TH0, #03CH ;赋初值MOV TL0, #0B0HMOV IE, #87H ;中断允许SETB TR0 ;启动T0MOV R2,#14HMOV P2,#0FFH;*********主程序**********MAIN: JB P1.4,GBLCALL TIMEPRO ;调用闹钟判断GB: LCALL DISPLAY1 ;调用时间显示JB P1.3,M1 ;P1.3=1时转移 S4没有按下 LCALL SETTIME ;调用SETTIME调时子程序LJMP MAINM1: JB P1.2,M2 ;P1 g.2=1时转移S3LCALL SETATIME ;调用SETATIME子程序LJMP MAINM2: JB P1.0,M4 ;P1.0=1时转移 S1LCALL LOOKATIME ;调用LOOKATIME显示闹钟子程序M4: LJMP MAIN;*********延时子程序********DELAY: MOV R4,#030HDL00: MOV R5,#0FFHDL11: MOV R6,#9HDL12: DJNZ R6,DL12DJNZ R5,DL11DJNZ R4,DL00RET;***********时间调整*******SETTIME: ;设置时间L0: LCALL DISPLAY1MM1: JB P1.3,L1 ;P1.3=1时转移MOV C,P1.3JC MM1LCALL DELAY1 ;延时JC MM1MSTOP1: MOV C,P1.3 ;P1.3为0时转移JNC MSTOP1LCALL DELAY1 ;延时MOV A,50HINC 50HCJNE A,#00H,HJ1LJMP L0HJ1: MOV C,P1.3JNC MSTOP1INC 22H ;小时自加一MOV A,22HCJNE A,#18H,GO12 ;小时计数循环MOV 22H,#00H ;复位MOV 34H,#00HMOV 35H,#00HLJMP L0L1: JB P1.1,L2 ;P1.1=1时转移MOV C,P1.1JC L1LCALL DELAY1 ;延时JC L1MSTOP2: MOV C,P1.1 ;P1.1=0时转移JNC MSTOP2LCALL DELAY1 ;延时MOV C,P1.1JNC MSTOP2INC 21H ;分钟加一MOV A,21HCJNE A,#3CH,GO11 ;分钟计数循环MOV 21H,#00H ; 复位MOV 32H,#00HMOV 33H,#00HLJMP L0GO11: MOV B,#0AHDIV ABMOV 32H,B ; 将A的低4位存入32单元 MOV 33H,A ; 将A的高4位存入33单元 LJMP L0GO12: MOV B,#0AHDIV ABMOV 34H,B ;将A的低4位存入34单元MOV 35H,A ; 将A的高4位存入35单元 LJMP L0L2: JB P1.0,L0 ; P1.0=1时转移MOV C,P1.0JC L2LCALL DELAY1 ;延时MOV C,P1.0JC L2STOP1: MOV C,P1.0 ; P1.0=0时转移JNC STOP1LCALL DELAY1 ;延时MOV C,P1.0JNC STOP1MOV 50H,#00HLJMP MAIN;*******设置闹钟*******SETATIME:LCALL DISPLAY2 ; 调用DISPLAY2显示闹钟N0: LCALL DISPLAY2MM2: JB P1.2,N1 ;P1.2=1时转移MOV C,P1.2JC MM2LCALL DELAY1 ; 延时JC MM2MSTOP3: MOV C,P1.2 ; P1.2=0时转移JNC MSTOP3LCALL DELAY1 ; 延时MOV A,50HINC 50HCJNE A,#00H,HJ2HJ2: MOV C,P1.2JNC MSTOP3INC 24H ;小时加一MOV A,24HCJNE A,#24,GO22 ;小时计数循环MOV 24H,#00H ;复位MOV 38H,#00HMOV 39H,#00HLJMP N0N1: JB P1.1,N2 ;P1.1=1时转移MOV C,P1.1JC N1LCALL DELAY1 ;延时JC N1MSTOP4: MOV C,P1.1 ;P1.1=0时转移JNC MSTOP4LCALL DELAY1 ;延时MOV C,P1.1JNC MSTOP4INC 23H ;分钟加一MOV A,23HCJNE A,#60,GO21 ;分钟计数循环MOV 23H,#00H ;复位MOV 36H,#00HMOV 37H,#00HLJMP N0GO21: MOV B,#0AHDIV ABMOV 36H,B ;将A的低4位存入36单元 MOV 37H,A ;将A的高4位存入37单元 LJMP N0GO22: MOV B,#0AHDIV ABMOV 38H,B ;将A的低4位存入38单元 MOV 39H,A ;将A的高4位存入39单元 LJMP N0N2: JB P1.0 ,N0 ;P1.0=1时转移MOV C,P1.0JC N2LCALL DELAY1 ;延时MOV C,P1.0JC N2STOP2: MOV C,P1.0LCALL DELAY1MOV C,P1.0JNC STOP2MOV 50H,#00HLJMP MAIN;*******闹钟判断*****************TIMEPRO: MOV A,21HMOV B,23HCJNE A,B,BK ;判断定时闹钟的分钟 MOV A,22HMOV B,24HCJNE A,B,BK ;判断定时闹钟的小时 SETB 25H.0MOV C,25H.0LCALL TIMEOUT ;调用TIMEOUTBK:RET;**************喇叭报警***************** TIMEOUT:X1: LCALL BZ ;调用喇叭响应程序CLR 25H.0 ;调用喇叭响应程序结束 LCALL DELAY ;延时CLR 25H.0LJMP DISPLAY1BZ:MOV C,25H.1MOV P1.6,CCLR P1.7MOV R7,#0FFH ;喇叭响应时间T2: MOV R6,#0FFHT3: DJNZ R6,T3DJNZ R7,T2SETB P1.7RET;*************显示闹钟时间************ LOOKATIME:LCALL DISPLAY2MM: JNB P1.0,LOOKATIMELCALL DELAY1LJMP MAINDELAY1: MOV R4,#14H ;时间延时DL001: MOV R5,#0FFHDL111: DJNZ R5,DL111DJNZ R4,DL001RET;***********定时**************TIME: PUSH ACC ;保护现场PUSH PSWMOV TH0,#03CH ;初值MOV TL0,#0B0HDJNZ R2,RET0MOV R2,#14HMOV A,20HCPL 25H.1CLR CINC A ;秒自加一CJNE A,#3CH,GO1 ;秒计数循环MOV 20H,#0 ;复位MOV 30H,#0MOV 31H,#0MOV A,21HINC A ;分钟自加一CJNE A,#3CH,GO2 ;分钟计数循环MOV 21H,#0H ;复位MOV 32H,#0MOV 33H,#0MOV A,22HINC A ;小时自加一CJNE A,#18H,GO3 ;小时计数循环MOV 22H,#00H ;复位MOV 34H,#0MOV 35H,#0AJMP RET0GO1: MOV 20H,AMOV B,#0AHDIV ABMOV 31H,A ;将A的低4位存入31单元 MOV 30H,B ;将A的高4位存入30单元 AJMP RET0GO2: MOV 21H,AMOV B,#0AHDIV ABMOV 33H,A ;将A的低4位存入33单元 MOV 32H,B ;将A的高4位存入32单元AJMP RET0GO3: MOV 22H,AMOV B,#0AHDIV ABMOV 35H,A ;将A的低4位存入35单元 MOV 34H,B ;将A的高4位存入34单元AJMP RET0RET0: POP PSW ;恢复现场POP ACCRETI;********显示子程序**********DISPLAY1: MOV R0,#30HMOV R3,#0FEHMOV A,R3PLAY1: MOV P2,AMOV A,@R0 ;取要显示的数据MOV DPTR,#DSEG1 ;指向字形段码首地址 MOVC A,@A+DPTRCJNE R0,#34H,PAORL A,#80HPA:CJNE R0,#32H,PBORL A,#80HPB:CPL A ;查表取字形段码MOV P0,A ;指向P0口LCALL DL1MOV P2,#0FFHMOV A,R3 ;判断是否显示到最低位 RL A ;左移一位JNB ACC.6,LD1INC R0 ;缓冲器地址加一MOV R3,ALJMP PLAY1LD1: RETDISPLAY2: PUSH ACC ;保护现场PUSH PSWMOV R0,#36HMOV R3,#0FBHMOV A,R3PLAY2: MOV P2,AMOV A,@R0 ;取要显示的数据MOV DPTR,#DSEG1 ;指向字形段码首地址MOVC A,@A+DPTRCJNE R0,#38H,PPORL A,#80HPP:CPL A ;查表取字形段码MOV P0,A ;指向P0口LCALL DL1 ;调用DL1MOV P2,#0FFHMOV A,R3 ;判断是否显示到最低位RL A ;左移一位JNB ACC.6,LD2INC R0 ;缓冲器地址加一 MOV R3,ALJMP PLAY2 ;调用PLAY2 LD2: POP PSWPOP ACC ;恢复现场RET;******DELAY*******DL1: MOV R7,#20HDL: MOV R6,#20HDL6: DJNZ R6,$DJNZ R7,DLRETDSEG1: DB 3FH,06H,5BH,4FH,66H ;七段码表DB 6DH,7DH,07H,7FH,6FH。
module top_clock(Alarm,Hour,Minute,Second,CP,nCR,EN,Adj_Min,Adj_Hour,Alarm_EN,Alarm_Hour,Alarm_Min);input [7:0] Alarm_Hour,Alarm_Min;input CP,nCR,EN,Adj_Min,Adj_Hour,Alarm_EN;output [7:0] Hour,Minute,Second;output Alarm; //定义输入输出端口wire [7:0]Hour,Minute,Second;wire Alarm; //定义变量数据类型supply1 Vdd;wire MinL_EN,MinH_EN,Hour_EN;counter10 U1(Second[3:0],nCR,EN,CP); //秒计数器个位counter6 U2(Second[7:4],nCR,(Second[3:0]==4'h9),CP); //秒计数器十位assign MinL_EN=Adj_Min? Vdd:(Second==8'h59); //产生分钟计数器使能端信号,Adj_Min=0正常计时,1校正分钟assign MinH_EN=(Adj_Min && (Minute[3:0]==4'h9))||(Minute[3:0]==4'h9)&&(Second==8'h59);counter10 U3(Minute[3:0],nCR,MinL_EN,CP); //分计数器个位counter6 U4(Minute[7:4],nCR,MinH_EN,CP); //分计数器十位assign Hour_EN=Adj_Hour? Vdd:((Minute==8'h59)&&(Second==8'h59)); //产生小时计数器使能端信号counter24 U5(Hour[7:4],Hour[3:0],nCR,Hour_EN,CP); //小时计数器计时alarm_clock U6(Alarm,Alarm_Hour,Alarm_Min,Hour,Minute,Second,Alarm_EN,CP); //闹钟功能调用endmodulemodule counter6(Q,nCR,EN,CP); //六进制计数器input CP,nCR,EN;output [3:0] Q;reg [3:0] Q; //定义输入输出端口always @(posedge CP or negedge nCR)beginif(~nCR) Q<=4'b0000; //清零else if(~EN) Q<=Q; //暂停,低电平有效else if(Q==4'b0101) Q<=4'b0000; //满值,返零else Q<=Q+1'b1; //正常计数endendmodulemodule counter10(Q,nCR,EN,CP); //十进制计数器input CP,nCR,EN;output [3:0] Q;reg [3:0] Q;always @(posedge CP or negedge nCR)beginif(~nCR) Q<=4'b0000;else if(~EN) Q<=Q;else if(Q==4'b1001) Q<=4'b0000;else Q<=Q+1'b1;endendmodulemodule counter24(CntH,CntL,nCR,EN,CP); //二十四进制计数器input CP,nCR,EN;output[3:0] CntH,CntL;reg [3:0] CntH,CntL;reg CO;always @ (posedge CP or negedge nCR)begin if(~nCR) {CntH,CntL}<=8'h00;else if(~EN) {CntH,CntL}<={CntH,CntL}; //清零和暂停else if((CntH>2)||(CntL>9)||((CntH==2)&&(CntL>=3))) {CntH,CntL}<=8'h00; //满值清零else if((CntH==2)&&(CntL<3)) //小时数小于23begin CntH<=CntH;CntL<=CntL+1'b1;end //小时数介于20~23,高位不变低位加一else if(CntL==9)begin CntH<=CntH+1'b1;CntL<=4'b0000;end //低位等于9,低位返零高位加一elsebegin CntH<=CntH;CntL<=CntL+1'b1;end //其它情况,高位不变低位加一endendmodulemodule alarm_clock(Alarm,Alarm_Hour,Alarm_Min,Hour,Minute,Second,Alarm_EN,CP); //闹钟功能实现模块input CP,Alarm_EN;input [7:0] Alarm_Hour,Alarm_Min,Hour,Minute,Second;output Alarm;reg Alarm; //定义输入输出端口always @( posedge CP or negedge Alarm_EN)beginif(~Alarm_EN) Alarm<=1'b0; //检测是否开启闹钟功能else if((Alarm_Hour==Hour)&&(Alarm_Min==Minute)&&(Second==8'h00)) Alarm<=1'b1; //闹钟时间到,高电平elseAlarm<=1'b0;endendmodule。
钟表源程序代码钟表源程序代码采用了easyx图形库作者:转角梦覃飞絮#include#include#include#include#include#define PI 3.1415926//自定义函数声明void draw_biaozhen(int x,int y,int second,int minute,int hour);//画表针函数void numbertime(int year,int month,int day,char week,int second,int minute,int hour);//显示数字时间void draw_biaopan(int x,int y);//画表盘void huaxian(); //画心形线void main(){initgraph(640,480);srand((unsigned)time(NULL));int x=320,y=240; //设定表盘圆心位置SYSTEMTIME time; //定义变量保存当前时间//画心形线outtextxy(20,40,"稍后进入钟表界面...");huaxian();cleardevice();setwritemode(R2_XORPEN); //设置XOR绘图模式//画表盘draw_biaopan( x, y);while(!kbhit()){ //有用户键就退出GetLocalTime(&time);numbertime(time.wYear ,time.wMonth,time.wDay ,time.wDa yOfWeek ,time.wSecond ,time. wMinute,time.wHour);//画指针draw_biaozhen(x,y,time.wSecond ,time.wMinute ,time.wHou r );Sleep(1000);//擦表针draw_biaozhen(x,y,time.wSecond ,time.wMinute ,time.wHou r );//实现随机色文字setcolor(RGB(rand()%255,rand()%255,rand()%255));outtextxy(285,320," 笨蛋");setfont(80,0,"宋体");outtextxy(40,80,"开");outtextxy(40,330,"心");outtextxy(520,80,"快");outtextxy(520,330,"乐");setfont(0,0,"宋体");}closegraph();}//画表针函数void draw_biaozhen(int x,int y,int second,int minute,int hour) {double a_sec,a_min,a_hour; //定义秒分时表针的弧度int x_sec,y_sec,x_min,y_min,x_hour,y_hour; //定义秒分时表针末端位置//计算表针弧度a_sec=second*2*PI/60;a_min=minute*2*PI/60+a_sec/60;a_hour=hour*2*PI/12+a_min/12;//计算表针末端位置x_sec=(int)(x+120*sin(a_sec));y_sec=(int)(y-120*cos(a_sec));x_min=(int)(x+80*sin(a_min));y_min=(int)(y-80*cos(a_min));x_hour=(int)(x+60*sin(a_hour));y_hour=(int)(y-60*cos(a_hour));//画秒针setlinestyle(PS_SOLID,NULL,1);setcolor(YELLOW);line(x,y,x_sec,y_sec);//画分针setlinestyle(PS_SOLID,NULL,3);setcolor(LIGHTGRAY);line(x,y,x_min,y_min);//画分针setlinestyle(PS_SOLID,NULL,5);setcolor(BLUE);line(x,y,x_hour,y_hour);}//显示数字时间函数void numbertime(int year,int month,int day,char week,int second,int minute,int hour){char str[50];//用来存储时间字符sprintf(str,"当前时间:%d年%d月%d日星期%d %d :%d :%d ",year,month,day,week,hour,minute,second);setcolor(BLUE);outtextxy(20,20,str);outtextxy(20,40,"按任意键退出程序..."); }// 画表盘函数void draw_biaopan(int x,int y){int x1,y1,x2,y2,x3,y3,x4,y4,r=150; setcolor(RED);circle(x,y,38);circle(x,y,2);setlinestyle(PS_SOLID,NULL,2); circle(x,y,150);for(int i=0;i<6;i++) //12个刻度{setcolor(YELLOW);x1=x+(int)(r*cos(2*PI*i/12));y1=y-(int)(r*sin(2*PI*i/12));x2=x+(int)(0.94*r*cos(2*PI*i/12));y2=y-(int)(0.94*r*sin(2*PI*i/12));x3=x+(int)(r*cos(2*PI*i/12+PI));y3=y-(int)(r*sin(2*PI*i/12+PI));x4=x+(int)(0.94*r*cos(2*PI*i/12+PI)); y4=y-(int)(0.94*r*sin(2*PI*i/12+PI)); line(x1,y1,x2,y2);line(x3,y3,x4,y4);}for(i=0;i<30;i++) //其他的小刻度{setcolor(RED);x1=x+(int)(r*cos(2*PI*i/60));y1=y-(int)(r*sin(2*PI*i/60));x2=x+(int)(0.97*r*cos(2*PI*i/60));y2=y-(int)(0.97*r*sin(2*PI*i/60));x3=x+(int)(r*cos(2*PI*i/60+PI));y3=y-(int)(r*sin(2*PI*i/60+PI));x4=x+(int)(0.97*r*cos(2*PI*i/60+PI));y4=y-(int)(0.97*r*sin(2*PI*i/60+PI));line(x1,y1,x2,y2);line(x3,y3,x4,y4);}setcolor(LIGHTRED);outtextxy(316,368,"6");outtextxy(312,98,"12");outtextxy(185,232,"9");outtextxy(450,232,"3");}//画心型线函数void huaxian(){double x1, y1, r1;while(!MouseHit()){for(int k=0;k<=3;k++){setcolor(RGB(rand()%255, rand()%255, rand()%255)); for(int i=0; i<90; i++) {for (int j=0; j<90; j++) {r1 = PI/45 * i * (1 - sin(PI/45 * j)) * 18;x1 = r1 * cos(PI/45 * j) * sin(PI/45 * i) + 320;y1 = -r1 * sin(PI/45 * j) + 120;// 画圆fillcircle((int) x1, (int) y1, 1);}Sleep(30);}// 画完后暂停1秒Sleep(1000);}} }。
#pragma comment(lib, "glut32.lib")#pragma comment(lib, "glu32.lib")#pragma comment(lib, "opengl32.lib")#include <GL/glut.h>#include<math.h>#define PI 3.14159GLfloat m_rotAngle=0.0;void Display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLineWidth(5);GLfloat i,angle;GLint circle_points = 100;GLint circle_point = 60;glBegin(GL_LINE_LOOP); //绘制闹钟的外圆for (i = 0; i < circle_points; i++) {angle = 2*PI*i/circle_points;glVertex2f(100*cos(angle), 100*sin(angle));}glEnd();glBegin(GL_LINE_LOOP); //绘制原点小圆for (i = 0; i < circle_points; i++) {angle = 2*PI*i/circle_points;glVertex2f(cos(angle), sin(angle));}glEnd();glMatrixMode(GL_MODELVIEW);glLoadIdentity();glPointSize(1);glBegin(GL_POINTS); //绘制秒针刻度for (i = 0; i < circle_point; i++) {angle = 2*PI*i/circle_point;glVertex2f(95*cos(angle), 95*sin(angle));}glEnd();glMatrixMode(GL_MODELVIEW);glLoadIdentity();glPointSize(5);glBegin(GL_POINTS); //绘制时针刻度for (i = 0; i < 12; i++) {angle = 2*PI*i/12;glVertex2f(95*cos(angle), 95*sin(angle));}glEnd();glMatrixMode(GL_MODELVIEW);glLoadIdentity();glColor3f(1.f,1.f,0.f);glPushMatrix(); //绘制秒针glRotatef(m_rotAngle, 0.0f, 0.0f, 1.0f);glTranslatef(0.0f, 10.0f, 0.0f);glBegin(GL_TRIANGLES);glVertex3f(0, -100, 0);glVertex3f(1, 0, 0);glVertex3f(-1, 0, 0);glEnd();glPopMatrix(); //绘制分针glColor3f(1.f,0.f,0.f);glPushMatrix();glRotatef(m_rotAngle/60, 0.0f, 0.0f, 1.0f);glTranslatef(0.0f, 10.0f, 0.0f);glBegin(GL_TRIANGLES);glVertex3f(0, -80, 0);glVertex3f(1, 0, 0);glVertex3f(-1, 0, 0);glEnd();glPopMatrix();glColor3f(0.f,0.f,1.f);glPushMatrix(); //绘制时针glRotatef(m_rotAngle/3600, 0.0f, 0.0f, 1.0f);glTranslatef(0.0f, 10.0f, 0.0f);glBegin(GL_TRIANGLES);glVertex3f(0, -60, 0);glVertex3f(1, 0, 0);glVertex3f(-1, 0, 0);glEnd();glPopMatrix();m_rotAngle += 6.0f;if( m_rotAngle > 216000.0f)m_rotAngle = 0.0f;glutSwapBuffers();}void Init(){glEnable(GL_DEPTH_TEST); //启用隐藏面移除glClearColor(0.0f, 0.0f, 0.0f, 1.0f );}void GLTimer(int value){glutPostRedisplay();glutTimerFunc(100, GLTimer, 1);}void Reshape(int w, int h){GLfloat nRange = 100.0f;if(h == 0)h = 1;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*2.0f, nRange*2.0f);elseglOrtho (-nRange*w/h, nRange*w/h, nRange, -nRange, -nRange*2.0f, nRange*2.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(800, 600);glutCreateWindow("时钟");glutReshapeFunc(Reshape);glutDisplayFunc(Display);glutTimerFunc(100, GLTimer, 1);Init();glutMainLoop();return 0;}。
// AlarmSetDlg.cpp : implementation file//#include "stdafx.h"#include "deskclock.h"#include "AlarmSetDlg.h"#include "BeepSetDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // AlarmSetDlg dialogAlarmSetDlg::AlarmSetDlg(CWnd* pParent /*=NULL*/): CDialog(AlarmSetDlg::IDD, pParent){//{{AFX_DATA_INIT(AlarmSetDlg)m_bSound = TRUE;m_bMusic = 0;m_strAlarmMusic = _T("");m_pickerTime = 0;//}}AFX_DATA_INITSYSTEMTIME time;GetLocalTime(&time);m_pickerTime = time;m_hour = time.wHour;m_minute = time.wMinute;m_second = time.wSecond;}void AlarmSetDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(AlarmSetDlg)DDX_Text(pDX, IDC_HO, m_hour);DDX_Text(pDX, IDC_MI, m_minute);DDX_Text(pDX, IDC_SE, m_second);DDX_Check(pDX, IDC_BMUSIC, m_bSound);DDX_Radio(pDX, IDC_MUSIC, m_bMusic);DDX_Text(pDX, IDC_PATHMUSIC, m_strAlarmMusic);DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER2, m_pickerTime);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(AlarmSetDlg, CDialog)//{{AFX_MSG_MAP(AlarmSetDlg)ON_BN_CLICKED(IDC_MUSIC, OnMusic)ON_BN_CLICKED(IDC_BEEP, OnBeep)ON_BN_CLICKED(IDC_BMUSIC, OnBmusic)ON_BN_CLICKED(IDC_SMUSIC, OnSelectMusic)ON_BN_CLICKED(IDC_SBEEP, OnSelectBeep)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// AlarmSetDlg message handlersBOOL AlarmSetDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization hereSetEnable();return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE }void AlarmSetDlg::SetEnable(){if(m_bSound){GetDlgItem(IDC_MUSIC)->EnableWindow(true);GetDlgItem(IDC_BEEP)->EnableWindow(true);if(!m_bMusic){GetDlgItem(IDC_PATHMUSIC)->EnableWindow(true);GetDlgItem(IDC_SMUSIC)->EnableWindow(true);GetDlgItem(IDC_SBEEP)->EnableWindow(false);}else{GetDlgItem(IDC_PATHMUSIC)->EnableWindow(false);GetDlgItem(IDC_SMUSIC)->EnableWindow(false);GetDlgItem(IDC_SBEEP)->EnableWindow(true);}}else{GetDlgItem(IDC_PATHMUSIC)->EnableWindow(false);GetDlgItem(IDC_SMUSIC)->EnableWindow(false);GetDlgItem(IDC_SBEEP)->EnableWindow(false);GetDlgItem(IDC_MUSIC)->EnableWindow(false);GetDlgItem(IDC_BEEP)->EnableWindow(false);}}void AlarmSetDlg::OnMusic(){// TODO: Add your control notification handler code hereUpdateData(true);SetEnable();}void AlarmSetDlg::OnBeep(){// TODO: Add your control notification handler code hereUpdateData(true);SetEnable();}void AlarmSetDlg::OnBmusic(){// TODO: Add your control notification handler code hereUpdateData(true);SetEnable();}void AlarmSetDlg::OnSelectMusic(){// TODO: Add your control notification handler code hereCFileDialog dlg(TRUE,"wave",NULL,NULL,"wave file(*.wav)|*.WAV",NULL);if (dlg.DoModal()==IDOK){m_strAlarmMusic = dlg.GetPathName();UpdateData(false);}}void AlarmSetDlg::OnSelectBeep(){// TODO: Add your control notification handler code hereBeepSetDlg dlg;dlg.m_typeBeep = m_typeBeep;if(dlg.DoModal() == IDOK){m_typeBeep = dlg.m_typeBeep;}}// BackSetDlg.cpp : implementation file//#include "stdafx.h"#include "deskclock.h"#include "BackSetDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // BackSetDlg dialogBackSetDlg::BackSetDlg(CWnd* pParent /*=NULL*/): CDialog(BackSetDlg::IDD, pParent){//{{AFX_DATA_INIT(BackSetDlg)m_bPicture = 0;m_strBk = _T("");m_bBkStre = -1;//}}AFX_DATA_INIT}void BackSetDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(BackSetDlg)DDX_Radio(pDX, IDC_COLOR, m_bPicture);DDX_Text(pDX, IDC_EDITPICTURE, m_strBk);DDX_Radio(pDX, IDC_CENTER, m_bBkStre);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(BackSetDlg, CDialog)//{{AFX_MSG_MAP(BackSetDlg)ON_BN_CLICKED(IDC_COLOR, OnColor)ON_BN_CLICKED(IDC_RADIO2, OnRadio2)ON_WM_PAINT()ON_BN_CLICKED(IDC_BKCOLOR, OnBkcolor)ON_BN_CLICKED(IDC_BKPICTURE, OnBkpicture)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// BackSetDlg message handlersBOOL BackSetDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization hereSetEnable();return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE }void BackSetDlg::SetEnable(){if(!m_bPicture){GetDlgItem(IDC_BKCOLOR)->EnableWindow(true);GetDlgItem(IDC_BKPICTURE)->EnableWindow(false);GetDlgItem(IDC_EDITPICTURE)->EnableWindow(false);GetDlgItem(IDC_STRE)->EnableWindow(false);GetDlgItem(IDC_CENTER)->EnableWindow(false);}else{GetDlgItem(IDC_BKCOLOR)->EnableWindow(false);GetDlgItem(IDC_BKPICTURE)->EnableWindow(true);GetDlgItem(IDC_EDITPICTURE)->EnableWindow(true);GetDlgItem(IDC_STRE)->EnableWindow(true);GetDlgItem(IDC_CENTER)->EnableWindow(true);}}void BackSetDlg::OnColor(){// TODO: Add your control notification handler code hereUpdateData(true);SetEnable();}void BackSetDlg::OnRadio2(){// TODO: Add your control notification handler code hereUpdateData(true);SetEnable();}void BackSetDlg::OnPaint(){CPaintDC dc(this); // device context for paintingCPen penBorderH(PS_SOLID,1,RGB(200,200,200));CPen *ppenOld = dc.SelectObject(&penBorderH);CBrush brPointH(m_colorBk);CBrush* pbrOld = dc.SelectObject(&brPointH);dc.Rectangle(70,105,130,135);}void BackSetDlg::OnBkcolor(){// TODO: Add your control notification handler code hereCColorDialog dlg;dlg.m_cc.Flags|=CC_RGBINIT ;dlg.m_cc.rgbResult=m_colorBk;if(IDOK==dlg.DoModal()){m_colorBk = dlg.m_cc.rgbResult;Invalidate();}}void BackSetDlg::OnBkpicture(){// TODO: Add your control notification handler code hereCFileDialog dlg(TRUE,"bmp",NULL,NULL,"bmp file(*.bmp)|*.BMP|",NULL);if (dlg.DoModal()==IDOK){m_strBk = dlg.GetPathName();UpdateData(false);}}// BeepSetDlg.cpp : implementation file//#include "stdafx.h"#include "deskclock.h"#include "BeepSetDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// BeepSetDlg dialogBeepSetDlg::BeepSetDlg(CWnd* pParent /*=NULL*/): CDialog(BeepSetDlg::IDD, pParent){//{{AFX_DATA_INIT(BeepSetDlg)m_typeBeep = -1;//}}AFX_DATA_INITm_times = 5;}void BeepSetDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(BeepSetDlg)DDX_Radio(pDX, IDC_XIAOJIUWO, m_typeBeep);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(BeepSetDlg, CDialog)//{{AFX_MSG_MAP(BeepSetDlg)ON_BN_CLICKED(IDC_XIAOJIUWO, OnXiaoJiuWo)ON_BN_CLICKED(IDC_UP, OnUp)ON_BN_CLICKED(IDC_DOWN, OnDown)ON_BN_CLICKED(IDC_C1, OnC1)ON_BN_CLICKED(IDC_D1, OnC2)ON_BN_CLICKED(IDC_E1, OnC3)ON_BN_CLICKED(IDC_F1, OnC4)ON_BN_CLICKED(IDC_G1, OnC5)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // BeepSetDlg message handlersvoid BeepSetDlg::OnXiaoJiuWo(){// TODO: Add your control notification handler code hereUpdateData(true);ClockBeep();}void BeepSetDlg::OnUp(){// TODO: Add your control notification handler code hereUpdateData(true);ClockBeep();}void BeepSetDlg::OnDown(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::OnC1(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::OnC2(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::OnC3(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::OnC4(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::OnC5(){// TODO: Add your control notification handler code here UpdateData(true);ClockBeep();}void BeepSetDlg::ClockBeep(){yf a[1000]={{z3,125},{z3,50},{z4,100},{z3,50},{z2,50}, //5 {z2,125},{z2,50},{z5,100},{z2,50},{z1,50}, //10{z1,125},{z1,50},{z6,100},{z5,100}, //14{z3,125},{z4,25},{z3,25},{z2,100},{z2,100}, //19{z3,125},{z3,50},{z4,100},{z5,50},{z3,50}, //24{z5,125},{z5,50},{g2,100},{z7,50},{g1,50}, //29{g1,200},{g1,50},{z7,50},{z6,50},{z7,50}, //34{g1,125},{z7,50},{g1,200}, //37{g1,50},{z7,50},{g1,50},{z7,50},{g1,100},{z3,50},{z5,50}, //44{z5,250},{z6,50},{z7,50}, //47{g1,50},{z7,50},{g1,50},{z7,50},{g1,100},{g2,100},{g3,100}, //54{g3,300},{z6,50},{z7,50}, //57{g1,50},{z7,50},{g1,50},{z7,50},{g1,100},{g3,100}, //63{z7,50},{z6,50},{z7,50},{z6,50},{z7,50},{z5,50},{z5,50},{g1,50}, //71 {g1,200},{g3,75},{g4,25},{g4,50},{g3,50}, //76{g2,200},{yaya,50},{z5,50},{g1,50},{g2,50}, //81{g3,50},{g1,50},{g1,50},{z5,50},{z5,100},{z5,50},{g3,50}, //88{g2,50},{g3,50},{g2,50},{g1,50},{z5,50},{z5,50},{z6,50},{z7,50}, //96 {g1,50},{z6,50},{z6,50},{z3,50},{z3,100},{yaya,50},{z7,50}, //103{g1,50},{z7,50},{g1,50},{g2,50},{z6,50},{z5,50},{z5,100}, //110{z6,100},{z5,50},{z6,50},{z7,100},{g3,50},{g4,50}, //116{g3,50},{g4,50},{g3,50},{g2,50},{g2,50},{g1,100},{z5,50}, //123{z5,50},{z4,50},{z4,50},{g1,50},{g1,50},{g3,50},{g3,50},{g1,50}, //131 {g2,200},{yaya,50},{z5,50},{g1,50},{g2,50}, //136{g3,50},{g1,50},{g1,50},{z5,50},{z5,100},{z5,50},{g3,50}, //143{g2,50},{g3,50},{g2,50},{g1,50},{z5,50},{z5,50},{z6,50},{z7,50}, //151 {g1,50},{z6,50},{z6,50},{z3,50},{z3,100},{z3,50},{z7,50}, //158{g1,50},{z7,50},{g1,50},{g2,50},{z6,50},{z5,50},{z5,100}, //165{z6,50},{z7,50},{g1,50},{g2,100},{g3,50},{g4,50}, //171{g3,50},{g4,50},{g2,50},{g1,50},{g2,50},{g1,50},{g1,100}, //178{g2,50},{g1,50},{g2,50},{z6,50},{g1,100},{g2,50},{g1,50}, //185{g1,400}, //186{g2,50},{g1,50},{g2,50},{z6,50},{z7,100},{z7,50},{g1,50}, //193{g1,400}, //194};int i = 0;switch(m_typeBeep){case 0:yf *atop;atop=a;while(m_times--){Beep(atop->s,atop->t*5);atop++;}break;case 1:for(i = 5 ; i < 5 + m_times; i++){Beep(i * 70,50);Sleep(200);}break;case 2:for(i = 5 + m_times ; i > 5; i--){Beep(i * 70,50);Sleep(200);}break;case 3:for(i = 0 ; i < m_times; i++){Beep(262,50);Sleep(200);}break;case 4:for(i = 0 ; i < m_times; i++){Beep(294,50);Sleep(200);}break;case 5:for(i = 0 ; i < m_times; i++){Beep(330,50);Sleep(200);}break;case 6:for(i = 0 ; i < m_times; i++){Beep(349,50);Sleep(200);}break;case 7:for(i = 0 ; i < m_times; i++){Beep(392,50);Sleep(200);}break;}}// ClockDate.cpp: implementation of the CClockDate class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "deskclock.h"#include "ClockDate.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif////////////////////////////////////////////////////////////////////// // Construction/Destruction//////////////////////////////////////////////////////////////////////CClockDate::CClockDate(){m_dColor = RGB(0,255,0);m_wColor = RGB(0,255,0);m_position = 0;m_inType = 1;m_outType = 1;m_bUp = false;}CClockDate::~CClockDate(){}void CClockDate::DrawDate(CDC *pDc, CRect rectClient, CTime oTime) {SetPosition(rectClient);UINT nYear,nMonth, nDay,nDayOfWeek;nYear = oTime.GetYear();nMonth = oTime.GetMonth();nDay = oTime.GetDay();CString strDate,strY ear,strMonth,strDay,strDayOfWeek;strYear.Format("%d",nYear);strMonth.Format("%d",nMonth);if (nMonth <10){strMonth.Format("0%d",nMonth);}strDay.Format("%d",nDay);if (nDay <10){strDay.Format("0%d",nDay);}strDate.Format("%s年%s月%s日",strYear,strMonth,strDay);strDayOfWeek = weekDay( oTime);int nBKMode = pDc->SetBkMode(TRANSPARENT);pDc->SetTextColor(m_dColor);pDc->TextOut(m_DX,m_DY,strDate);pDc->SetTextColor(m_wColor);pDc->TextOut(m_WX,m_WY,strDayOfWeek);pDc->SetBkMode(nBKMode);}void CClockDate::SetPosition(CRect rectClient){CPoint ptMiddle;ptMiddle.x = rectClient.Width()/2;ptMiddle.y = rectClient.Height()/2 - 15;int nRidius = min(ptMiddle.x,ptMiddle.y);if(!m_bUp){m_DX = ptMiddle.x + nRidius * 0.8 - 110;m_DY = ptMiddle.y + 20 ;m_WX = ptMiddle.x - nRidius * 0.8 + 35;m_WY = ptMiddle.y + 20 ;return;}if(m_position == 0){ // 内部switch(m_inType){case 0: // 上m_DX = ptMiddle.x - 46;m_DY = ptMiddle.y - nRidius * 0.7 + 50;m_WX = ptMiddle.x - 16;m_WY = ptMiddle.y - nRidius * 0.7 + 30;break;case 1: // 下m_DX = ptMiddle.x - 46;m_DY = ptMiddle.y + nRidius * 0.7 - 50;m_WX = ptMiddle.x - 16;m_WY = ptMiddle.y + nRidius * 0.7 - 30;break;case 2: // 左m_DX = ptMiddle.x - nRidius * 0.8 + 10;m_DY = ptMiddle.y + 50;m_WX = ptMiddle.x - nRidius * 0.8 + 45;m_WY = ptMiddle.y + 30 ;break;case 3: // 右m_DX = ptMiddle.x + nRidius * 0.8 - 110;m_DY = ptMiddle.y + 50 ;m_WX = ptMiddle.x + nRidius * 0.8 - 75;m_WY = ptMiddle.y + 30 ;break;}}else if(m_position == 1){ // 外部switch(m_outType){case 0: // 左上角m_DX = 10;m_DY = 60;m_WX = 40;m_WY = 40;break;case 1: // 右上角m_DX = rectClient.right - 112;m_DY = 60;m_WX = rectClient.right - 82;m_WY = 40;break;case 2: // 左下角m_DX = 10;m_DY = rectClient.bottom - 80 ;m_WX = 40;m_WY = rectClient.bottom - 60 ;break;case 3: // 右下角m_DX = rectClient.right - 112;m_DY = rectClient.bottom - 80 ;m_WX = rectClient.right - 82;m_WY = rectClient.bottom - 60 ;break;}}}CString CClockDate::weekDay(CTime oTime) {CString str;int nDayOfWeek = oTime.GetDayOfWeek();switch(nDayOfWeek ){case 1:str = "星期日";break;case 2:str = "星期一";break;case 3:str = "星期二";break;case 4:str = "星期三";break;case 5:str = "星期四";break;case 6:str = "星期五";break;case 7:str = "星期六";break;}return str;}// ClockHand.cpp: implementation of the CClockHand class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "deskClock.h"#include "ClockHand.h"#include "ClockScale.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif////////////////////////////////////////////////////////////////////// // Construction/Destruction//////////////////////////////////////////////////////////////////////CClockHand::CClockHand(){m_HbordColor = RGB(255,255,255);m_HColor = RGB(128,128,0);m_MbordColor = RGB(255,255,255);m_MColor = RGB(0,128,128);m_SbordColor = RGB(255,128,128);}CClockHand::~CClockHand(){}void CClockHand::DrawHand(CDC *pDC, int nValue,HANDTYPE typeHand,CPoint &ptMiddle,CTime oTime){m_ptMiddle.x = ptMiddle.x;m_ptMiddle.y = ptMiddle.y;m_nRidius = min(m_ptMiddle.x,m_ptMiddle.y);m_nPointWidth = (int)m_nRidius/20;CPoint ptHand[4];//得到指针的位置GetHandPoints(nValue,typeHand,ptHand, oTime);CBrush brHandH(m_HColor);CPen penHandH(PS_SOLID,1,m_HbordColor);CBrush brHandM(m_MColor);CPen penHandM(PS_SOLID,1,m_MbordColor);CPen penrgb(PS_SOLID,1,m_SbordColor);switch(typeHand){case HOUR_HAND://设置画刷、画笔pDC->SelectObject(&brHandH);pDC->SelectObject(&penHandH);//绘制一个四边形pDC->Polygon(ptHand,4);break;case MINUTE_HAND://设置画刷、画笔pDC->SelectObject(&brHandM);pDC->SelectObject(&penHandM);//绘制一个四边形pDC->Polygon(ptHand,4);break;case SECOND_HAND:pDC->SelectObject(&penrgb);pDC->MoveTo(ptHand[0]);pDC->LineTo(ptHand[1]);break;}}void CClockHand::GetHandPoints(int nValue, HANDTYPE typeHand, CPoint *pptHand,CTime oTime){UINT nMinute = oTime.GetMinute();CClockScale Scale;Scale.m_ptMiddle.x = m_ptMiddle.x;Scale.m_ptMiddle.y = m_ptMiddle.y;int nLength = 0;//根据指针的类型区分switch(typeHand){case HOUR_HAND://时针长为钟面半径的一半nLength = MulDiv(m_nRidius, 50, 100);//因为绘制时针按照分针进行,故需要一些变换nValue *= 5;nValue += (nMinute/12);break;case MINUTE_HAND:nLength = MulDiv(m_nRidius, 70, 100);break;case SECOND_HAND:nLength = MulDiv(m_nRidius, 80, 100);break;default:ASSERT(false);}//得到时针和分针外形的四个点if (typeHand == HOUR_HAND || typeHand == MINUTE_HAND){pptHand[0] = puterFacePoint(nValue+30,m_nPointWidth*2);pptHand[1] = puterFacePoint(nValue+15,m_nPointWidth);pptHand[2] = puterFacePoint(nValue,nLength);pptHand[3] = puterFacePoint(nValue-15,m_nPointWidth);}//得到秒针的两个端点elsepptHand[0] = m_ptMiddle;pptHand[1] = puterFacePoint(nValue,nLength);}}void CClockHand::SetHandColor(COLORREF hBColor, COLORREF hColor, COLORREF mBColor, COLORREF mColor, COLORREF sColor){m_HbordColor = hBColor;m_HColor = hColor;m_MbordColor = mBColor;m_MColor = mColor;m_SbordColor = sColor;}void CClockHand::GetHandColor(COLORREF &hBColor, COLORREF &hColor, COLORREF &mBColor, COLORREF &mColor, COLORREF &sColor){hBColor = m_HbordColor;hColor = m_HColor;mBColor = m_MbordColor;mColor = m_MColor;sColor = m_SbordColor;}// ClockNum.cpp: implementation of the CClockNum class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "deskClock.h"#include "ClockNum.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CClockNum::CClockNum(){m_position = 0;m_inType = 1;m_outType = 5;m_color = RGB(0,255,0);m_bgColor = false;}CClockNum::~CClockNum(){}void CClockNum::DrawTime(CDC *pDc, CRect rectClient,CTime oTime) {SetPosition(rectClient);UINT nHour,nMinute,nSecond;nHour = oTime.GetHour();nMinute = oTime.GetMinute();nSecond = oTime.GetSecond();CString strTime,strHour,strMinute,strSecond;strHour.Format("%d",nHour);if (nHour <10){strHour.Format("0%d",nHour);}strMinute.Format("%d",nMinute);if (nMinute <10){strMinute.Format("0%d",nMinute);}strSecond.Format("%d",nSecond);if (nSecond <10){strSecond.Format("0%d",nSecond);}strTime.Format("%s : %s : %s",strHour,strMinute,strSecond);pDc->SetTextColor(m_color);if(!m_bgColor){int nBKMode = pDc->SetBkMode(TRANSPARENT);pDc->TextOut(m_X,m_Y,strTime);pDc->SetBkMode(nBKMode);}else{pDc->TextOut(m_X,m_Y,strTime);}}void CClockNum::SetPosition(CRect rectClient){CPoint ptMiddle;ptMiddle.x = rectClient.Width()/2;ptMiddle.y = rectClient.Height()/2 - 15;int nRidius = min(ptMiddle.x,ptMiddle.y);if(m_position == 0){ // 内部switch(m_inType){case 0: // 上m_X = ptMiddle.x - 35;m_Y = ptMiddle.y - nRidius * 0.7;break;case 1: // 下m_X = ptMiddle.x - 35;m_Y = ptMiddle.y + nRidius * 0.7;break;case 2: // 左m_X = ptMiddle.x - nRidius * 0.8 + 25;m_Y = ptMiddle.y ;break;case 3: // 右m_X = ptMiddle.x + nRidius * 0.8 - 95;m_Y = ptMiddle.y ;break;}}else if(m_position == 1){ // 外部switch(m_outType){case 0: // 左上角m_X = 22;m_Y = 10;break;case 1: // 右上角m_X = rectClient.right - 100;m_Y = 10;break;case 2: // 左下角m_X = 22;m_Y = rectClient.bottom - 30 ;break;case 3: // 右下角m_X = rectClient.right - 96;m_Y = rectClient.bottom - 30;break;case 4: // 上侧居中m_X = ptMiddle.x - 33;m_Y = 2;break;case 5: // 下侧居中m_X = ptMiddle.x - 33;m_Y = rectClient.bottom - 30;break;case 6: // 左侧居中m_X = 10;m_Y = ptMiddle.y ;break;case 7: // 右侧居中m_X = rectClient.right - 86;m_Y = ptMiddle.y ;break;}}}// ClockScale.cpp: implementation of the CClockScale class.//////////////////////////////////////////////////////////////////////// #include "stdafx.h"#include "deskClock.h"#include "ClockScale.h"#include <math.h>#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif#define PI 3.1415926////////////////////////////////////////////////////////////////////// // Construction/Destruction//////////////////////////////////////////////////////////////////////CClockScale::CClockScale(){m_color = 0xFF0000;m_style = TYPE_RHOMBUS;m_logColor = 0;}CClockScale::~CClockScale(){}void CClockScale::DrawScale(CDC *pDc,CPoint &ptMiddle){//计算钟面的中心位置m_ptMiddle.x = ptMiddle.x;m_ptMiddle.y = ptMiddle.y;if (m_ptMiddle.y < 0){m_ptMiddle.y = 0;}//计算钟面的半径UINT nRidius = min(m_ptMiddle.x,m_ptMiddle.y);//计算两个刻度之间的距离m_nPointWidth = (int)nRidius/20;// 绘制LOGCBitmap maskbmp,logbmp;maskbmp.LoadBitmap(IDB_LOGMASK);logbmp.LoadBitmap(IDB_LOG);CDC MaskDC,memDC;MaskDC.CreateCompatibleDC(pDc);MaskDC.SelectObject(&maskbmp);memDC.CreateCompatibleDC(pDc);memDC.SelectObject(&logbmp);if(m_nPointWidth > 8){if(m_logColor == 0 ){pDc->BitBlt(m_ptMiddle.x - 25 ,ptMiddle.y - nRidius * 0.7,96,96,&MaskDC,0,0,SRCAND);pDc->BitBlt(m_ptMiddle.x - 25,ptMiddle.y - nRidius * 0.7,96,96,&memDC,0,0,MERGEPAINT);}else if(m_logColor == 1 ){pDc->BitBlt(m_ptMiddle.x - 25 ,ptMiddle.y - nRidius * 0.7,96,96,&MaskDC,0,0,MERGEPAINT);pDc->BitBlt(m_ptMiddle.x - 25,ptMiddle.y - nRidius * 0.7,96,96,&memDC,0,0,SRCAND);}}if (m_nPointWidth < 2){m_nPointWidth = 2;}//保存各个刻度点的位置CPoint ptFace;//设置刻度点的颜色CBrush brPoint(m_color);CBrush* pbrOld = pDc->SelectObject(&brPoint);//刻度所在的圆半径为钟面半径的90%int nFaceLength = MulDiv(nRidius,9,10);//绘制各个刻度for (int nMin=0; nMin<60; nMin++){//bHour为假表示绘制的是分钟刻度BOOL bHour = FALSE;//计算一个刻度点的位置ptFace = ComputerFacePoint(nMin,nFaceLength);//当分钟数是5的倍数时,bHour为真表示绘制小时刻度if (nMin%5==0){bHour = true;}//绘制一个刻度点DrawFacePoint(pDc,ptFace,bHour);}pDc->SelectObject(pbrOld);return;}CPoint CClockScale::ComputerFacePoint(UINT min, int nFaceLength){CPoint ptCalc;//将分钟转换为角度数double fDegrees = 180+((15+min)%60)*6;//再转换为弧度数double fAngle = fDegrees/180;//计算刻度点位置ptCalc.x = m_ptMiddle.x + (int)(cos(fAngle*PI)*nFaceLength);ptCalc.y = m_ptMiddle.y + (int)(sin(fAngle*PI)*nFaceLength);//返回刻度点位置return(ptCalc);}void CClockScale::DrawFacePoint(CDC *pDC, const CPoint &ptFace, BOOL bMajor){CRect rectPoint(ptFace.x,ptFace.y,ptFace.x,ptFace.y);//绘制小时刻度点if (bMajor){//增加高度和宽度,使单点变为小的矩形区rectPoint.InflateRect((m_nPointWidth/2)+2,(m_nPointWidth/2)+2);DrawMajor(pDC, m_style,rectPoint);}//绘制分钟刻度点else{//只有当刻度点之间的距离足够大时才绘制if (m_nPointWidth > 2){rectPoint.InflateRect(1,1);pDC->Draw3dRect(&rectPoint,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(COLOR_BT NSHADOW));}}return;}void CClockScale::DrawMajor(CDC *pDC, MAJORTYPE type, CRect rectPoint){CPen *oldPen;CPoint ptRhombus[4] ;CPen penBorder(PS_SOLID,1,RGB(255,255,255));switch(type){case TYPE_ELLIPSE:pDC->Ellipse(rectPoint);break;case TYPE_RECT:pDC->Rectangle(&rectPoint);pDC->Draw3dRect(&rectPoint,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(COLOR_BT NSHADOW));break;case TYPE_RHOMBUS:oldPen = pDC->SelectObject(&penBorder);ptRhombus[1].x = rectPoint.left + rectPoint.Width()/2;ptRhombus[1].y = rectPoint.top;ptRhombus[0].x = rectPoint.left;ptRhombus[0].y = rectPoint.top + rectPoint.Height()/2;ptRhombus[3].x = rectPoint.left + rectPoint.Width()/2;ptRhombus[3].y = rectPoint.bottom;ptRhombus[2].x = rectPoint.right;ptRhombus[2].y = rectPoint.top + rectPoint.Height()/2;pDC->Polygon(ptRhombus,4);pDC->SelectObject(oldPen);break;case TYPE_TRIANGLE:oldPen = pDC->SelectObject(&penBorder);ptRhombus[0].x = rectPoint.left;ptRhombus[0].y = rectPoint.top + rectPoint.Height()/2;ptRhombus[1].x = rectPoint.left + rectPoint.Width()/2;ptRhombus[1].y = rectPoint.top;ptRhombus[2].x = rectPoint.right;ptRhombus[2].y = rectPoint.top + rectPoint.Height()/2;pDC->Polygon(ptRhombus,3);pDC->SelectObject(oldPen);break;}}void CClockScale::SetScaleStyle(MAJORTYPE type){m_style = type;}void CClockScale::SetScaleColor(COLORREF colorref){m_color = colorref;}void CClockScale::SetLogColor(int color){m_logColor = color;}MAJORTYPE CClockScale::GetScaleStyle(){return m_style;}COLORREF CClockScale::GetScaleColor(){return m_color;}int CClockScale::GetLogColor(){return m_logColor;}// DateSetDlg.cpp : implementation file//#include "stdafx.h"#include "deskclock.h"#include "DateSetDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // DateSetDlg dialogDateSetDlg::DateSetDlg(CWnd* pParent /*=NULL*/): CDialog(DateSetDlg::IDD, pParent){//{{AFX_DATA_INIT(DateSetDlg)m_up = 0;m_in = 0;m_show = 0;//}}AFX_DATA_INIT}void DateSetDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(DateSetDlg)DDX_Control(pDX, IDC_COMOUT, m_comOut);DDX_Control(pDX, IDC_COMIN, m_comIn);DDX_Radio(pDX, IDC_UP, m_up);DDX_Radio(pDX, IDC_IN, m_in);DDX_Radio(pDX, IDC_SHOW, m_show);。