用C++编写图形时钟程序

用C++编写图形时钟程序,第1张

你好这是我用mfc编写的一个时钟程序我不用你存话费你采纳就ok了别不采纳我可是花了很长时间来弄的源程序//这是关键代码voidCClockView::OnDraw(CDCpDC){ CClockDocpDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahere CBitmapbg; bgLoadBitmap(IDB_BITMAP1); CDCdc; dcCreateCompatibleDC(pDC); dcSelectObject(bg); pDC->BitBlt(0,0,400,400,&dc,0,0,SRCCOPY); CTimetm; tm=CTime::GetCurrentTime();//得到系统的时分秒inti=tmGetMinute()-1;//60 intj=tmGetHour();//24 intn=tmGetSecond();//60/ CStringstr; strFormat("%d:%d",j,i); MessageBox(str);/ //2460 floatmin=(float)(i-14)/60231415; floathour=(float)(j-3)/12231415;//角度 floatsec=(float)(n-14)/60231415; //原点位置intorg_x=200; intorg_y=200; //时针 inthour_ar=90;//长度 inth_x=hour_arcos(hour)+200; inth_y=hour_arsin(hour)+200; //分针 intmin_ar=140;//长度 intm_x=min_arcos(min)+200; intm_y=min_arsin(min)+200; //秒针 intsec_ar=170;//长度 ints_x=sec_arcos(sec)+200; ints_y=sec_arsin(sec)+200;CPenp1(PS_SOLID,4,RGB(100,100,100)); CPenpenOld=(CPen)pDC->SelectObject(p1); pDC->MoveTo(org_x,org_y); pDC->LineTo(m_x,m_y); CPenp2(PS_SOLID,3,RGB(200,100,100)); pDC->SelectObject(p2); pDC->MoveTo(org_x,org_y); pDC->LineTo(h_x,h_y);CPenp3(PS_SOLID,2,RGB(150,100,100)); pDC->SelectObject(p3); pDC->MoveTo(org_x,org_y); pDC->LineTo(s_x,s_y); SetTimer(1,1000,NULL);}voidCClockView::OnTimer(UINTnIDEvent){ //TODO:Addyourmessagehandlercodehereand/orcalldefault this->RedrawWindow(); CView::OnTimer(nIDEvent);}

////////////////////////////////////////////

// 程序名称:钟表模拟程序(表针形式)

// 编译环境:Visual C++ 60,EasyX 2011惊蛰版

// 程序编写:BestAns <BestAns@qqcom>

// 最后更新:2010-10-30

//

#include

 

<graphicsh>

#include

 

<conioh>

#include

 

<mathh>

#define

PI

31415926536

void

 

DrawHand

(

int

 hour

,

 

int

 minute

,

 

int

 second

)

{

double

 a_hour

,

 a_min

,

 a_sec

;

// 时、分、秒针的弧度值

int

 x_hour

,

 y_hour

,

 x_min

,

 y_min

,

 x_sec

,

 y_sec

;

// 时、分、秒针的末端位置

// 计算时、分、秒针的弧度值

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

(

120

 

 

sin

(

a_sec

));

y_sec 

=

 

int

(

120

 

 

cos

(

a_sec

));

x_min 

=

 

int

(

100

 

 

sin

(

a_min

));

y_min 

=

 

int

(

100

 

 

cos

(

a_min

));

x_hour

=

 

int

(

70

 

 

sin

(

a_hour

));

y_hour

=

 

int

(

70

 

 

cos

(

a_hour

));

// 画时针

setlinestyle

(

PS_SOLID

,

 NULL

,

 

10

);

setcolor

(

WHITE

);

line

(

320

 

+

 x_hour

,

 

240

 

-

 y_hour

,

 

320

 

-

 x_hour 

/

 

7

,

 

240

 

+

 y_hour 

/

 

7

);

// 画分针

setlinestyle

(

PS_SOLID

,

 NULL

,

 

6

);

setcolor

(

LIGHTGRAY

);

line

(

320

 

+

 x_min

,

 

240

 

-

 y_min

,

 

320

 

-

 x_min 

/

 

5

,

 

240

 

+

 y_min 

/

 

5

);

// 画秒针

setlinestyle

(

PS_SOLID

,

 NULL

,

 

2

);

setcolor

(

RED

);

line

(

320

 

+

 x_sec

,

 

240

 

-

 y_sec

,

 

320

 

-

 x_sec 

/

 

3

,

 

240

 

+

 y_sec 

/

 

3

);

}

