人求助关于VB编写小闹钟的程序。

人求助关于VB编写小闹钟的程序。,第1张

分类: 电脑/网络 >> 程序设计 >> 其他编程语言

问题描述:

我从网上下载了一个代码看看,地址是:bc-/Article/kfyy/vb/bcsl/200512/2466我把代码弄上去之后发现有一些错误,最关键的是其中的“AlarmTime”这个变量的类型以及格式问题。请大家帮忙看一下该怎么改?

代码如下;

Option Explicit

Dim AlarmTime '申明变量(这个样子定义变量行吗?是什么类型?)

Private Sub Command1_Click()

Call dialog '调用dialog子程序

End Sub

Private Sub Form_Load()

Command3Enabled = False '初始化时mand3为不可用的

AlarmTime=""(这样的话不就是当成字符串的形式了么?

End Sub

Private Sub Command2_Click()

AlarmTime = InputBox("请输入你想设定的时间,例如(19:12:00)", "小闹钟")

If AlarmTime = "Then Exit Sub"

If Not IsDate(AlarmTime) Then

MsgBox "你所输入的不是时间格式,请重试!", , "Wrong"

Else

AlarmTime = CDate(AlarmTime)

End If

'判断输入的是否可转换成time格式

'isdate函数是判断输入的是否可转换成date格式

End Sub

Private Sub Command3_Click()

Call deng

'调用deng子程序

End Sub

Private Sub Form_Click()

frmAboutShow

'显示关于对话框

End Sub

Private Sub Form_Resize()

If WindowState = 1 Then

Call mintime

Else

Caption = "小闹钟"

End If

'如果窗口被最小化,则调用mintime程序

End Sub

Private Sub mintime()

Caption = Format(Time, "long Time")

'使用长时间格式来显示时间

End Sub

Private Sub Timer1_Timer()

If lbltimeCaption <> CStr(Time) Then

lbltimeCaption = Time

End If

'显示时间每秒钟的变化

If Time >= AlarmTime Then

Call deng

End If

'判断如果现在的时间超过了设定的时间,则调用deng子程序

If WindowState = 1 Then

If Minute(CDate(Caption)) <> Minute(Time) Then

mintime

End If

End If

'最小化时显示时间每分钟的变化

End Sub

Sub dialog()

CommonDialog1Flags = cdlCFBoth

CommonDialog1ShowOpen

Label1Caption = CommonDialog1FileName

If Label1 <> " Then

Command3Enabled = -1

Else

Exit Sub

End If

'把打开的文件名给于label1

'如果label1不为空时,则mand3即可用

End Sub

Sub deng()

Dim ss

ss = Shell(Label1Caption, 1)

End

'启动指定的文件,并且结束小闹钟程序

End Sub

括号里面的都是错误的地方,希望各位帮我看看怎么错了谢谢啊。

解析:

修改完毕,并添加了注释

-------------------------------------------

Option Explicit

Dim AlarmTime '申明变量(这个样子定义变量行吗?是什么类型?)

'将AlarmTime申明为变体型(Variant)

Private Sub Command1_Click()

Call dialog '调用dialog子程序

End Sub

Private Sub Form_Load()

Command3Enabled = False '初始化时mand3为不可用的

AlarmTime = "" '(这样的话不就是当成字符串的形式了么?

'此时AlarmTime为字符串型(String)

End Sub

Private Sub Command2_Click()

'AlarmTime = InputBox("请输入你想设定的时间,例如(19:12:00)", "小闹钟")

AlarmTime = InputBox("请输入你想设定的时间,例如(19:12:00)", "小闹钟")

'此时AlarmTime为字符串型(String)

'If AlarmTime = "Then Exit Sub"

If AlarmTime = "" Then Exit Sub

If Not IsDate(AlarmTime) Then

MsgBox "你所输入的不是时间格式,请重试!", , "Wrong"

Else

AlarmTime = CDate(AlarmTime)

'此时AlarmTime为日期型(Date)

End If

'判断输入的是否可转换成time格式

'isdate函数是判断输入的是否可转换成date格式

End Sub

Private Sub Command3_Click()

Call deng

'调用deng子程序

End Sub

Private Sub Form_Click()

frmaboutShow

'显示关于对话框

End Sub

Private Sub Form_Resize()

If WindowState = 1 Then

Call mintime

Else

Caption = "小闹钟"

End If

'如果窗口被最小化,则调用mintime程序

End Sub

Private Sub mintime()

Caption = Format(Time, "long Time")

'使用长时间格式来显示时间

End Sub

Private Sub Timer1_Timer()

If lbltimeCaption <> CStr(Time) Then

lbltimeCaption = Time

End If

'显示时间每秒钟的变化

If Time >= AlarmTime Then

Call deng

End If

'判断如果现在的时间超过了设定的时间,则调用deng子程序

If WindowState = 1 Then

If Minute(CDate(Caption)) <> Minute(Time) Then

mintime

End If

End If

'最小化时显示时间每分钟的变化

End Sub

Sub dialog()

CommonDialog1Flags = cdlCFBoth

CommonDialog1ShowOpen

Label1Caption = CommonDialog1FileName

'If Label1 <> " Then

If Label1 <> "" Then

Command3Enabled = -1

Else

Exit Sub

End If

'把打开的文件名给于label1

'如果label1不为空时,则mand3即可用

End Sub

Sub deng()

Dim ss

ss = Shell(Label1Caption, 1)

End

'启动指定的文件,并且结束小闹钟程序

End Sub

#include <at89x52h>

#include <DS1302h>

//定义共阳极字型码0123456789-

unsigned char code dispcode[]=;

unsigned char time[]=;//用来储存时间

unsigned char date[]=;//用来储存日期

unsigned char year[]=;//用来储存年份

unsigned char week[]=;//用来储存星期

SYSTEMTIME time1; //在ds1302h文件中已经定义了一个名字为SYSTEMTIME的结构体,在这里我们定义一个变量名

//为time的SYSTEMTIME结构体

void delay(unsigned char i) //延时子程序

{

unsigned char j;

while((i--)!=0)

{

for(j=123;j>0;j--);

}

}

unsigned char button_time(n,x,y) //时钟调整子程序

unsigned char n,x,y;

{

if(P1_7==0)

{

delay(50);

if(P1_7==0)

{

n++;

if(n==x)

n=0;

while(P1_7==0); //等待按键释放

}

}

if(P1_5==0)

{

delay(50);

if(P1_5==0)

{

if(n==0)

n=y;

else

n--;

while(P1_5==0);

}

}

return n;

}

unsigned char button_date(n,x,y) //日期调整子程序

unsigned char n,x,y;

{

if(P1_7==0)

{

delay(50);

if(P1_7==0)

{

n++;

if(n==x)

n=1;

while(P1_7==0);

}

}

if(P1_5==0)

{

delay(50);

if(P1_5==0)

{

if(n==1)

n=y;

else

n--;

while(P1_5==0);

}

}

return n;

}

unsigned char button_year(n,x,y) //年份调整子程序

unsigned char n,x,y;

{

if(P1_7==0)

{

delay(50);

if(P1_7==0)

{

n++;

if(n==x)

n=2;

while(P1_7==0);

}

}

if(P1_5==0)

{

delay(50);

if(P1_5==0)

{

if(n==2)

n=y;

else

n--;

while(P1_5==0);

}

}

return n;

}

void display(minute10,minute1,hour10,hour1) //显示子程序

unsigned char minute10,minute1,hour10,hour1;

{

P2=0xfe;

P0=dispcode[minute10];//显示分的十位

delay(1);

P2=0xfd;

P0=dispcode[minute1]; //显示分的个位

delay(1);

P2=0xfb;

P0=dispcode[hour10]; //显示时的十位

delay(1);

P2=0xf7;

P0=dispcode[hour1]; //显示时的个位

delay(1);

}

void display1(week1)

unsigned char week1;

{

P2=0xef;

P0=dispcode[week1];

delay(1);

}

void main()

{

unsigned char flag,aa=2,bb=0;

Initial_DS1302(); //初始化DS1302这个时钟芯片,

while(1)

{

DS1302_GetTime(&time1); //读取时间参数

time[3]=(time1Minute)%10; //把分的个位数据存入time[3]

time[2]=(time1Minute)/10; //把分的十位数据存入time[2]

time[1]=(time1Hour)%10; //把时的个位数据存入time[1]

time[0]=(time1Hour)/10; //把时的十位数据存入time[0]

date[3]=(time1Day)%10;

date[2]=(time1Day)/10;

date[1]=(time1Month)%10;

date[0]=(time1Month)/10;

year[1]=(time1Year)%10;

year[0]=(time1Year)/10;

week[0]=(time1Week);

display1(week[0]); //显示星期

if(P1_4==0) //如果按下Time Start键一下,时钟开始正常显示时间,再按一下,显示日期,再按一下,显示年份

{

delay(50);

if(P1_4==0)

{

flag++;

if(flag>2)

{

flag=0;

}

}

while(P1_4==0);

}

if(P1_6==0) //如果按下Time Set键一下,开始显示日期,再按一下开始显示年份,再按一下,进入年份,日期,星期和时间的调节模式

{

delay(50);

if(P1_6==0)

{

flag++;

if(flag>8)

{

flag=0;

}

}

while(P1_6==0);

}

switch(flag)

{

case 0:display(time[0],time[1],time[2],time[3]); //调用子函数display,把存入数组time的数据给显示出来

break;

case 1:display(date[0],date[1],date[2],date[3]); //调用子函数display,把存入数组date的数据给显示出来

break;

case 2:display(aa,bb,year[0],year[1]); //调用子函数display,把存入数组year的数据给显示出来

break;

case 3:time1Year=button_year(time1Year,2099,2098); //调整年

DS1302_SetTime(0x8c,time1Year);

display(aa,bb,year[0],year[1]);

break;

case 4:time1Month=button_date(time1Month,13,12); //调整月

DS1302_SetTime(0x88,time1Month);

display(date[0],date[1],10,10);

break;

case 5:time1Day=button_date(time1Day,32,31); //调整日

DS1302_SetTime(0x86,time1Day);

display(10,10,date[2],date[3]);

break;

case 6:time1Week=button_date(time1Week,8,7); //调整星期

DS1302_SetTime(0x8a,time1Week);

display1(week[0]);

break;

case 7:time1Hour=button_time(time1Hour,24,23); //调整时

DS1302_SetTime(0x84,time1Hour);

display(time[0],time[1],10,10);

break;

case 8:time1Minute=button_time(time1Minute,60,59); //调整分

DS1302_SetTime(0x82,time1Minute);

display(10,10,time[2],time[3]);

break;

}

}

}

#include<reg52h>

#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初值 晶振110592

TL0=0x00;

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

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

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

while(1)

{

hs=hour/10; //时分秒HHMMSS

hg=hour%10;

mis=minu/10;

mig=minu%10;

ss=sec/10;

sg=sec%10;

ms=mon/10; //月日-星期MMDD-W

mg=mon%10;

ds=day/10;

dg=day%10;

w=week;

nhs=n_hour/10; //闹钟定时HHMMSS

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=1;led3=1;led1=~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=1;led3=1;led2=~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=1;led2=1;led3=~led3;}

// else

// {led3=1;}

}

