c语言怎么样编写一个时钟程序

c语言怎么样编写一个时钟程序,第1张

c语言时钟程序代码如下:

#include<windows.h>

#include<math.h>

#define ID_TIMER 1//计时器ID

#define TWOPI (2*3.14159)

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)

{

static TCHAR szAppName[]=TEXT("Clock")

HWND hwnd

MSG msg

WNDCLASS wndclass

wndclass.cbClsExtra=0

wndclass.cbWndExtra=0

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH)

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW)

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION)

wndclass.hInstance=hInstance

wndclass.lpfnWndProc=WndProc

wndclass.lpszClassName=szAppName

wndclass.lpszMenuName=NULL

wndclass.style=CS_HREDRAW|CS_VREDRAW

if(!RegisterClass(&wndclass))

{

MessageBox(NULL,TEXT("This program requires Windows

T"),szAppName,MB_ICONERROR)

return 0

}

hwnd=CreateWindow(szAppName,TEXT("Analog Clock"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL)

ShowWindow(hwnd,iCmdShow)

UpdateWindow(hwnd)

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg)

DispatchMessage(&msg)

}

return msg.wParam

}

void Setsotropic(HDC hdc,int cxClient,int cyClient)

{

SetMapMode(hdc,MM_ISOTROPIC)

SetWindowExtEx(hdc,1000,1000,NULL)

SetViewportExtEx(hdc,cxClient/2,-cyClient/2,NULL)

SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL)

}

void RotatePoint(POINT pt[],int iNum,int iAngle)

{

int i

POINT ptTemp

for(i=0i<iNumi++)

{

ptTemp.x=(int)(pt[i].x*cos(TWOPI*iAngle/360)+pt[i].y*sin(TWOPI*iAngle/360))

ptTemp.y=(int)(pt[i].y*cos(TWOPI*iAngle/360)+pt[i].x*sin(TWOPI*iAngle/360))

pt[i]=ptTemp

}

}

void DrawClock(HDC hdc)

{

int iAngle

POINT pt[3]

for(iAngle=0iAngle<360iAngle+=6)

{

pt[0].x=0

pt[0].y=900

RotatePoint(pt,1,iAngle)

pt[2].x=pt[2].y=iAngle%5?33:100

pt[0].x-=pt[2].x/2

pt[0].y-=pt[2].y/2

pt[1].x=pt[0].x+pt[2].x

pt[1].y=pt[0].y+pt[2].y

SelectObject(hdc,GetStockObject(BLACK_BRUSH))

Ellipse(hdc,pt[0].x,pt[0].y,pt[1].x,pt[1].y )

}

}

void DrawHands(HDC hdc,SYSTEMTIME *pst,BOOL fChange)

{

static POINT pt[3][5]={0,-150,100,0,0,600,-100,0,0,-150, 0,-200,50,0,0,800,-50,0,0,-200, 0,0,0,0,0,0,0,0,0,800 }

int i,iAngle[3]

POINT ptTemp[3][5]

iAngle[0]=(pst->wHour*30)%360+pst->wMinute/2

iAngle[1]=pst->wMinute*6

iAngle[2]=pst->wSecond*6

memcpy(ptTemp,pt,sizeof(pt))

for(i=fChange?0:2i<3i++)

{

RotatePoint(ptTemp[i],5,iAngle[i])

Polyline(hdc,ptTemp[i],5)

}

}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)

