#include
#include
#include
#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;
}
我这个定时是50MS的,但也能完成你的功能,如果你的晶振是6M,定时就是0.1s,有问题给我发消息或QQ330788913
#include
#include
#define uchar unsigned char
#define TURE 1
#define FALSE 0
void disp(void);
void delay(del);
void bcd(void);
void shan(void);
void delay10(dell);
void tkey(void);
int temp;
int f;
uchar count;
uchar data clock[3]={23,50,50};
uchar data num[6];
/************主程序*************/
void main(void)
{
temp=0xff;
f=1;
P1=0xff;
count=20;
SP=0X60;
TMOD=0X01;
SCON=0X00;
TL0=0XB0;
TH0=0X3C;
EA=1;
IT0=1;
ET0=1;
TR0=1;
EX0=1;
while(TURE)
{
return1:bcd();
disp();
delay(5000);
if (temp==0xff)
goto return1;
tkey();
shan();
disp();
delay10(4000);
}
}
/**********按键程序************/
void tkey(void)
{
uchar judcekey;
judcekey=P1&0x0f;
if(judcekey==0x0f)
goto return2;
/*******移位键*********/
if (judcekey==0x0e)
f++;
if (f==4)
f=1;
/**********加一键*********/
if(judcekey==0x0d)
{clock[f-1]++;}
if (f==1)
{ if (clock[f-1]==24){
clock[f-1]=0;}
}
else{ if (clock[f-1]==60)
clock[f-1]=0;
}
/******减一键***********/
if(judcekey==0x0b)
{clock[f-1]--;}
if (f==1)
{ if (clock[f-1]==0xff){
clock[f-1]=23;}
}
else
{ if (clock[f-1]==0xff)
clock[f-1]=59;
}
return2:_nop_();
}
/*******闪烁程序***********/
void shan(void)
{
if (f==1)
{
num[0]=10; //时闪
num[1]=10;
}
if (f==2)
{
num[2]=10;//分闪
num[3]=10;
}
if (f==3)
{
num[4]=10;//秒闪
num[5]=10;
}
}
/*******十位个位转换************/
void bcd(void)
{
num[5]=clock[2]-(clock[2]/10)*10 ;
num[4]=clock[2]/10;
num[3]=clock[1]-(clock[1]/10)*10 ;
num[2]=clock[1]/10;
num[1]=clock[0]-(clock[0]/10)*10 ;
num[0]=clock[0]/10;
}
/********定时程序*************/
void timer1() interrupt 1 using 2
{
TL0=0XB0;
TH0=0X3C;
count--;
if(count==0)
{
count=20;
clock[2]++;//秒//
}
else
goto out;
if(clock[2]==60)
{
clock[2]=0;
clock[1]++;//分//
}
if(clock[1]==60)
{
clock[1]=0;
clock[0]++;
}
if(clock[0]==24)//时//
clock[0]=0;
out:_nop_();
}
/************显示程序*************/
void disp(void)
{uchar code LEDValue[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF}; //0-9
uchar k;
for(k=0;k<=5;k++)
{
SBUF=LEDValue[num[5-k]];
while(TI==0);
TI=0;
}
}
/*******外部中断***********/
void intr0() interrupt 0 using 2
{
temp=~temp;//判断是否闪烁位//
TR0=~TR0; //闪关定时否则开定时
//
}
/************延时程序*************/
void delay(del)
{
for(del;del>0;del--);
}
/*****延时程序***********/
void delay10( dell)
{
float i,j;
for(dell;dell>0;dell--)
for(i=1000;i<0;i--)
for(j=5000;j<0;j--);
}
炫耀才华????????
org 0000h
ljmp start
ORG 001BH ;INT T1 入口地址
lJMP INT_T1
ORG 0080H
start:
MOV SP,#60H
mov 30h,#0
mov 31h,#0
mov 32h,#0
mov 33h,#0
mov 34h,#0
mov 35h,#0
mov 36h,#0
mov 37h,#0
MOV R3,#0H ;时
MOV R2,#0H ;分
mov r1,#0h ;秒
MOV R6,#0H ;标志
mov r7,#0h ;标志
MOV 38h,#0H ;标志
mov 39h,#0h ;标志
MOV TMOD,#10H
MOV TL1,#00H ;50 mS 的时间常数
MOV TH1,#04CH
MOV R0,#10
mov r4,#2
setb p2.7
SETB TR1
SETB ET1
SETB EA ;允许中断
loop:
lcall scankey
cjne r7,#0ffh,wait1
lcall display2
sjmp loop
wait1:
CJNE R6,#0FFH,wait
LCALL DISPLAY1
MOV 34H,30H
MOV 35H,31H
MOV 36H,32H
MOV 37H,33H
sjmp loop
wait:
lcall display
SJMP loop
INT_T1: ;INT_T1中断服务子程序
PUSH DPH ;保护现场
PUSH DPL
PUSH ACC
PUSH PSW
CLR TR1
MOV TL1,#00H ;50mS 定时常数
MOV TH1,#4CH
SETB TR1
DJNZ R4,EXIT1
MOV R4,#2
mov a,30h
CJNE a,#09h,s0
MOV 30h,#0
mov a,31h
CJNE a,#9H,s1
MOV 31h,#0H
mov a,32h
CJNE a,#9H,s2
MOV 32h,#0H
mov a,33h
CJNE a,#9H,s3
MOV 33h,#0H
s3:
mov a,33h
add a,#1
mov 33h,a
s2:
mov a,32h
add a,#1
mov 32h,a
s1:
mov a,31H
add a,#1
mov 31H,a
s0:
mov a,30H
add a,#1
mov 30H,a
DJNZ R0,EXIT1 ;判断毫秒=0
MOV R0,#10 ;DELAY 1 SECOND
cpl p2.7
mov a,38h
cjne a,#0ffh,next1
ljmp hour1
next1:
mov a,39h
cjne a,#0ffh,next2
ljmp minute1
next2: CJNE R1,#59H,SECOND ;判断秒=59
MOV R1,#99H
minute1:CJNE R2,#59H,MINUTE ;判断分=59
MOV R2,#99H
hour1:CJNE R3,#23H,HOUR ;判断时=23
MOV R3,#99H
HOUR:
MOV A,R3
ADD A,#1 ;时加1
DA A
MOV R3,A
mov a,38h
cjne a,#00,exit1
MINUTE:
MOV A,R2
ADD A,#1 ;分加1
DA A
MOV R2,A
mov a,39h
cjne a,#00,exit1
SECOND:
MOV A,R1
ADD A,#1 ;秒加1
DA A
MOV R1,A
EXIT1:
mov 38h,#0h
mov 39h,#0h
POP PSW ;恢复现场
POP ACC
POP DPL
POP DPH
RETI ;中断返回
DISPLAY:
MOV A,R3
ANL A,#0FH
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
;MOV P2,#0fbh
setb p2.0
clr p2.2
setb p2.1
setb p2.3
lcall delay
MOV A,R3
SWAP A
ANL A,#0FH
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
setb p2.0
clr p2.3
setb p2.2
setb p2.1
;MOV P2,#0f7h
lcall delay
MOV A,R2
ANL A,#0fH
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
setb p2.1
clr p2.0
setb p2.2
setb p2.3
;MOV P2,#0feh
lcall delay
MOV A,R2
SWAP A
ANL A,#0FH
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
setb p2.0
clr p2.1
setb p2.2
setb p2.3
;MOV P2,#0fdh
lcall delay
RET
display1:
MOV A,30h
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
MOV P2,#0feh
lcall delay
MOV A,31h
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
MOV P2,#0fdh
lcall delay
MOV A,32H
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
MOV P2,#0fbh
lcall delay
MOV A,33H
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
MOV P2,#0f7h
lcall delay
RET
display2:
MOV A,34h
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
MOV P2,#0feh
lcall delay
MOV A,35h
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
MOV P2,#0fdh
lcall delay
MOV A,36H
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
MOV P2,#0fbh
lcall delay
MOV A,37H
mov dptr,#ledseg
movc a,@a+dptr
MOV P0,A
MOV P2,#0f7h
lcall delay
RET
delay: ;延时子程序
PUSH 0 ;保存现场
PUSH 1
MOV 0,#1H
DELAY1: MOV 1,#0FH
DJNZ 1,$
DJNZ 0,DELAY1
POP 1 ;恢复现场
POP 0
RET
scankey:
setb p1.0
jb p1.0,p11
lcall delay
jb p1.0,p11
mov r6,#0ffh
mov r7,#0h
mov 30h,#0
mov 31h,#0
mov 32h,#0
mov 33h,#0
SJMP loop1
p11:
setb p1.1
jb p1.1,P12
lcall delay
jb p1.1,p12
mov r6,#0h
mov r7,#0h
sjmp loop1
p12:
SETB P1.2
JB P1.2,p13
lcall delay
jb p1.2,p13
mov r7,#0ffh
sjmp loop1
p13:
setb p1.3
jb p1.3,p14
lcall delay
jb p1.3,p14
mov 38h,#0ffh
sjmp loop1
p14:
setb p1.4
jb p1.4,loop1
lcall delay
jb p1.4,loop1
mov 39h,#0ffh
sjmp loop1
loop1:
ret
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
DB 6DH,02H,08H,00H,59H,0FH,76H
end