zd_clock(); //整点报时

nz_clock(); //闹钟

}

}

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

{

TMOD=0x01;

TH0=0x4c; //50ms初值 晶振110592

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=0;year++;}

}

}

else //非闰年

{

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

{

day=0;

mon++;

if(mon==13)

{mon=0;year++;}

}

}

}

}

}

}

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=k;i>0;i--)

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

}

1设置变量

uchar TC_20ms;20毫秒计数

uchar TC_100ms;100毫秒计数

uchar TC_1s;1秒计数

uchar TC_60s;60秒计数

uchar TC_3600s;1小时计数

uchar TF_200ms;20毫秒到时标记

uchar TF_100ms;100毫秒到时标记

uchar TF_1s;1秒到时标记

uchar TF_60s;60秒到时标记

uchar TF_3600s;1小时到时标记

用定时器定时产生20ms定时

void init() interrupt 1

//定时常数=65535-(晶体频率/分频数定时周期)-20

{

//重装定时器;

TF_20MS=1;

TC_20MS++;

if(TC_20MS==5){TC_20MS=0;

TF_100MS=1;

TC_100MS++;

if(GC_100MS==10)

{TC_100MS=0;

TF_1S=1;

TC_1S++;

if(TC_1S==60){

TC_1S=0;

…………

}

}

}

}

