最近用四个发光二极管(不是数码管)做了一个LED手表,拿出来晒晒! 有人说是创意作品,有人说看时间麻烦(喜欢白菜的人,我不卖他萝卜!) ;/////////////////////////////////////////// ;王筝 QQ:408864998 ;本程序利用节拍法,和标志位,利用4个LED显示时间 ;/////////开始自定义及初始化//////////////// cBufTh0 equ 53h ;定时器TH0基数存储单元 cBufTl0 equ 54h ;定时器TL0基数存储单元 bT0 bit 20h.0 ;定时中断标志位 shanshuo bit 20h.1 ;闪烁标志位 sec equ 50h ;秒钟地址 min equ 51h ;分钟地址 hour equ 52h ;时钟地址 sec_ge equ 3ah ;秒的个位 sec_shi equ 38h ;秒的十位 min_ge equ 36h ;分的个位 min_shi equ 34h ;分的十位 hour_ge equ 32h ;时的个位 hour_shi equ 30h ;时的十位 display equ p3 ;时间显示口 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;系统主程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ajmp start org 000bh ljmp T0Ser org 0030h start: mov r0,#7fh cc: mov @r0,#0ffh djnz r0,cc mov sp,#60h mov tmod,#01h ;设定定时器的工作状态 mov dptr,#65536-20000 mov th0,dph mov tl0,dpl mov cBufTh0,dph mov cBufTl0,dpl setb tr0 setb et0 setb ea mov r1,#0 mov r0,#30h ;开始显示的地址 clr bt0 ;以上是初始化的过程 clr shanshuo mov display,#00h mov sec,#21 ;秒显示初值 mov min,#39 ;分显示初值 mov hour,#10 ;时显示初值 Main: jnb bt0,Main ;等待中断的到来,(执行中断返回后,BT0等于1) clr bt0 call jisuan ;时间计算子程序 call fenli ;时间高低位分离 call time_display ;显示 ljmp main ;///////////////计算子程序/////////////////// ;输入: ;输出: ;实现的功能: P3口花样灯显示,SEC MIN HOUR 计算 jisuan: inc r1 cjne r1,#50,tiaochu ;是否来了一秒钟 mov r1,#0 inc r0 ;闪烁某个位 cjne r0,#40h,next ;3ah到42h放的是0ffh,时间显示一会后,就一直亮着, ;用来区别下次的时间显示 mov r0,#30h next: cpl shanshuo ;闪烁标志位 inc sec ;秒加一 mov a,sec cjne a,#60,tiaochu ;是否加到了60 mov sec,#00h ;加到了60回0 inc min ;分加一 mov a,min cjne a,#60,tiaochu ;是否加到60 mov min,#00h ;加到了60回0 inc hour ;时加一 mov a,hour cjne a,#24,tiaochu ;是否加到了24 mov hour,#00h ;加到了24回0 tiaochu: ret ;///////////////显示子程序/////////////////// ;输入:"SEC MIN HOUR" ;输出: "P3口" ;实现的功能:把SEC MIN HOUR的数分别输出到P3口显示 time_display: jb shanshuo,out ;控制闪烁 mov a,@r0 ;依次显示时分秒 cpl a ;低电平驱动所以取反 mov display,a ret out: mov display,#00h ;灭 ret ;///////////////时间分离子程序/////////////////// ;输入:"无" ;输出: "sec_ge等" ;实现的功能:时分秒的十位与个位分离 fenli: mov a,sec ;秒分离 mov b,#10 div ab mov sec_ge,b mov sec_shi,a mov a,min ;分分离 mov b,#10 div ab mov min_ge,b mov min_shi,a mov a,hour ;秒分离 mov b,#10 div ab mov hour_ge,b mov hour_shi,a ret ;///////////////定时中断程序/////////////////// ;输入:"无" ;输出: "BT0" ;实现的功能:20MS到后把BT0置成1 T0Ser: mov tl0,cBufTl0 mov th0,cBufTh0 setb bT0 reti ;///////// 结束/////////////////////////// End
|