{

static int cxClient,cyClient

static SYSTEMTIME stPrevious

BOOL fChange

HDC hdc

PAINTSTRUCT ps

SYSTEMTIME st

switch(message)

{

case WM_CREATE:

SetTimer(hwnd,ID_TIMER,1000,NULL)

GetLocalTime(&st)

stPrevious=st

return 0

case WM_SIZE:

cxClient=LOWORD(lParam)

cyClient=HIWORD(lParam)

return 0

case WM_TIMER:

GetLocalTime(&st)

fChange=st.wHour!=stPrevious.wHour||st.wMinute!=stPrevious.wMinute

hdc=GetDC(hwnd)

Setsotropic(hdc,cxClient,cyClient)

SelectObject(hdc,GetStockObject(WHITE_PEN))

DrawHands(hdc,&stPrevious,fChange)

SelectObject(hdc,GetStockObject(BLACK_PEN))

DrawHands(hdc,&st,TRUE)

stPrevious=st

return 0

case WM_PAINT:

hdc=BeginPaint(hwnd,&ps)

Setsotropic(hdc,cxClient,cyClient)

DrawClock(hdc)

DrawHands(hdc,&stPrevious,TRUE)

EndPaint(hwnd,&ps)

return 0

case WM_DESTROY:

KillTimer(hwnd,ID_TIMER)

PostQuitMessage(0)

return 0

}

return DefWindowProc(hwnd,message,wParam,lParam)

}

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的 *** 作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++、Objective-C、Java、C#等。

1、以下例程实现时钟的实时显示基本要求: 1) 自行设计界面,模拟表盘式时钟。要求界面美观,清晰。2)数字同步显示时间信息。

2、例程:

#include<graphics.h> 

#include<math.h> 

#include<dos.h> 

#define PI 3.1415926 

//屏幕中心的坐标(640X480模式下)

#define mid_x 320 

#define mid_y 240 

int main() 

{ int graphdriver=DETECT,graphmode 

int end_x,end_y 

struct time curtime 

float th_hour,th_min,th_sec 

initgraph(&graphdriver,&graphmode,"C:\\TC2") //初始化VGA屏幕模式

setbkcolor(BLACK) //使用黑色的背景色

while(!kbhit(0)) //若有键盘输入,则跳出,即是结束程序

{ setcolor(GREEN) //把画笔设为绿色

circle(mid_x,mid_y,180) //钟的外圆

circle(mid_x,mid_y,150) //钟的内圆

circle(mid_x,mid_y,1) //画出钟的圆心

gettime(&curtime) //取得系统当前时间

th_sec=(float)curtime.ti_sec*0.1047197551 //把秒针的角度化为弧度,为以后绘制时方便,下同

th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0 //分针的弧度

th_hour=(float)curtime.ti_hour*0.5235987755+th_min/12.0 //时度的弧度,注意整时是12等分的,所时乘的是3.14/180*5

//计算出时针的尾的坐标(时针长70)

end_x=mid_x+70*sin(th_hour) 

end_y=mid_y-70*cos(th_hour) 

setcolor(RED) 

line(mid_x,mid_y,end_x,end_y) //用红色线画出时针

//计算出分针坐标(分针长110)

end_x=mid_x+110*sin(th_min) 

end_y=mid_y-110*cos(th_min) 

setcolor(RED) 

line(mid_x,mid_y,end_x,end_y) //用红色画出分针

end_x=mid_x+140*sin(th_sec) 

end_y=mid_y-140*cos(th_sec) 

setcolor(RED) 

line(mid_x,mid_y,end_x,end_y) //同上,画出秒针,长为140

//画出钟盘上的刻度,刻度长20

line(140,240,160,240) //9点对应的大刻度

line(320,60,320,80) //12点对应的大刻度

line(500,240,480,240) //3点的刻度

line(320,420,320,400) //6点的刻度

line(410,395.7,400,378.4) //5点

line(475.7,330,458.4,320) //4点

line(475.7,150,458.4,160) //2点

line(410,84.3,400,101.6) //1点

line(230,84.3,240,101.6) //11点

line(164.3,150,181.6,160) //10点

line(164.3,330,181.6,320) //8点

line(230,395.7,240,378.4) //7点

sleep(BLUE) //这里应该是打错,停止一秒,应为sleep(1000)

cleardevice() //清除屏幕上的显示

closegraph() //关闭VGA屏幕,即返回文本方式

return 0 

}

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

sbit QB1=P1^0

sbit QB2=P1^1 //数码管段选

sbit QB3=P1^2

sbit QB4=P1^3

sbit QB5=P1^4

sbit QB6=P1^5

sbit fm=P1^6//蜂鸣器

sbit s1=P2^4//s5按键,切换显示

sbit s2=P2^3//s2按键,设置调时

sbit s3=P2^2//s3按键,加1

sbit s4=P2^1//s4按键,减1

sbit led1=P0^0

sbit led2=P0^1

sbit led3=P0^2

uchar count

uchar sec,minu,hour,day,week,mon

uchar n_sec,n_minu,n_hour

uint year

uchar set_2=1,set_1=1

uchar hs,hg,mis,mig,ss,sg

uchar nhs,nhg,nms,nmg,nss=0,nsg=0

uchar ms,mg,ds,dg,w

uchar code table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,

0X90,0X88,0X83,0XC6,0XA1,0X8E,0X86,0xbf}//0~F,-,共阳