main()

{

unsigned long waiting_time_s=10000;

unsigned long beep_time_100ms=100;

unsigned long sys_time_s;

unsigned long beep_100ms;

//初始化定时器;

while(1)

{

if(TF_1S==1){sys_time_s++;TF_1S=0;}

if(sys_time_s>=waiting_time_s)

{

if(TF_100MS==1){beep_100ms++;TF_100MS=0;}

if(beep_time_100ms>beep_100ms)

beep();//响铃函数

}

}

}

///仅仅是思路,希望有帮助。

闹钟在编程思维上有两部分:计时和报警

大体思路如下:

用一个timer,每秒钟检测系统时间,用now()。(如果你只想精确到分钟就每分钟检测一次,看你需要了)

当系统时间等于设定值时,用msgbox提醒用户时间已到

如果msgbox不够明显,可以用“Shell AppPath & "\程序名1EXE"启动一个音乐播放器,播放事先设置好的音乐,或实现你自己想要的效果。

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

;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

import javautil;

import javaawt;

import javaapplet;

import javatext;

public class AlarmClock extends Applet implements Runnable

{

Thread timer=null; //创建线程timer

Image clockp,gif1,gif2,clock6,clock7; //clockp:闹钟的外壳,闹铃和报时鸟

int s,m,h,hh;

AudioClip ipAu,danger,chirp;

boolean canPaint=true;

boolean flag=false;

boolean strike=true;

int counter=0;

int lasts;

Image offscreen_buf=null;

int i,j,t=0;

int timeout=166;

int lastxs=0,lastys=0,lastxm=0,lastym=0,lastxh=0,lastyh=0;

Date dummy=new Date(); //生成Data对象

GregorianCalendar cal=new GregorianCalendar();

SimpleDateFormat df=new SimpleDateFormat("yyyy MM dd HH:mm:ss");//设置时间格式

String lastdate=dfformat(dummy);

Font F=new Font("TimesRoman",FontPLAIN,14);//设置字体格式

Date dat=null;

Date timeNow=null;

Color fgcol=Colorblue;

Color fgcol2=ColordarkGray;

Panel setpanel;

Color backcolor=Colorpink;

TextField showhour,showmin,showsec,sethour,setmin,setsec;//显示当前时间文本框和定时文本框

Button onbutton;

Button offbutton;

Label hlabel1,mlabel1,slabel1,hlabel2,mlabel2,slabel2;//显示时间单位时所用的标签(时、分、秒)

Label info1=new Label("欢迎使用定时提醒闹钟"),info2=new Label("");

Label note1=new Label("当前时间:"),note2=new Label("闹钟设置:");

boolean setalerm=false,clickflag=false;//判断是否响铃和振动

int fixh=0,fixm=0,fixs=0;//记录闹钟的定时

public void init()//初始化方法

{

Integer gif_number;

int fieldx=50,fieldy1=120,fieldy2=220,fieldw=30,fieldh=20,space=50;//显示时间和定时文本框的定位参数

setLayout(null); //将布局管理器初始化为null

setpanel=new Panel();

setpanelsetLayout(null);

setpaneladd(note1);

setpaneladd(note2);

note1setBounds(30,100,60,20);

note1setBackground(backcolor);

note1setForeground(Colorblack);

note2setBounds(30,180,60,20);

note2setBackground(backcolor);

note2setForeground(Colorblack);

hlabel1=new Label();

mlabel1=new Label();

slabel1=new Label();

hlabel2=new Label();

mlabel2=new Label();

slabel2=new Label();

//显示当前时间用的文本框

showhour=new TextField("00",5);

showmin=new TextField("00",5);

showsec=new TextField("00",5);

//定时用的文本框(时、分、秒)

sethour=new TextField("00",5);

setmin=new TextField("00",5);

setsec=new TextField("00",5);

//当前时间用的文本框的位置、大小

setpaneladd(showhour);

showhoursetBounds(fieldx,fieldy1,fieldw,fieldh);

showhoursetBackground(Colorwhite);

//在文本框后加入单位“时”

setpaneladd(hlabel1);

hlabel1setText("时");

hlabel1setBackground(backcolor);

hlabel1setForeground(Colorblack);

hlabel1setBounds(fieldx+fieldw+3,fieldy1,14,20);

fieldx=fieldx+space;

//当前时间的分钟文本框的位置、大小

setpaneladd(showmin);

showminsetBounds(fieldx,fieldy1,fieldw,fieldh);

showminsetBackground(Colorwhite);

//在文本框后加入单位“分”

setpaneladd(mlabel1);

mlabel1setText("分");

mlabel1setBackground(backcolor);

mlabel1setForeground(Colorblack);

mlabel1setBounds(fieldx+fieldw+3,fieldy1,14,20);

fieldx=fieldx+space;

//当前时间的秒文本框的位置、大小

setpaneladd(showsec);

showsecsetBounds(fieldx,fieldy1,fieldw,fieldh);

showsecsetBackground(Colorwhite);

//在文本框后加入单位“秒”

setpaneladd(slabel1);

slabel1setText("秒");

slabel1setBackground(backcolor);

slabel1setForeground(Colorblack);

slabel1setBounds(fieldx+fieldw+3,fieldy1,14,20);

fieldx=50;

//定时的小时文本框的位置、大小

setpaneladd(sethour);

sethoursetBounds(fieldx,fieldy2,fieldw,fieldh);

sethoursetBackground(Colorwhite);

//在文本框后加入单位“时”

setpaneladd(hlabel2);

hlabel2setText("时");

hlabel2setBackground(backcolor);

hlabel2setForeground(Colorblack);

hlabel2setBounds(fieldx+fieldw+3,fieldy2,14,20);

fieldx=fieldx+space;

//定时的分钟文本框的位置、大小

setpaneladd(setmin);

setminsetBounds(fieldx,fieldy2,fieldw,fieldh);

setminsetBackground(Colorwhite);

//在文本框后加入单位“分”

setpaneladd(mlabel2);

mlabel2setText("分");

mlabel2setBackground(backcolor);

mlabel2setForeground(Colorblack);

mlabel2setBounds(fieldx+fieldw+3,fieldy2,14,20);

fieldx=fieldx+space;

//定时的秒文本框的位置、大小

setpaneladd(setsec);

setsecsetBounds(fieldx,fieldy2,fieldw,fieldh);

setsecsetBackground(Colorwhite);

//在文本框后加入单位“秒”

setpaneladd(slabel2);

slabel2setText("秒");

slabel2setBackground(backcolor);

slabel2setForeground(Colorblack);

slabel2setBounds(fieldx+fieldw+3,fieldy2,14,20);

//设置闹钟控制按钮(on,off)

onbutton=new Button("开");

offbutton=new Button("关");

setpaneladd(onbutton);

setpaneladd(offbutton);

onbuttonsetBounds(90,180,40,20);

offbuttonsetBounds(140,180,40,20);

//加入一些附加的信息标签(题头,题尾)

setpaneladd(info1);

info1setBackground(backcolor);

info1setForeground(Colorblue);

info1setBounds(50,50,150,20);

setpaneladd(info2);

info2setBackground(backcolor);

info2setForeground(Colorblue);

info2setBounds(150,280,100,20);

//将面板加入当前容器中,并设置面板的大小和背景色

add(setpanel);

setpanelsetBounds(300,1,250,420);

setpanelsetBackground(backcolor);

//获取声音文件

ipAu=getAudioClip(getDocumentBase(),"bells/仙剑mid");

danger=getAudioClip(getDocumentBase(),"bells/0mid");

chirp=getAudioClip(getDocumentBase(),"bells/3mid");

int xcenter,ycenter,s,m,h;

xcenter=145;

ycenter=162;

s=(int)calget(CalendarSECOND);

m=(int)calget(CalendarMINUTE);

h=(int)calget(CalendarHOUR_OF_DAY);

//初始化指针位置

lastxs=(int)(Mathcos(s314f/30-314f/2)30+xcenter);

lastys=(int)(Mathsin(s314f/30-314f/2)30+ycenter);

lastxm=(int)(Mathcos(m314f/30-314f/2)25+xcenter);

lastym=(int)(Mathsin(m314f/30-314f/2)25+ycenter);

lastxh=(int)(Mathcos((h30+m/2)314f/180-314f/2)18+xcenter);

lastyh=(int)(Mathsin((h30+m/2)314f/180-314f/2)18+ycenter);

lasts=s;

MediaTracker mt=new MediaTracker(this);//创建Tracke对象

clockp=getImage(getDocumentBase(),"休闲png");

gif1=getImage(getDocumentBase(),"gif1gif");

gif2=getImage(getDocumentBase(),"gif2gif");

clock6=getImage(getDocumentBase(),"clock6gif");

clock7=getImage(getDocumentBase(),"clock7gif");

mtaddImage(clockp,i++);

mtaddImage(gif1,i++);

mtaddImage(gif2,i++);

mtaddImage(clock6,i++);

mtaddImage(clock7,i++);

try{mtwaitForAll();}catch(InterruptedException e){};//等待加载结束

resize(600,420);//设置窗口大小

}

public void paint(Graphics g){//重写paint()方法

int xh,yh,xm,ym,xs,ys,strike_times;

int xcenter,ycenter;

String today;

Integer gif_number;

xcenter=148;

ycenter=186;

dat=new Date();

calsetTime(dat);

//读取当前时间

s=(int)calget(CalendarSECOND);

m=(int)calget(CalendarMINUTE);

h=(int)calget(CalendarHOUR_OF_DAY);

today=dfformat(dat);

//指针位置

xs=(int)(Mathcos(s314f/30-314f/2)30+xcenter);

ys=(int)(Mathsin(s314f/30-314f/2)30+ycenter);

xm=(int)(Mathcos(m314f/30-314f/2)25+xcenter);

ym=(int)(Mathsin(m314f/30-314f/2)25+ycenter);

xh=(int)(Mathcos((h30+m/2)314f/180-314f/2)18+xcenter);

yh=(int)(Mathsin((h30+m/2)314f/180-314f/2)18+ycenter);

//设置字体和颜色

gsetFont(F);

gsetColor(fgcol);

gsetColor(fgcol2);

gsetColor(getBackground());

gfillRect(1,1,634,419);

gdrawImage(clockp,75,110,this);

gdrawImage(clock6,83,280,this);

gsetColor(fgcol2);

gsetColor(getBackground());

gsetColor(fgcol2);

//以数字方式显示年、月、日和时间

gdrawString(today,55,415);

gdrawLine(xcenter,ycenter,xs,ys);

gsetColor(fgcol);

//画指针

gdrawLine(xcenter,ycenter-1,xm,ym);

gdrawLine(xcenter-1,ycenter,xm,ym);

gdrawLine(xcenter,ycenter-1,xh,yh);

gdrawLine(xcenter-1,ycenter,xh,yh);

lastxs=xs;lastys=ys;

lastxm=xh;lastym=ym;

lastxh=xh;lastyh=yh;

lastdate=today;

if(h<12)hh=h;//将系统时间变换到0-11区间

else hh=h-12;

if(hh==0) strike_times=12;//计算整点时钟声数

else strike_times=hh;

if((s==0&&m==0)||flag){//判断是否整点,是否是主动刷新

if(counter<strike_times){

flag=true;

gdrawImage(gif2,115,35,this);

if(lasts!=s){

if(strike){

counter++;

dangerplay();//播放闹铃声

}

if(strike)strike=false;

else strike=true;

}

}

else {

counter=0;

flag=false;

}

}

else

gdrawImage(gif1,115,35,this);

int timedelta;//记录当前时间与闹铃定时的时差

Integer currh,currm,currs;//分别记录当前的时、分、秒

timeNow=new Date();

currh=new Integer(timeNowgetHours());

currm=new Integer(timeNowgetMinutes());

currs=new Integer(timeNowgetSeconds());

//判断是否要更新当前显示的时间,这样可以避免文本框出现频率闪动

if(currhintValue()!=IntegervalueOf(showhourgetText())intValue())

showhoursetText(currhtoString());

if(currmintValue()!=IntegervalueOf(showmingetText())intValue())

showminsetText(currhtoString());

if(currsintValue()!=IntegervalueOf(showsecgetText())intValue())

showsecsetText(currhtoString());

if(setalerm){ //判断是否设置了闹钟

//判断当前时间是否为闹钟所定的时间

if((currhintValue()==fixh)&&(currmintValue()==fixm)&&(currsintValue()==fixs))

clickflag=true;

timedelta=currmintValue()60+currsintValue()-fixm60-fixs;

if((timedelta<60)&&(clickflag==true)){ //若当前时间与闹钟相差时间达到60秒

chirpplay();

gdrawImage(clock7,83,280,this);

}

else{

chirpstop();

clickflag=false;

}

}

if(lasts!=s)

ipAuplay();//播放滴答声

lasts=s;

if(canPaint){

t+=1;

if(t==12)t=0;

}

canPaint=false;

dat=null;

}

public void start(){

if(timer==null){

timer=new Thread(this);//将timer实例化

timerstart();

}

}

public void stop(){

timer=null;

}

public void run(){

while(timer!=null){

try{timersleep(timeout);}catch(InterruptedException e){}

canPaint=true;

repaint();//刷新画面

}

timer=null;

}

public void update(Graphics g){ //采用双缓冲技术的update()方法

if(offscreen_buf==null)

offscreen_buf=createImage(600,420);

Graphics offg=offscreen_bufgetGraphics();

offgclipRect(1,1,599,419);

paint(offg);

Graphics ong=getGraphics();

ongclipRect(1,1,599,419);

ongdrawImage(offscreen_buf,0,0,this);

}

public boolean action(Event evt,Object arg){ //按钮事件处理函数

if(evttarget instanceof Button){

String lable=(String)arg;

if(lableequals("开")){

setalerm=true;

//获取输入的时间

fixh=IntegervalueOf(sethourgetText())intValue();

fixm=IntegervalueOf(setmingetText())intValue();

fixs=IntegervalueOf(setsecgetText())intValue();

clickflag=false;

}

if(lableequals("关")){

setalerm=false;

if(chirp!=null)

chirpstop();

clickflag=false;

}

return true;

}

return false;

}

}