void

 

DrawDial

()

{

// 绘制一个简单的表盘

circle

(

320

,

 

240

,

 

2

);

circle

(

320

,

 

240

,

 

60

);

circle

(

320

,

 

240

,

 

160

);

outtextxy

(

296

,

 

310

,

 

"BestAns"

);

// 绘制刻度

int

 x

,

 y

;

for

 

(

int

 i

=

0

;

 i

<

60

;

 i

++)

{

=

 

320

 

+

 

int

(

145

 

 

sin

(

PI 

 

2

 

 i 

/

 

60

));

=

 

240

 

+

 

int

(

145

 

 

cos

(

PI 

 

2

 

 i 

/

 

60

));

if

 

(

%

 

15

 

==

 

0

)

bar

(

-

 

5

,

 y 

-

 

5

,

 x 

+

 

5

,

 y 

+

 

5

);

else

 

if

 

(

%

 

5

 

==

 

0

)

circle

(

x

,

 y

,

 

3

);

else

putpixel

(

x

,

 y

,

 WHITE

);

}

}

void

 

main

()

{

initgraph

(

640

,

 

480

);

// 初始化 640 x 480 的绘图窗口

DrawDial

();

// 绘制表盘

setwritemode

(

R2_XORPEN

);

// 设置 XOR 绘图模式

// 绘制表针

SYSTEMTIME

 

ti

;

// 定义变量保存当前时间

while

(!

kbhit

())

// 按任意键退出钟表程序

{

GetLocalTime

(&

ti

);

// 获取当前时间

DrawHand

(

ti

wHour

,

 ti

wMinute

,

 ti

wSecond

);

// 画表针

Sleep

(

1000

);

// 延时 1 秒

DrawHand

(

ti

wHour

,

 ti

wMinute

,

 ti

wSecond

);

// 擦表针(擦表针和画表针的过程是一样的)

}

closegraph

();

// 关闭绘图窗口

}

其了就是用了easyx

#include<graphicsh>

#include<mathh>

#include<dosh>

#define PI 31415926

#define x0 320 /定义钟表中心坐标/

#define y0 240

void DrawClock(int x,int y,int color) /画表盘/

{ int r=150; /表盘的半径/

float th;

setcolor(color);

circle(x,y,r);

circle(x,y,2);

}

void DrawHand(int x,int y,float th,int l,int color)

{

int x1,y1;

x1=x lsin(th);

y1=y-lcos(th);

setcolor(color);

line(x,y,x1,y1);

}

void main()

{int gdriver=DETECT,gmode;

struct time curtime;

float th_hour,th_min,th_sec;

initgraph(&gdriver,&gmode,"");

setbkcolor(0);

while(! kbhit())

{

DrawClock(x0,y0,14);

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

gotoxy(35,20); /定位输出位置/

if((float)curtimeti_hour<=12) /午前的处理/

{printf("AM ");

if((float)curtimeti_hour<10) printf("0"); /十点之前在小时数前加零/

printf("%0f:",(float)curtimeti_hour);

}

else /午后的处理/

{printf("PM ");

if((float)curtimeti_hour-12<10) printf("0");

printf("%0f:",(float)curtimeti_hour-12);

}

if((float)curtimeti_min<10) printf("0");

printf("%0f:",(float)curtimeti_min);

if((float)curtimeti_sec<10) printf("0");

printf("%0f",(float)curtimeti_sec);

/以下三行计算表针转动角度,以竖直向上为起点,顺时针为正/

th_sec=(float)curtimeti_sec01047197551; /2π/60=01047197551/

th_min=(float)curtimeti_min01047197551 th_sec/600;

th_hour=(float)curtimeti_hour0523598775 th_min/120; / 2π/12=05235987755 /

DrawHand(x0,y0,th_hour,70,2); /画时针/

DrawHand(x0,y0,th_min,110,3); /分针/

DrawHand(x0,y0,th_sec,140,12); /秒针/

sleep(1); /延时一秒后刷新/

cleardevice();

}

closegraph();

}

