
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
我从网上下载了一个代码看看,地址是: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单片机程序,设计一个智能数字钟。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)