//

//实现功能:本程序实现在P1口模拟一个流水灯程序

//

#include <reg51h>

#define p_out P1 //宏定义输出的i/o口为P1

//时间延迟函数

//描 述:用指令实现延时一段时间

//入口参数:int i,为时间延迟参数

//

void delay_time(int i)

{

while(i)

i--;

}

//主函数

//描 述:实现在P1口模拟一个流水灯程序

//

void main(void)

{unsigned char i=0; //初始化一个局部变量为0

p_out=0xff; //初始化将要输出的i/o口,输出高电平,熄灭所有灯

while(1)

{

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

{

p_out=~(1<<i);//点亮一个灯,

delay_time(50000); //延迟一段时间

p_out=0xff;//熄灭所有灯

}

}

}

//

//

//实现功能:把键盘输入的键盘码,用led显示出来

//

#include <reg51h>

#define p_key P1

#define led_date P0

#define choose_p P2

unsigned char change(unsigned char i);

unsigned int display_num=0;

//时间延迟函数

//描 述:用指令实现延时一段时间

//入口参数:int i,为时间延迟参数

//

void delay_time(int i)

{

while(i)

i--;

}

//按键扫描函数

//描 述:对44键盘进行扫描,程序只适合44键盘使用,

// 键盘占用一组完整的i/o口,在使用这个程序前