能正常运行,我测试过

来自网络转载

#include<reg52h>

#include<absacch>

#include<intrinsh>

#define unit unsigned int

#define uchar unsigned char

//#define HZ 12

sbit key0=P0^0; // 分钟调整

sbit key1=P0^1; // 小时调整

sbit P2_0=P2^7; //秒 指示灯

sbit MN_RXD=P3^6;

sbit MN_TXD=P3^7;

uchar data CLOCK[4]={0,0,0,12};//存放时钟时间(百分秒,秒,分,和时位)

//数码管显示表0-f 灭

uchar code TABLE[]={0xBE,0x06,0xEA,0x6E,0x56,0x7C,0xFC,0x0E,0xFE,0x7E,0x00};

//

//模拟串口发送一个字节数据 函数

//

void SendData(unsigned char senddata)

{

unsigned char i;

for(i=0;i<8;i++)

{

if((senddata&0x01)==0)

MN_RXD=0;

else

MN_RXD=1;

_nop_();

MN_TXD=0;

_nop_();

MN_TXD=1;

senddata=senddata>>1;

}

}

//

//显示程序函数

//

void display(void)

{

// unsigned int n;

uchar temp;

temp=CLOCK[1]; temp=temp%10; SendData(TABLE[temp]);

temp=CLOCK[1]; temp=temp/10; SendData(TABLE[temp]);

temp=CLOCK[2]; temp=temp%10; SendData(TABLE[temp]);

temp=CLOCK[2]; temp=temp/10; SendData(TABLE[temp]);

temp=CLOCK[3]; temp=temp%10; SendData(TABLE[temp]);

temp=CLOCK[3]; temp=temp/10; SendData(TABLE[temp]);

/

for(n=0;n<5000;n++);

for(n=0;n<6;n++)

{

SendData(TABLE[10]);

}

/

}

//

//按键控制函数

//

void keycan()

{

unsigned int n;

EA=0;

if(key0==0) // 分钟调整

{

for(n=0;n<10000;n++); //延时去抖动

while(key0==0);

CLOCK[2]=CLOCK[2]+1;

if(CLOCK[2]==60) //到一时

{

CLOCK[2]=0;

}

display();

}

if(key1==0) // 小时调整

{

for(n=0;n<10000;n++); //延时去抖动

while(key1==0);

CLOCK[3]=CLOCK[3]+1;

if(CLOCK[3]==24)

{

CLOCK[3]=0;

}

display();

}

EA=1;

}

//

//T0中断服务函数

//

void time0() interrupt 1 //using 1

{

TH0=0xD8; TL0=0xF0; //重置初值

// TH0=0xB1; TL0=0xE0;

//时钟处理

CLOCK[0]=CLOCK[0]+1;

}

//

//主函数

//

void main()

{

EA=1;

ET0=1;

TMOD=0x01; //T0方式1定时

TH0=0xD8; TL0=0xF0; //D8F0 定时10ms

// TH0=0xB1; TL0=0xE0; //定时 20ms

TR0=1;

for(;;)

{

if(CLOCK[0]==100) //到一秒 10ms100

{

CLOCK[0]=0;

P2_0=~P2_0;

CLOCK[1]=CLOCK[1]+1;

if(CLOCK[1]==60) //到一分

{

CLOCK[1]=0;

CLOCK[2]=CLOCK[2]+1;

if(CLOCK[2]==60) //到一时

{

CLOCK[2]=0;

CLOCK[3]=CLOCK[3]+1;

if(CLOCK[3]==24)

{

CLOCK[3]=0;

}

}

}

display();

}

keycan();

}

}

duanEQUP0;

weiEQUP2;

keyBITP37;

ORG0000H

AJMPMAIN;绝对转移指令,2kb范围(11位)内跳转LJMP16位64kb范围内跳转

;短转移指令的功能是先使程序计数器PC加1两次(即:取出指令码),然后把加2后的地址和rel相加作为目标转移地址。因此,短转移指令是一条相对转移指令,是一条双字节双周期指令

ORG0030H;指明后面的程序从程序存储器的0030H单元开始存放

DELAY200US:;@110592MHz

NOP

NOP

NOP

PUSH30H