//uchar code tableyi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

//0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}//0-F,-,共阴

uchar code table_d[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

0x87,0xff,0xef}//0~9数组,带小数点

uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}//闰年

uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}//非闰年

void delay(uint)//延时函数

void timer0()//走时中断函数

void jishi()//计时函数

void key_change()//切换显示按键函数

void key_set()//设置时间按键函数

void disp(uchar,uchar,uchar,uchar,uchar,uchar)//显示函数

void zd_clock()//整点报时函数

void nz_clock()//闹钟函数

uchar incone(uchar)//加1函数

uchar decone(uchar)//减1函数

void set_time()//设置时间函数

void set_clock()//设置闹钟函数

void set_mdw()//设置月日星期函数

void main() //主函数

{

EA=1

ET0=1

TR0=1

TMOD=0x01

TH0=0x4c//50ms初值 晶振11.0592

TL0=0x00

hour=23minu=59sec=49//赋初值:11点59分0秒

n_hour=12n_minu=56n_sec=0//闹钟赋初值12点1分0秒

year=2008mon=5day=14week=3//年月日星期赋初值2008年5月11日星期天;祝天下所有母亲节日快乐

while(1)

{

hs=hour/10//时分秒HH.MM.SS

hg=hour%10

mis=minu/10

mig=minu%10

ss=sec/10

sg=sec%10

ms=mon/10//月日-星期MM.DD.-W

mg=mon%10

ds=day/10

dg=day%10

w=week

nhs=n_hour/10//闹钟定时HH.MM.SS

nhg=n_hour%10

nms=n_minu/10

nmg=n_minu%10

nss=n_sec/10

nsg=n_sec%10

key_change()//s4按键扫描

key_set()//s2按键扫描

set_time()//设置时间

set_mdw()//设置月日星期

set_clock()//设置闹钟

if(set_1==1) //正常走时显示

{

disp(hs,hg,mis,mig,ss,sg)

}

if(set_1==2) //设置时间,LED1闪亮

{

disp(hs,hg,mis,mig,ss,sg)

if(sec%2==0)

{led2=1led3=1led1=~led1}

// else

// {led1=1}

}

if(set_1==3) //正常显示月日-星期

{

disp(ms,mg,ds,dg,16,w)

}

if(set_1==4) //设置月日-星期,LED2闪亮

{

disp(ms,mg,ds,dg,16,w)

if(sec%2==0)

{led1=1led3=1led2=~led2}

// else

// {led2=1}

}

if(set_1==5) //正常显示定时

{

disp(nhs,nhg,nms,nmg,nss,nsg)

}

if(set_1==6) //设置闹钟定时,LED3闪亮

{

disp(nhs,nhg,nms,nmg,nss,nsg)

if(sec%2==0)

{led1=1led2=1led3=~led3}

// else

// {led3=1}

}

zd_clock()//整点报时

nz_clock()//闹钟

}

}

void timer0() interrupt 1 //50ms中断函数

{

TMOD=0x01

TH0=0x4c//50ms初值 晶振11.0592

TL0=0x00

count++

if(count==20)

{

count=0

sec++

jishi()//调计时函数

}

}

void jishi() //计时函数

{

if(sec==60)

{

sec=0

minu++

if(minu==60)

{

minu=0

hour++

if(hour==24)

{ hour=0

day++

week++

if(week==8)

{week=0}

if(year%4==0&&year%100!=0||year%400==0) //闰年

{

if(day==table1[mon]+1)

{

day=0

mon++

if(mon==13)

{mon=0year++}

}

}

else //非闰年

{

if(day==table2[mon]+1)

{

day=0

mon++

if(mon==13)

{mon=0year++}

}

}

}

}

}

}