// 要宏定义p_key为用户实际连接键盘的i/o口

// #define p_key Pn;//(n=0、1、2、3)

//返回参数:若有检测到按键就返回按键的编号,否则返回0xff

//

unsigned char read_key(void)

{

unsigned char j,key,key_buf=0;

p_key=0xff;

//检测是否有建按下//

p_key=0xf0;

key=p_key;

if(key==0xf0)

{

return(0xff);//没按键按下,返回0xff

}

//有按下,延时去抖//

delay_time(5000);

//确认是否有建按下//

p_key=0xf0;

key=p_key;

if(key==0xf0)

{

return(0xff);//没按键按下,返回0xff

}

//真的有按键按下,扫描是哪一行有按键按下//

for(j=0;j<4;j++)

{key=p_key&(0x10<<j);

if (key)

{

key=p_key;

}

else

{

key_buf=j4;

p_key=~(0x10<<j);//第j行的按键按下了,第j行输出0,其他的i/o口输出1

//扫描是第j行的哪个按键按下//

for(j=0;j<4;j++)

{

key=p_key&(1<<j);

if (key)

{

key=p_key;

}

else

{

key_buf+=j;

return(key_buf);//扫描到按键的确定位置,返回按键的编号

}

}

}

}

//没扫描到按键,//

return(0xff);

}