PUSH31H

MOV30H,#2

MOV31H,#179

NEXT:

DJNZ31H,NEXT

DJNZ30H,NEXT

POP31H

POP30H

RET

ORG0060H

;DISPLAY子程序

DISPLAY:

PUSHACC;不能写A,此处ACC代表地址,push后跟地址,代表把地址内的内容压入栈中

PUSH00H;R0

PUSH06H;R6

PUSH07H;R7

PUSH83H;DPH

PUSH82H;DPL

MOVR6,#01H;位选数据,01指的是缓冲区最低位数据

MOVR7,#08H;循环次数

FLAG:

MOVduan,#0x00;消影

MOVA,R6

CPLA;取反

MOVwei,A;位选

MOVA,#disBufDat

ADDA,R7

SUBBA,#0X08

MOVR0,A

MOVA,@R0;读出要显示的数据到A

MOVDPTR,#disTab

MOVCA,@A+DPTR;从rom取数据,取出要显示的数据对应的段码

MOVduan,A;段选

MOVA,R6

RLA

MOVR6,A;更新下一次位选

LCALLDELAY200US

DJNZR7,FLAG

POP82H;DPL

POP83H;DPH

POP07H

POP06H

POP00H

POPACC

RET

ORG0100H

;定时器中断0初始化

T0_INIT:

MOVTMOD,#0X01

MOVTH0,#0X3C

MOVTL0,#0XB0

SETBEA

SETBTR0

SETBET0

RET

ORG0130H

;T0中断处理程序

INT_TIMERE0:

PUSHACC

SETBRS0

MOVTH0,#0X3C

MOVTL0,#0XB0

INCR0

MOVA,R0

SUBBA,#0X14

JBCY,SECFLAG

MOVR0,#0x00

INCsec

SECFLAG:

CLRRS0

POPACC

RETI

ORG000BH;定时器/计数器T0入口地址

LJMPINT_TIMERE0;跳转到定时器/计数器中断服务程序中去

disTab:DB0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40;0-f,空白,横杠的段选数据

disBufDatEQU47H;定义显示缓冲数据变量区,8个

disBufDatHeadEQU40H//单片机上显示在最左边

secEQU48H

;主程序

ORG0180H

MAIN:

MOVSP,#0X60;将0x60到0x7f设为堆栈区

LCALLT0_INIT

MOVdisBufDatHead,#0X00

MOVdisBufDatHead+1,#0X00

MOVdisBufDatHead+2,#0X11

MOVdisBufDatHead+3,#0X11

MOVdisBufDatHead+4,#0X11

MOVdisBufDatHead+5,#0X11

MOVdisBufDatHead+6,#0X11

MOVdisBufDatHead+7,#0X11

MOVsec,#0X3A

WHILE:

JBkey,KEYSCAN

MOVsec,0x00

KEYSCAN:

MOVA,sec

SUBBA,#3CH;超过60s归零

JBCY,CLEAR

MOVsec,#0X00;clr加ram地址无效

CLEAR:

MOVA,sec

MOVB,#0AH

DIVAB;A/B,商存到A中,余数存B中

MOVdisBufDatHead,A

MOVdisBufDatHead+1,B

LCALLDISPLAY

LJMPWHILE;循环

END;

扩展资料

51机器周期和指令周期

1、机器周期是指单片机完成一个基本 *** 作所花费的时间,一般使用微秒来计量单片机的运行速度,51单片机的一个机器周期包括12个时钟振荡周期,也就是说如果51单片机采用12MHz晶振,那么执行一个机器周期就只需要1μs;如果采用的是6MHz的晶振,那么执行一个机器周期就需要2μs。

2、指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。在51单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个机器周期),四周期指令(执行这条指令需要四个机器周期)。

除了乘、除两条指令是四周期指令,其余均为单周期或双周期指令。也就是说,如果51单片机采用的是12MHz晶振,那么它执行一条指令一般只需1~2微秒的时间;如果采用的是6MH晶振,执行一条指令一般就需2~4微秒的时间。

#include <stdioh>

#include <stdlibh>

#include <timeh>

//#include <dosh>

#include <conioh>

int main()