void key_change() //s1按键扫描

{

if(s1==0)

{

delay(200)

if(s1==0)

{

set_1++

while(!s1)

if(set_1==7)

{set_1=1}

}

}

}

void key_set() //s2按键扫描

{

if(s2==0)

{

delay(10)

if(s2==0)

{

set_2++

while(!s2)

if(set_2==4)

{set_2=1}

}

}

}

void disp(uchar a1,uchar a2,uchar a3,uchar a4,uchar a5,uchar a6) //显示函数

{

QB1=1

QB2=0

QB3=0

QB4=0

QB5=0

QB6=0

P3=table[a1]//段码送P0口

delay(10)//延时一小会

QB1=0

QB2=1

QB3=0

QB4=0

QB5=0

QB6=0

P3=table[a2]//第2个数码管显示,带小数点

delay(10)

QB1=0

QB2=0

QB3=1

QB4=0

QB5=0

QB6=0

P3=table[a3]//第3个数码管显示

delay(10)

QB1=0

QB2=0

QB3=0

QB4=1

QB5=0

QB6=0

P3=table[a4]//第4个数码管显示,带小数点

delay(10)

QB1=0

QB2=0

QB3=0

QB4=0

QB5=1

QB6=0

//第5个数码管显示

P3=table[a5]

delay(10)

QB1=0

QB2=0

QB3=0

QB4=0

QB5=0

QB6=1

P3=table[a6]//第6个数码管显示

delay(10)

QB1=0

QB2=0

QB3=0

QB4=0

QB5=0

QB6=0

}

void zd_clock() //整点报时函数

{

if(minu==59&&(sec==53||sec==55||sec==57))

{

fm=0

delay(5)

fm=1

delay(5)

}

fm=0

if(minu==59&&sec==59)

{

fm=0

delay(5)

fm=1

delay(5)

fm=0

}

}

void nz_clock() //闹钟函数

{

if(hour==n_hour&&minu==n_minu&&sec==n_sec)

//if((sec%2==0)&&sec<30)

{

fm=0

delay(1)

fm=1

delay(1)

}

}

void set_time() //设置时间函数

{

if(set_1==2)

{

if(set_2==1)

{

hour=incone(hour)

if(hour==24)

{hour=0}

// if(hour<0)

// {hour=23}

hour=decone(hour)

}

if(set_2==2)

{

minu=incone(minu)

if(minu==60)

{minu=0}

// if(minu<0)

// {minu=59}

minu=decone(minu)

}

}

}

void set_mdw() //设置月日星期函数

{

if(set_1==4)

{

if(set_2==1)

{

mon=incone(mon)

if(mon==13)

{mon=1}

mon=decone(mon)

// if(mon==0)

// {mon=12}

}

if(set_2==2)

{

day=incone(day)

if(day==32)

{day=0}

day=decone(day)

// if(day==0)

// {day=0}

}

if(set_2==3)

{

week=incone(week)

if(week==8)

{week=0}

week=decone(week)

// if(week==0)

// {week=7}

}

}

}

void set_clock() //设置闹钟函数

{

if(set_1==6)

{

if(set_2==1)

{

n_hour=incone(n_hour)

if(n_hour==24)

{n_hour=0}

n_hour=decone(n_hour)

if(n_hour==0)

{n_hour=0}

}

if(set_2==2)

{

n_minu=incone(n_minu)

if(n_minu==60)

{n_minu=0}

n_minu=decone(n_minu)

if(n_minu==0)

{n_minu=0}

}

}

}

uchar incone(uchar n) //加1函数

{

if(s3==0)

{ delay(200)

if(s3==0)

{

n++

while(!s3)

}

}

return(n)

}

uchar decone(uchar m) //减1函数

{

if(s4==0)

{

delay(200)

if(s4==0)

{

m--

while(!s4)

if(m<0)

{m=0}

}

}

return(m)

}

void delay(uint k) //延时函数

{

uint i,j

for(i=ki>0i--)

for(j=80j>0j--)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11355333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存