//七段数码管显示函数

//描 述:对四位的扫描型七段数码管进行扫描显示,在使用

// 前要定义一个全局变量display_num

// unsigned int display_num;

//入口参数:unsigned int num,要显示的数字(0-9999)

//

void display(unsigned int num)

{

if(num<10000)

{

display_num=num;

}

choose_p|=3;//先关显示

led_date=change(display_num/1000);//得到千位的数字,并转换成七段码型

choose_p&=0xfe;//选通千位

delay_time(50);//延时一段时间

choose_p|=1;//关显示

display_num=display_num%1000;

led_date=change(display_num/100);//得到百位的数字,并转换成七段码型

choose_p&=0xfd;//选通百位

delay_time(50);//延时一段时间

choose_p|=2;//关显示

display_num=display_num%100;

led_date=change(display_num/10);//得到十位的数字,并转换成七段码型

choose_p&=0xfb;//选通十位

delay_time(50);//延时一段时间

choose_p|=4;//关显示

led_date=change(display_num%10);//得到个位的数字,并转换成七段码型

choose_p&=0xf7;//选通十位

delay_time(50);//延时一段时间

choose_p|=8;//关显示

}

//数字-码型转换函数

//描 述:把数字转换成七段码型,此程序仅配合共阳的七

// 段数码管使用

