
你的代码有几处问题:
1
Private Sub Form_Load()
Dim nwidth, nheight, nhourlen, nminlen, nseclen '你把nmainlen打错了
Dim Picture1
这些变量是过程变量,不能再其他过程使用,且当Form_Load事件结束时,这些变量就不存在了。所以要把这些变量提前到通用区域,也就是代码的最前面。
2
Dim Picture1
这什么意思呀?我想,你是直接定义一个PictureBox控件变量,然后就能使用它。这是错误的,要么你就老实一点在窗体上添加PictureBox控件,要么你就用动态添加PictureBox控件。算了,你还是老实一点在窗体上添加PictureBox控件吧。
3
nwidth = Picture1Width - 20
nheight = Picture1Height - 10
这有问题。如果PictureBox控件的ScaleMode属性改变时,就会出现意想不到的结果了。改为如下:
nwidth = Picture1ScaleWidth
nheight = Picture1ScaleHeight
4
nminute = Minute(Time()) + nsecond / 60
nhour = (Hour(Time()) Mod 12) + nminute / 60 + nsecond / 3600
因为nminute已经包含了nsecond,所以nhour的计算就不需要再加上nsecond了,改为nhour = (Hour(Time()) Mod 12) + nminute / 60就行了。
5
carc_是什么意思呀?你自定义的函数?但你没有定义呀。
6
Picture1Line里的画线有点问题。
改成如下:
在通用区域Dim Pi As Single
在Form_Load事件Pi=31415926
在Timer1_Timer事件里:
Dim nSecond, nMinute, nHour As Integer
Dim X As Single, Y As Single
Picture1Cls
nSecond = Second(Time())
nMinute = Minute(Time()) + nSecond / 60
nHour = (Hour(Time()) Mod 12) + nMinute / 60
X = nHourlen Sin(nHour 30 / 180 Pi)
Y = nHourlen Cos(nHour 30 / 180 Pi)
Picture1DrawWidth = 3
Picture1ForeColor = RGB(255, 0, 0)
Picture1Line (nWidth / 2 - X / 10, nHeight / 2 + Y / 10)-(nWidth / 2 + X, nHeight / 2 - Y)
X = nMinlen Sin(nMinute 6 / 180 Pi)
Y = nMinlen Cos(nMinute 6 / 180 Pi)
Picture1DrawWidth = 2
Picture1ForeColor = RGB(0, 255, 0)
Picture1Line (nWidth / 2 - X / 10, nHeight / 2 + Y / 10)-(nWidth / 2 + X, nHeight / 2 - Y)
X = nSeclen Sin(nSecond 6 / 180 Pi)
Y = nSeclen Cos(nSecond 6 / 180 Pi)
Picture1DrawWidth = 1
Picture1ForeColor = RGB(0, 0, 255)
Picture1Line (nWidth / 2 - X / 10, nHeight / 2 + Y / 10)-(nWidth / 2 + X, nHeight / 2 - Y)
7
没有刻度盘。在Form_Load事件添加代码如下:
Dim i As Integer
Dim X As Single, Y As Single
Picture1AutoRedraw = True
Picture1DrawWidth = 8
Picture1ForeColor = RGB(255, 255, 0)
For i = 1 To 12
X = (nSeclen + 80) Sin(i 30 / 180 Pi)
Y = (nSeclen + 80) Cos(i 30 / 180 Pi)
Picture1PSet (nWidth / 2 + X, nHeight / 2 - Y)
X = nSeclen 12 Sin(i 30 / 180 Pi) - Picture1TextHeight(CStr(i)) / 2
Y = nSeclen 12 Cos(i 30 / 180 Pi) + Picture1TextHeight(CStr(i)) / 2
Picture1CurrentX = nWidth / 2 + X
Picture1CurrentY = nHeight / 2 - Y
Picture1Print CStr(i)
Next i
Picture1AutoRedraw = False
1、一款动态的小人时钟代码
2、分享一个很个性的时钟代码,动态小人型,效果如下,把代码放到网站就会动了,鼠标放在时/分/秒上,会放大显示
3、下面以wordpress博客为例,首选添加一个小工具,在后台---外观---小工具,添加一个文本模块,把代码(在线咨询客服获取代码)复制粘贴进去保存即可
注意事项:以上为wordpress博客放置方法,其他程序网站请自行测试
用这个程序吧 C和汇编都有。
数字钟[★]
1. 实验任务
(1. 开机时,显示12:00:00的时间开始计时;
(2. P00/AD0控制“秒”的调整,每按一次加1秒;
(3. P01/AD1控制“分”的调整,每按一次加1分;
(4. P02/AD2控制“时”的调整,每按一次加1个小时;
2. 电路原理图
图4201
3. 系统板上硬件连线
(1. 把“单片机系统”区域中的P10-P17端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;
(2. 把“单片机系统:区域中的P30-P37端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;
(3. 把“单片机系统”区域中的P00/AD0、P01/AD1、P02/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;
4. 相关基本知识
(1. 动态数码显示的方法
(2. 独立式按键识别过程
(3. “时”,“分”,“秒”数据送出显示处理方法
5. 程序框图
6. 汇编源程序
SECOND EQU 30H
MINITE EQU 31H
HOUR EQU 32H
HOURK BIT P00
MINITEK BIT P01
SECONDK BIT P02
DISPBUF EQU 40H
DISPBIT EQU 48H
T2SCNTA EQU 49H
T2SCNTB EQU 4AH
TEMP EQU 4BH
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START: MOV SECOND,#00H
MOV MINITE,#00H
MOV HOUR,#12
MOV DISPBIT,#00H
MOV T2SCNTA,#00H
MOV T2SCNTB,#00H
MOV TEMP,#0FEH
LCALL DISP
MOV TMOD,#01H
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: JB SECONDK,NK1
LCALL DELY10MS
JB SECONDK,NK1
INC SECOND
MOV A,SECOND
CJNE A,#60,NS60
MOV SECOND,#00H
NS60: LCALL DISP
JNB SECONDK,$
NK1: JB MINITEK,NK2
LCALL DELY10MS
JB MINITEK,NK2
INC MINITE
MOV A,MINITE
CJNE A,#60,NM60
MOV MINITE,#00H
NM60: LCALL DISP
JNB MINITEK,$
NK2: JB HOURK,NK3
LCALL DELY10MS
JB HOURK,NK3
INC HOUR
MOV A,HOUR
CJNE A,#24,NH24
MOV HOUR,#00H
NH24: LCALL DISP
JNB HOURK,$
NK3: LJMP WT
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DISP:
MOV A,#DISPBUF
ADD A,#8
DEC A
MOV R1,A
MOV A,HOUR
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
MOV A,#10
MOV@R1,A
DEC R1
MOV A,MINITE
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
MOV A,#10
MOV@R1,A
DEC R1
MOV A,SECOND
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
RET
INT_T0:
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) MOD 256
MOV A,#DISPBUF
ADD A,DISPBIT
MOV R0,A
MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
MOV A,DISPBIT
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P3,A
INC DISPBIT
MOV A,DISPBIT
CJNE A,#08H,KNA
MOV DISPBIT,#00H
KNA: INC T2SCNTA
MOV A,T2SCNTA
CJNE A,#100,DONE
MOV T2SCNTA,#00H
INC T2SCNTB
MOV A,T2SCNTB
CJNE A,#05H,DONE
MOV T2SCNTB,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEXT
MOV SECOND,#00H
INC MINITE
MOV A,MINITE
CJNE A,#60,NEXT
MOV MINITE,#00H
INC HOUR
MOV A,HOUR
CJNE A,#24,NEXT
MOV HOUR,#00H
NEXT: LCALL DISP
DONE: RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
END
7. C语言源程序
#include <AT89X51H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};
unsigned char dispbitcnt;
unsigned char second;
unsigned char minite;
unsigned char hour;
unsigned int tcnt;
unsigned char mstcnt;
unsigned char i,j;
void main(void)
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(P0_0==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_0==0)
{
second++;
if(second==60)
{
second=0;
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
while(P0_0==0);
}
}
if(P0_1==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
while(P0_1==0);
}
}
if(P0_2==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
while(P0_2==0);
}
}
}
}
void t0(void) interrupt 1 using 0
{
mstcnt++;
if(mstcnt==8)
{
mstcnt=0;
P1=dispcode[dispbuf[dispbitcnt]];
P3=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
}
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
}
}
这个软件就是个屏幕保护软件,通过在电脑中设置完毕在一定时间内触发屏幕保护后就显示个性的时钟界面了。软件目前仅支持Windows7以上的 *** 作系统,Windows8暂不支持,具体大家可以自行测试,或许是虚拟机环境缘故。
安装完毕后,主桌面鼠标右键d出的选项中进入“个性化”,Windows7直接就进入主题设置了,Windows10用户如果找不到直接控制面板——外观和个性化——个性化也是一样的,Windows7无法使用。点击右下角的“屏幕保护程序”进入设置;
选择屏幕保护程序 word clock,在右边有个设置,可以对这个程序进行个性化修改,由于软件界面都是英文,大家在d出的word clock设置中找到“Chinese”选择中文显示效果
以上 *** 作完成后我们再进一步个性化设置,支持圆形显示以及矩阵显示,唯一不好的地方就是全是英文一时半会有点懵!
设置完毕后,我们可以点击“预览”查看下当前的显示效果,觉得差不多马马虎虎还行时直接点击应用即可。同时设置好待机等待时间,建议时间设置的短一点就能短时间看到效果了。
1 怎么把桌面弄成动态的
将自己喜欢的视频文件设置为屏幕保护程序
我们的Windows Vista大多使用的默认屏幕保护,可能你想要把自己喜欢的视频文件设置为屏幕保护程序。虽然可以在资源管理器中右击相关视频将其设置为桌面背景(前提是安装了梦幻桌面),但却无法将其直接设置为屏幕保护程序,即使打开“屏幕保护程序设置”对话框,似乎也不会在这里发现与视频有关的项目。
其实,利用系统内置的Windows照片库,我们可以很轻松的定制视频屏保,而且 *** 作也是相当的简单。
第1步:打开Windows照片库,如果你已经通过自动更新安装了功能更为强大的Windows Live照片库,那么可以考虑后者。运行之后,从文件菜单选择“将文件夹添加到图库中”导入相关的和视频。
第2步:接下来,请右击桌面打开“个性化”窗口,在这里选择“屏幕保护程序”,在“屏幕保护程序”下拉列表框中选择“照片”,单击右侧的“设置”按钮,此时会d出照片屏幕保护程序设置窗口,在这里选择“使用来自照片库的所有和视频”,至于其他选项可以根据需要进行设置,例如标记、分级等。
完成上述设置之后,保存后返回。
确认之后关闭这个对话框,待预先设置的时间一到,我们就可以看到视频风格的屏幕保护程序,当然假如你等不及的话,也可以在“屏幕保护程序设置”对话框中先预览。
2 怎样把桌面变成动态
使用微软新 *** 作系统的最新技术,给你全新的动态桌面,能够在桌面上显示农历、记事小贴士及动态的时钟。用户可以方便的通过程序更改添加动态桌面小贴士,更改农历及记事小贴士在屏幕上显示的位置。你可以把任何你喜欢的设定为动态桌面的背景。当程序更换动态桌面的背景时会自动把背景修改为符合当前屏幕分辨率的大小。同时用户可以自定义是否在桌面上显示动态的时钟,在何位置显示,并可为动态时钟设定自己喜欢的钟面。程序出于安全考虑还提供密码保护功能,防止非法用户随意更改桌面小贴士的内容。程序在使用时可缩放到系统托盘区,或者缩放为显示在屏幕左上方的浮动条,不会给您带来任何干扰影响您使用其他应用程序。程序的使用上保证让你有耳目一新的感觉。程序第一次运行时会自动安装创建程序组及快捷方式。程序注册完全免费!
26版升级新增内容:提供了桌面背景管理,可根据自己的喜好,添加喜爱的位图到桌面背景库,支持根据设定的桌面背景位图库定时改变桌面背景,每一桌面背景位图停留时间可以根据自己需要任意设定。加入了定时事务提醒功能,在设定的任意日期的任意时间点到时,程序在屏幕左上角滑出事务提醒小窗口,单击窗口可查看具体当初设定的事务内容,事务内容提供了密码安全机制,并可以把过时的事务提醒内容备份为网页的文件格式,便于随时查看!在这个版本同时更新了许多小功能,如为了方便调整桌面可根据需要消隐或显示系统状态栏等。
3 怎么样能弄出动态桌面
1联想制作的动态Flash桌面,共有两个画面,还有飞来飞去的小海鸥,如果点击小海鸥试试,会有意想不到的惊喜! 运行 联想动态桌面绿化bat 进行安装,然后在桌面点属性-〉桌面-选择 lenovo 后应用就可以了。
卸载时运行 联想动态桌面卸载bat 就可以删除掉 2它包括世界地图和中国地图多种功能的桌面工具,还可以根据自己的需求完全DIY Super Active Desktop是一个基于JavaScript、VBScript和HTML等脚本的动态桌面 其功能包括: 1 显示丰富的桌面信息 11 各种实时信息:包括天气信息、股市指数、股票价格、货币汇率等 12 日期节日:显示当日的详细日期信息,提示当天和第二天的节日 13 月历:包括农历,每天对应的节气、节日,还可以查询不同的年份和月份 14 日照(桌面背景为世界地图时适用):提示当前日照正指的地理位置 2 设有强大的配置(SETUP)菜单 屏幕左上角设有SETUP菜单,通过它可以方便地对所要显示在桌面上的各种信息 的属性进行设置,包括内容、颜色、字体、坐标等等 关于SETUP菜单的使用可以参考helptxt, 遇到问题可以先查阅faqtxt 使用方法: 把Super动态桌面的压缩包解压在任意一个位置,然后在桌面上点击右键-> 属性->桌面->浏览->选择SuperActiveDesktop,即可。 使用方法: 把Super动态桌面的压缩包解压在任意一个位置,然后在桌面上点击右键-> 属性->桌面->浏览->选择SuperActiveDesktop,即可。
(将SuperActiveDesktop设置为桌面即可) 3Super Active Desktop 帮助说明 -------------------------------------------------------------------------- 2 FAQ 20 如何使用Super动态桌面 首先把Super动态桌面的压缩包解压在任意一个位置,然后在桌面上点击右键-> 属性->桌面->浏览->选择SuperActiveDesktop,即可。 21 如何激活Setup菜单 在桌面的左上角有一个Setup小图,点击它即可激活Setup菜单。
22 为什么我的Setup菜单点击之后没有反应 如果Windows桌面上显示图标,则鼠标点击事件将被系统俘获而无法被Setup菜单 得到,所以此时点击Setup小图之后没有反应。 此时用户可以先设置成不显示桌面图标(WindowsXP的步骤如下:在桌面上点击右 键->排列图标->点击[显示桌面图标],不打钩则表示不显示,其他Windows系统类似), 然后Setup菜单就可以被激活了。
当完成桌面的设置之后,再设置回显示桌面图标(步 骤类似前面,注意[显示桌面图标]前要打钩即可)。 23 桌面设置到中间不想保存新的设置该如何做 可以先关闭Setup菜单(不要保存新设置代码),然后再刷新桌面即可恢复到原有 的设置。
24 是否可以保存多套桌面设置方案,在需要的时候选择进行加载 可以。setupjs文件就对应着一套设置方案,用户可以设置多个方案分别保存, 如setup_0js,setup_1js。
,在加载的时候只要把所要的方案的文件名改为 setupjs即可。
25 在设置桌面时,有的项目(如日期节日)跑到屏幕外了,无法设置坐标该怎么办 可以先把当前的设置保存,然后关闭Setup菜单。打开setupjs文件,根据注释 找到相应的项目的坐标变量,直接把其值改到屏幕之内,保存之后再刷新桌面(当焦 点在桌面上时按下F5)即可。
26 使用代理的问题和信息引擎的选择 动态桌面需要能连网才能获得实时的信息。在各个信息引擎中,Sina和YahooCN 在教育网内不需要代理就能连上,而Yahoo在教育网内则需要代理才能连上。
只要在 IE中设置了代理,动态桌面就会使用该代理进行连接。 财经数据(股市指数、股票价格和货币汇率):建议使用CN_YAHOO作为引擎。
天气预报:如果直接或者有好的代理能连上Yahoo,建议使用YAHOO作为引擎,否 则建议使用SINA作为引擎。 27 如何添加预设的世界城市 在sys/configjs中的Cities变量中存有所有预设的世界城市的信息,用户可以 在该文件中找到对应的设置格式和方法。
28 两张类似但分辨率不同的地图上如何快捷地完成城市坐标转换 在Setup菜单的世界城市下有一项功能是城市坐标按比例整体缩放,可以帮助在 不同分辨率下重新定位城市坐标。 29 为什么桌面启动之后看不到的背景图 很可能是背景的路径设置错误,可通过SETUP菜单的[其他]子项重新设置。
210 哪里可以找到适合我桌面分辨率的世界地图或中国地图背景 我在在水母的Desktop版上发布了22种分辨率的世界地图和中国地图背景,可以 到该版的文摘区查询这是别人给我的 现在给你了。
4 怎样把桌面换成动态的
使用微软新 *** 作系统的最新技术,给你全新的动态桌面,能够在桌面上显示农历、记事小贴士及动态的时钟。用户可以方便的通过程序更改添加动态桌面小贴士,更改农历及记事小贴士在屏幕上显示的位置。你可以把任何你喜欢的设定为动态桌面的背景。当程序更换动态桌面的背景时会自动把背景修改为符合当前屏幕分辨率的大小。同时用户可以自定义是否在桌面上显示动态的时钟,在何位置显示,并可为动态时钟设定自己喜欢的钟面。程序出于安全考虑还提供密码保护功能,防止非法用户随意更改桌面小贴士的内容。程序在使用时可缩放到系统托盘区,或者缩放为显示在屏幕左上方的浮动条,不会给您带来任何干扰影响您使用其他应用程序。程序的使用上保证让你有耳目一新的感觉。程序第一次运行时会自动安装创建程序组及快捷方式。程序注册完全免费!
26版升级新增内容:提供了桌面背景管理,可根据自己的喜好,添加喜爱的位图到桌面背景库,支持根据设定的桌面背景位图库定时改变桌面背景,每一桌面背景位图停留时间可以根据自己需要任意设定。加入了定时事务提醒功能,在设定的任意日期的任意时间点到时,程序在屏幕左上角滑出事务提醒小窗口,单击窗口可查看具体当初设定的事务内容。使用微软新 *** 作系统的最新技术,给你全新的动态桌面,能够在桌面上显示农历、记事小贴士及动态的时钟。用户可以方便的通过程序更改添加动态桌面小贴士,更改农历及记事小贴士在屏幕上显示的位置。你可以把任何你喜欢的设定为动态桌面的背景。当程序更换动态桌面的背景时会自动把背景修改为符合当前屏幕分辨率的大小。同时用户可以自定义是否在桌面上显示动态的时钟,在何位置显示,并可为动态时钟设定自己喜欢的钟面。程序出于安全考虑还提供密码保护功能,防止非法用户随意更改桌面小贴士的内容。程序在使用时可缩放到系统托盘区,或者缩放为显示在屏幕左上方的浮动条,不会给您带来任何干扰影响您使用其他应用程序。程序的使用上保证让你有耳目一新的感觉。程序第一次运行时会自动安装创建程序组及快捷方式。程序注册完全免费!
26版升级新增内容:提供了桌面背景管理,可根据自己的喜好,添加喜爱的位图到桌面背景库,支持根据设定的桌面背景位图库定时改变桌面背景,每一桌面背景位图停留时间可以根据自己需要任意设定。加入了定时事务提醒功能,在设定的任意日期的任意时间点到时,程序在屏幕左上角滑出事务提醒小窗口,单击窗口可查看具体当初设定的事务内容,事务内容提供了密码安全机制,并可以把过时的事务提醒内容备份为网页的文件格式,便于随时查看!在这个版本同时更新了许多小功能,如为了方便调整桌面可根据需要消隐或显示系统状态栏等。
1、首先在Expression Blend中画出时钟的样式;
2、建立时钟的程序辅助类;
3、将此时钟样式需要动态换掉的部分改成相应的绑定值。
由于具体步骤很多,这里只说说技术难点和要点,着重说明上述第2点部分。
// 时钟控件类:Clockcs
using System;
using SystemWindows;
using SystemWindowsControls;
using SystemWindowsControlsPrimitives;
using SystemWindowsData;
using SystemWindowsDocuments;
using SystemWindowsMedia;
using SystemWindowsMediaImaging;
using SystemWindowsShapes;
using SystemTimers;
using SystemWindowsThreading;
namespace BrawDrawComWPFClockControlLibrary
{
/// <summary>Clock Control
/// </summary>
public class Clock : Control
{
private DispatcherTimer timer;
static Clock()
{
DefaultStyleKeyPropertyOverrideMetadata(typeof(Clock),
new FrameworkPropertyMetadata(typeof(Clock)));
}
protected override void OnInitialized(EventArgs e)
{
baseOnInitialized(e);
timer = new DispatcherTimer();
timerTick += new EventHandler(Timer_Tick);
timerStart();
}
private void Timer_Tick(object sender, EventArgs e)
{
UpdateDateTime();
timerInterval = TimeSpanFromMilliseconds(1000 -
DateTimeNowMillisecond);
}
private void UpdateDateTime()
{
thisDateTime = SystemDateTimeNow;
}
#region DateTime property
public DateTime DateTime
{
get
{
return (DateTime)GetValue(DateTimeProperty);
}
private set
{
SetValue(DateTimeProperty, value);
}
}
public static DependencyProperty DateTimeProperty =
DependencyPropertyRegister(
"DateTime",
typeof(DateTime),
typeof(Clock),
new PropertyMetadata(DateTimeNow,
new PropertyChangedCallback(OnDateTimeInvalidated)));
public static readonly RoutedEvent DateTimeChangedEvent =
EventManagerRegisterRoutedEvent("DateTimeChanged",
RoutingStrategyBubble, typeof(RoutedPropertyChangedEventHandler<DateTime>),
typeof(Clock));
protected virtual void OnDateTimeChanged(DateTime oldValue,
DateTime newValue)
{
RoutedPropertyChangedEventArgs<DateTime> args =
new RoutedPropertyChangedEventArgs<DateTime>(oldValue, newValue);
argsRoutedEvent = ClockDateTimeChangedEvent;
RaiseEvent(args);
}
private static void OnDateTimeInvalidated(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
Clock clock = (Clock)d;
DateTime oldValue = (DateTime)eOldValue;
DateTime newValue = (DateTime)eNewValue;
clockOnDateTimeChanged(oldValue, newValue);
}
#endregion
}
}
// 时钟内部时针、分针、秒针角度计算及星期显示的类: ClockConverterscs
// 由于WPF中旋转角度是以度单位,计算为绕一个圆周时,为360度。所以,计算时以360度来计算。
using System;
using SystemGlobalization;
using SystemWindowsData;
namespace BrawDrawComWPFClock
{
// 一分钟60秒,一周为360度,所以,一秒钟就占6度,所以是:秒数×6。
[ValueConversion(typeof(DateTime), typeof(int))]
public class SecondsConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
DateTime date = (DateTime)value;
return dateSecond 6;
}
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
{
return null;
}
}
// 一小时是60分钟,一周为360度,所以,一分钟就占6度,所以是:分钟数×6。
[ValueConversion(typeof(DateTime), typeof(int))]
public class MinutesConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
DateTime date = (DateTime)value;
return dateMinute 6;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return null;
}
}
// 时钟上显示12小时,一周为360度,这样,每小时占30度,考虑分钟所占角度是分钟数/2,
所以结果是:小时数×30 + 分钟数/2。
[ValueConversion(typeof(DateTime), typeof(int))]
public class HoursConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
DateTime date = (DateTime)value;
return (dateHour 30) + (dateMinute / 2);
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return null;
}
}
[ValueConversion(typeof(DateTime), typeof(string))]
public class WeekdayConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
DateTime date = (DateTime)value;
return dateDayOfWeekToString()Substring(0,3);
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return null;
}
}
}
DS1302程序:
#include "ds1302h"
unsigned char time_buf1[8] = {20,9,3,13,18,51,00,6};//空年月日时分秒周
unsigned char time_buf[8] ; //空年月日时分秒周
/------------------------------------------------
向DS1302写入一字节数据
------------------------------------------------/
void Ds1302_Write_Byte(unsigned char addr, unsigned char d)
{
unsigned char i;
RST_SET;
//写入目标地址:addr
addr = addr & 0xFE; //最低位置零
for (i = 0; i < 8; i ++)
{
if (addr & 0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr = addr >> 1;
}
//写入数据:d
for (i = 0; i < 8; i ++)
{
if (d & 0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
d = d >> 1;
}
RST_CLR; //停止DS1302总线
}
/------------------------------------------------
从DS1302读出一字节数据
------------------------------------------------/
unsigned char Ds1302_Read_Byte(unsigned char addr)
{
unsigned char i;
unsigned char temp;
RST_SET;
//写入目标地址:addr
addr = addr | 0x01;//最低位置高
for (i = 0; i < 8; i ++)
{
if (addr & 0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr = addr >> 1;
}
//输出数据:temp
for (i = 0; i < 8; i ++)
{
temp = temp >> 1;
if (IO_R)
{
temp |= 0x80;
}
else
{
temp &= 0x7F;
}
SCK_SET;
SCK_CLR;
}
RST_CLR; //停止DS1302总线
return temp;
}
/------------------------------------------------
向DS1302写入时钟数据
------------------------------------------------/
void Ds1302_Write_Time(void)
{
unsigned char i,tmp;
for(i=0;i<8;i++)
{ //BCD处理
tmp=time_buf1[i]/10;
time_buf[i]=time_buf1[i]%10;
time_buf[i]=time_buf[i]+tmp16;
}
Ds1302_Write_Byte(ds1302_control_add,0x00); //关闭写保护
Ds1302_Write_Byte(ds1302_sec_add,0x80); //暂停
//Ds1302_Write_Byte(ds1302_charger_add,0xa9); //涓流充电
Ds1302_Write_Byte(ds1302_year_add,time_buf[1]); //年
Ds1302_Write_Byte(ds1302_month_add,time_buf[2]); //月
Ds1302_Write_Byte(ds1302_date_add,time_buf[3]); //日
Ds1302_Write_Byte(ds1302_day_add,time_buf[7]); //周
Ds1302_Write_Byte(ds1302_hr_add,time_buf[4]); //时
Ds1302_Write_Byte(ds1302_min_add,time_buf[5]); //分
Ds1302_Write_Byte(ds1302_sec_add,time_buf[6]); //秒
Ds1302_Write_Byte(ds1302_day_add,time_buf[7]); //周
Ds1302_Write_Byte(ds1302_control_add,0x80); //打开写保护
}
/------------------------------------------------
从DS1302读出时钟数据
------------------------------------------------/
void Ds1302_Read_Time(void)
{
unsigned char i,tmp;
time_buf[1]=Ds1302_Read_Byte(ds1302_year_add); //年
time_buf[2]=Ds1302_Read_Byte(ds1302_month_add); //月
time_buf[3]=Ds1302_Read_Byte(ds1302_date_add); //日
time_buf[4]=Ds1302_Read_Byte(ds1302_hr_add); //时
time_buf[5]=Ds1302_Read_Byte(ds1302_min_add); //分
time_buf[6]=(Ds1302_Read_Byte(ds1302_sec_add))&0x7F;//秒
time_buf[7]=Ds1302_Read_Byte(ds1302_day_add); //周
for(i=0;i<8;i++)
{ //BCD处理
tmp=time_buf[i]/16;
time_buf1[i]=time_buf[i]%16;
time_buf1[i]=time_buf1[i]+tmp10;
}
}
/------------------------------------------------
DS1302初始化
------------------------------------------------/
void Ds1302_Init(void)
{
RST_CLR; //RST脚置低
SCK_CLR; //SCK脚置低
Ds1302_Write_Byte(ds1302_sec_add,0x00);
}
主程序MAIN:
/-----------------------------------------------
名称:DS1302时钟数码管显示
论坛:>
编写:shifang
日期:20095
修改:无
内容:DS1302实时时钟数码管显示,只显示时间。并通过4个按键加减小时、分钟,其他参数调节自行添加
------------------------------------------------/
#include<reg52h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "ds1302h"
#define KeyPort P3 //定义按键端口
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;// 位锁存
bit ReadTimeFlag;//定义读时间标志
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
void DelayUs2x(unsigned char t);//us级延时函数声明
void DelayMs(unsigned char t); //ms级延时
void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
unsigned char KeyScan(void);//键盘扫描
void Init_Timer0(void);//定时器初始化
/------------------------------------------------
主函数
------------------------------------------------/
void main (void)
{
unsigned char num;
Init_Timer0();
Ds1302_Init();
while (1) //主循环
{
num=KeyScan();
switch(num)
{
case 1:time_buf1[4]++;if(time_buf1[4]==24)time_buf1[4]=0;
Ds1302_Write_Time();break; //正常时间 小时 加1
case 2:time_buf1[4]--;if(time_buf1[4]==255)time_buf1[4]=23;
Ds1302_Write_Time();break; //正常时间 小时减1
case 3:time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5]=0;
Ds1302_Write_Time();break;//分加1
case 4:time_buf1[5]--;if(time_buf1[5]==255)time_buf1[5]=59;
Ds1302_Write_Time();break; //分减1
default:break;
}
if(ReadTimeFlag==1)
{
ReadTimeFlag=0;
Ds1302_Read_Time();
//数据的转换,因我们采用数码管0~9的显示,将数据分开
TempData[0]=dofly_DuanMa[time_buf1[4]/10]; //时
TempData[1]=dofly_DuanMa[time_buf1[4]%10];
TempData[2]=0x40; //加入"-"
TempData[3]=dofly_DuanMa[time_buf1[5]/10]; //分
TempData[4]=dofly_DuanMa[time_buf1[5]%10];
TempData[5]=0x40;
TempData[6]=dofly_DuanMa[time_buf1[6]/10]; //秒
TempData[7]=dofly_DuanMa[time_buf1[6]%10];
}
}
}
/------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------/
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
DataPort=0; //清空数据,防止有交替重影
LATCH1=1; //段锁存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
DataPort=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
i++;
if(i==Num)
i=0;
}
/------------------------------------------------
定时器初始化子程序
------------------------------------------------/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/------------------------------------------------
定时器中断子程序
------------------------------------------------/
void Timer0_isr(void) interrupt 1
{
static unsigned int num;
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
Display(0,8); // 调用数码管扫描
num++;
if(num==50) //大致100ms
{
num=0;
ReadTimeFlag=1; //读标志位置1
}
}
/------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------/
unsigned char KeyScan(void)
{
unsigned char keyvalue;
if(KeyPort!=0xff)
{
DelayMs(10);
if(KeyPort!=0xff)
{
keyvalue=KeyPort;
while(KeyPort!=0xff);
switch(keyvalue)
{
case 0xfe:return 1;break;
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 8;break;
default:return 0;break;
}
}
}
return 0;
}
以上就是关于如何设计一个时钟演示程序 vb全部的内容,包括:如何设计一个时钟演示程序 vb、网页时钟小人版代码、用单片机制作可调数字时钟要汇编语言程序的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)