{

struct tm curtime;

time_t t;

clock_t start;

double th_hour,th_min,th_sec;

do

{

printf("

");

printf(" This is a simple clock program

");

printf("

");

printf("

");

printf("The current time is:

");

t=time(0);

curtime=gmtime(&t); /得到当前系统时间/

if((double)curtime->tm_hour<=12) /午前的处理/

{

printf("AM ");

if((double)curtime->tm_hour<10) printf("0"); /十点之前在小时数前加零/

printf("%0f:",(double)curtime->tm_hour);

}

else /午后的处理/

{

printf("PM ");

if((double)curtime->tm_hour-12<10) printf("0");

printf("%0f:",(double)curtime->tm_hour-12);

}

if((double)curtime->tm_min<10) printf("0");

printf("%0f:",(double)curtime->tm_min);

if((double)curtime->tm_sec<10) printf("0");

printf("%0f",(double)curtime->tm_sec);

printf("

");

start=clock();

while(clock()-start<1000);

// delay(1000); /延时一秒后刷新/

system("cls");

}while(!kbhit()); / 按任一键退出 /

return 0;

}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;20h1半点标示位

;20H2闹钟设置中标示,为了显示区别用

;20H3闹钟设置时间CHECK到,使能标志位

;20H5开/关闹钟设置中标示;

;20H6闹钟1开关标志位

;20H7闹钟2开关标志位

;psw5用来做显示开关标志位

;21,22,23,24这里设置第一个闹钟的时间

;25,26,27,28这里设置第二个闹钟的时间

;29H

;P0口输出数码管段码,

;P2口 输出位选信号

;

;70H存放P10--3按钮值,

;71H--78H存放当前系统定时时间;

;78H 77H 76H 75H 74H 73H 72H 71H

; 星期 小时 分钟 秒钟

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ts equ 24h ;这里设置`24小时周期制

trr equ #0bbh ;这个是温度,晶振等的时间补偿值,

org 0000h ;定时太慢此值调大,定时太快调小;

jmp main

;org 0bh ;定时器0中断入口矢量

;jmp bz

org 1bh ;定时器1中断入口矢量

jmp t1int

org 0100h ;主程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;主程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

main:clr p30; ;关继电器

mov sp,#30h

mov r3,#20

mov tmod,#10h

;mov tl0,#06h ;定时器1,方式1,定时 50 MS;

;mov th0,#06h

mov tl1,#0b0h

mov th1,#3ch

mov ie,#88h ;开定时器1中断

;mov 65h,#5

; mov 66h,#100

;mov 64h,#4

;clr psw5

clr p30

setb pt1 ;设置T1为高优先级中断

;setb tr1

clr tr1 ;开启T1中断

acall send ;71h--78h 清零;

acall send1 ;20h--29h 清零;

dd: acall daa ;进行十进制调整71H-79H

;acall compare ;第一闹钟

;acall compare1 ;第二闹钟 设置值

;acall sound

acall disp ;数码管显示,78H--71H分别对应着8个数码管显示

acall key_scanf ;按钮控制

acall time_adj ;时间调整

acall lasttime ;调用上一次的设置值为当前定时值

;acall alarm1_set ;设置定时开/关闹钟

ajmp dd

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;调用上次值为设置时间

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

lasttime:push acc

mov a,70h

jnb acc2,return1

clr p30; 紧急暂停按钮,按下后暂停,并把上次设定值恢复

clr tr1

mov 73h,21h

mov 74h,22h

wait7:acall disp

acall key_scanf

mov a,70h

jnb acc0,wait7

mov 71h,#0

mov 72h,#0

mov 79h,#0

mov tl1,trr

mov th1,#3ch

mov r3,#20

setb tr1

setb p30

return1:pop acc

ret

daa: push acc ;对当前系统时间进行十进制调整

mov 71h,79h

mov r1,#71h

cjne @r1,#10,s2

mov 71h,#0h

mov 79h,#0

inc 72h

mov r1,#72h

cjne @r1,#6,s2

mov 72h,#0h

dec 73h

mov r1,#73h

cjne @r1,#255,s2

dec 74h

mov 73h,#9

s1: pop acc

ret

s2: mov r1,#73h

cjne @r1,#0,s1

mov r1,#74h

cjne @r1,#0,s1

clr p30

clr tr1

sjmp s1

h_half: ;半点CHECK

mov r1,#73h

mov a,74h

swap a

xchd a,@r1

cjne a,#29h,o25 ;CHECK 当前时间是否为29分钟

xchd a,@r1

mov r1,#71h

mov a,72h

swap a

xchd a,@r1

cjne a,#59h,o25 ;CHECK 当前时间为59秒

setb tr0 ;启动T0

setb 20h1 ;enable 半点flag bit

o25: xchd a,@r1

ret

compare: ;闹钟1设置时间与当前时间比较

push acc

jnb 20h6,nequ ;闹钟1开/关标志位

mov a,73h

cjne a,21h,nequ ;分低位

mov a,74h

cjne a,22h,nequ ;分高位

mov a,75h

cjne a,23h,nequ ;小时低位

mov a,76h

cjne a,24h,nequ ;小时高位

setb 20h3 ;到闹钟设置时间,使能闹钟报警标志位

nequ:pop acc

ret

compare1: ;闹钟2设置时间与当前时间比较

push acc

jnb 20h7,nequ33 ;闹钟2开/关标志位

mov a,73h

cjne a,25h,nequ33

mov a,74h

cjne a,26h,nequ33

mov a,75h

cjne a,27h,nequ33

mov a,76h

cjne a,28h,nequ33

setb 20h3 ;到闹钟设置时间,使能闹钟报警标志位

nequ33:

pop acc

ret

sound:

acall h_half ;check 是否半点

jb 20h1,s23 ;半点则返回

jb 20h0,s23

mov r1,#73h

mov a,74h

swap a

xchd a,@r1

cjne a,#59h,s25

xchd a,@r1

mov r1,#71h

mov a,72h

swap a

xchd a,@r1

s20: cjne a,#56h,s21

ajmp s26

s21: cjne a,#58h,s22

ajmp s26

s22: cjne a,#59h,s25

setb tr0

ajmp s26

s25: xchd a,@r1

s23: ret

s26: jb 20h0,s25

setb tr0

xchd a,@r1

ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;T0中断服务程序,报时铃音信号输出

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

bz: djnz 64h,rrr

jb 20h3,alarmsign;闹钟到点报时有效

jb 20h1,next ;半点报时

mov 64h,#4 ;05KHZ

ajmp justh

alarmsign:

mov 64h,#1; 2KHZ信号

justh:

djnz 66h,ccc

mov 66h,#100

djnz 65h,ccc ;产生1000次中断后关中断

mov 65h,#5 ;响05秒

setb 20h0

clr tr0

reti

next:mov 64h,#2 ;1KHZ信号,半点报时音

ccc: jb 20h3,cc

cpl p14 ;半点报时输出声音信号

rrr: reti

cc: cpl p14 ;闹钟报时输出声音信号

reti

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;T1中断服务程序,定时器主时钟;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

t1int:

clr ea

mov tl1,trr

mov th1,#3ch

djnz r3,sd ;2050MS=1S

mov r3,#20

;cpl p14

inc 79h

clr 20h0

clr 20h1 ;半点报时标志清零

jb 20h3,sdd ;闹钟CHECK有效与否

clr tr0 ;关T0

sd: setb ea

reti

sdd: setb tr0 ;开T0,即开闹铃声音

setb ea

reti

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;显示子函数

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dispnum1:; 显示

ajmp disp_num

disp:

push acc

;jb 20h5,dispnum1;开/关闹钟设置中界面

;jb 20h2,alarmcheck;闹钟设置时间中界面

jb psw5,closedisp

mov r2,#01h;位选通信号输出到P2口

mov r5,#2; 显示的位数循环控制

mov r0,#73h;分别取出内存76H-71H

cjne r3,#10,dot1;在小时和分之间闪烁DOT point

dot1:jnc dsp1

orl 73h,#10h

;dot1:cjne r3,#11,dsp1

;anl 73h,#0efh

dsp1:mov a,r2

;cpl a

mov p2,a

mov a,@r0

dsp2:mov dptr,#bcd

movc a,@a+dptr

mov p0,a

acall delay

mov a,r2

rl a

mov r2,a

inc r0

djnz r5,dsp1

anl 73h,#0efh

pop acc

ret

closedisp:; 关显示

acall delay

mov p0,#0ffh

mov p2,#0

pop acc

ret

;;;;;;;;;;;;;;;;;闹钟的定时设置显示

alarmcheck:

mov r2,#01h

mov r5,#2 ;两位显示22-21H对应定时设置值

mov r0,#21h

dsp21:

mov a,r2

;cpl a

mov p2,a

mov a,@r0

mov dptr,#bcd

movc a,@a+dptr

mov p0,a

acall delay

mov a,r2

rl a

mov r2,a

inc r0

djnz r5,dsp21

pop acc

ret

bcd:; 共阳接法数码管段码表

db 0c0h,0f9h,0a4h,0b0h

db 99h,92h,82h,0f8h

db 80h,90h,88h,83h

db 0c6h,0a1h,86h,8eh; 不带小数点七段

db 40h,79h,24h,30h,19h

db 12h,02h,78h,00h,10h

db 0ffh,0bfh,7fh,3fh; 带小数点七段

delay:mov r6,#4h

tm: mov r4,#0h

ee: djnz r4,ee; 延时2048US=2MS

djnz r6,tm

ret

send:mov r7,#9; 初始化设置

mov r0,#71h

mov a,#0h

ss: mov @r0,a

inc r0

djnz r7,ss

mov 78h,#1h

mov 77h,#01ah

;mov 71h,#1

;mov 72h,#2

;mov 73h,#3

;mov 74h,#4

ret

send1:; 初始化

mov r7,#10

mov r0,#20h

mov a,#0

ss1: mov @r0,a

inc r0

djnz r7,ss1

ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;开/关闹钟界面显示

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

disp_num:

mov p2,#0f7h

mov a,29h ;当前要 *** 作的闹钟号码

mov dptr,#bcd

movc a,@a+dptr

mov p0,a

acall delay

pop acc

ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

key_scanf:; 按钮处理

push acc

mov 70h,#0

orl p1,#0fh

mov a,p1

cpl a

anl a,#07h

jz nokey1

acall daa

acall disp

mov a,p1

cpl a

anl a,#07h

jz nokey1

mov 70h,a

key_wait:; 等按钮放下

acall daa

acall disp

mov a,p1

cpl a

anl a,#07h

jnz key_wait

mov a,70h

jnb acc1,nokey1

cpl psw5

nokey1:; 无按钮

pop acc

ret

a_on_off:

jnb 29h0,iii

cpl 20h6

iii: jnb 29h1,out_2

cpl 20h7

out_2:

ajmp alarmnum

alarmnum:

setb 20h5

acall daa

acall disp

acall key_scanf

clr 20h5

mov a,70h

jb acc0,a_on_off

jb acc1,alar_adj_1

jb acc2,a_num_inc

acall numb

ajmp alarmnum

alarm1_set:

push acc

mov a,70h

jb acc1,alarmnum

alarm1_out:

clr 20h2

pop acc

ret

a_num_inc:

inc 29h

mov a,29h

anl a,#0fh

cjne a,#3,alarmnum

anl 29h,#0

ajmp alarmnum

alar_adj_1:

setb 20h2

acall daa

orl 21h,#10h

acall disp

anl 21h,#0fh

acall key_scanf

mov a,70h

jb acc1,hadj_1

jb acc2,minc_1

ajmp alar_adj_1

madj_2:

acall daa

orl 25h,#10h

acall disp

anl 25h,#0fh

acall key_scanf

mov a,70h

jb acc1,hadj_2

jb acc2,minc_2

ajmp madj_2

hadj_1:

acall daa

orl 23h,#10h

acall disp

anl 23h,#0fh

acall key_scanf

mov a,70h

jb acc1,madj_2

jb acc2,hinc_1

ajmp hadj_1

hadj_2:acall daa

orl 27h,#10h

acall disp

anl 27h,#0fh

acall key_scanf

mov a,70h

jb acc1,alarm1_out

jb acc2,hinc_2

ajmp hadj_2

minc_1:

inc 21h

mov r1,#21h

cjne @r1,#10,alar_adj_1

mov 21h,#0

inc 22h

mov r1,#22h

cjne @r1,#6,alar_adj_1

mov 22h,#0h

ajmp alar_adj_1

minc_2:

inc 25h

mov r1,#25h

cjne @r1,#10,madj_2

mov 25h,#0

inc 26h

mov r1,#26h

cjne @r1,#6,madj_2

mov 26h,#0

ajmp madj_2

hinc_1:

inc 23h

mov r1,#23h

cjne @r1,#10,ss14

mov 23h,#0

inc 24h

ss14:

mov a,24h

swap a

xchd a,@r1

cjne a,#ts,ss15

mov 23h,#0

mov 24h,#0

ajmp hadj_1

ss15:xchd a,@r1

ajmp hadj_1

hinc_2:

inc 27h

mov r1,#27h

cjne @r1,#10,sss14

mov 27h,#0

inc 28h

sss14:

mov a,28h

swap a

xchd a, @r1

cjne a,#ts,sss15

mov 27h,#0

mov 28h,#0

ajmp hadj_2

sss15:

xchd a,@r1

ajmp hadj_2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;时间调整程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

time_adj:;

clr psw5

push acc

mov a,70h

jb acc0,l1;P10调时功能键,每按一次切换一位

ajmp nokeyout

adj_out:

mov 21h,73h

mov 22h,74h

setb p30 ;闭合继电器

setb tr1

nokeyout:

pop acc

ret

QQ: anl 73h,#0fh

anl 74h,#0fh

;anl 78h,#0fh

ret

l1: clr tr1;acall dab; 分钟调整

orl 73h,#10h;点亮分右下角的小数点,当前调整位置

acall disp

acall QQ

acall key_scanf

clr psw5

mov a,70h

jb acc0,h_adj;切换到小时调整

jb acc1,m_inc;P12加1按钮

ajmp l1

h_adj:; 小时调整

;acall dab

orl 74h,#10h

acall disp

acall QQ

acall key_scanf

clr psw5

mov a,70h

jb acc0,out_adj;切换到星期调整

jb acc1,h_inc;小时加1

ajmp h_adj

w_adj:

acall daa

orl 78h,#10h

acall disp

acall QQ

acall key_scanf

clr psw5

mov a,70h

jb acc0,out_adj

jb acc2,w_inc

ajmp w_adj

out_adj:

ajmp adj_out

m_inc:;;;;;;;;;;;;;;; 调整分时,对定时复位,初始化

clr tr1

mov 71h,#0

mov 72h,#0

mov 79h,#0

mov tl1,trr

mov th1,#3ch

mov r3,#20

inc 73h

mov r1,#73h

cjne @r1,#10,s12

mov 73h,#0

inc 74h

mov r1,#74h

cjne @r1,#10,s12

mov 74h,#0

s12: ajmp l1

;;;;;;;;;;;;;;;;;;;;;;调整小时位

h_inc:

inc 74h

mov r1,#74h

cjne @r1,#10,s14

mov 74h,#0

;inc 76h

s14: ajmp h_adj

;mov a,76h

;swap a

;xchd a,@r1

;cjne a,#ts,s15;;;12进制,24进制设置值决定

;mov 75h,#0

;mov 76h,#0

;ajmp h_adj

;s15: ;xchd a,@r1

;ajmp h_adj

;;;;;;;;;;;;;;;;;;;;;;;调整星期位

w_inc:

inc 78h

mov r1,#78h

cjne @r1,#8,s16

mov 78h,#1h

s16: ajmp w_adj

;;;;;;;;;;;;;;;;;;;;;;;当前闹钟开/关情况报告位

numb:clr 29h4

jnb 29h0,iii1

jnb 20h6,iii1

setb 29h4

iii1:jnb 29h1,out_21

jnb 20h7,out_21

setb 29h4

out_21:

jnb 20h6,out_12

jnb 20h7,out_13

mov 77h,#1dh

ajmp out_22

out_12:

jnb 20h7,out_14

mov 77h,#1bh

ajmp out_22

out_13:

mov 77h,#1ch

ajmp out_22

out_14:

mov 77h,#1ah

out_22:

ret

end

以上就是关于用C++编写图形时钟程序全部的内容,包括:用C++编写图形时钟程序、跪求C语言编写的时钟(能修改时钟时间,且时钟是指针式的 只编写修改时间的部分也行)、急求用c++语言编写时钟表的程序.等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9311379.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存