//入口参数:unsigned char i,要转换的数字(0-9),

//返回参数:转换后的七段码型,0xff表示转换失败

//

unsigned char change(unsigned char i)

{

switch(i)

{

case 0:

return(0xc0);//0的七段码型

case 1:

return(0xf9);//1的七段码型

case 2:

return(0xa4);//2的七段码型

case 3:

return(0xb0);//3的七段码型

case 4:

return(0x99);//4的七段码型

case 5:

return(0x92);//5的七段码型

case 6:

return(0x82);//6的七段码型

case 7:

return(0xf8);//7的七段码型

case 8:

return(0x80);//8的七段码型

case 9:

return(0x90);//9的七段码型

default:

return(0xff);//转换失败

}

}

//主函数

//描 述:把键盘输入的键盘码,用led显示出来

//

int main(void)

{unsigned char i;

while(1)

{

i=read_key();//扫描键盘

if(i<16)

display((unsigned int)i);//有效的键盘值

else

display(0xffff);//数据无效

}

}

//两个程序加起来就可以完成你要求的功能,有说明,你认真看一下吧。

以上就是关于人求助关于VB编写小闹钟的程序。全部的内容,包括:人求助关于VB编写小闹钟的程序。、c语言 提示时间 程序(带声音提示时间、就是闹铃)要在DOS在运行的。做好了加50分、用C语言编写AT89C51单片机程序,设计一个智能数字钟。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存