免电源的电话使用计时器
sp;; GFE DCBA
001C RETL @0B01000000 ;0 0100 0000
001D RETL @0B01111001 ;1 0111 1001
001E RETL @0B00100100 ;2 0010 0100
001F RETL @0B00110000 ;3 0011 0000
0020 RETL @0B00011001 ;4 0001 1001
0021 RETL @0B00010010 ;5 0001 0010
0022 RETL @0B00000010 ;6 0000 0010
0023 RETL @0B01011000 ;7 0101 1000
0024 RETL @0B00000000 ;8 0000 0000
0025 RETL @0B00010000 ;9 0001 0000
;INIT -----------------------------------------------
INIT:
0026 MOV A,@0X00
0027 MOV MIN,A
0028 MOV SEC,A
0029 IOW 0X0E ;DISABLE WDT
002A IOW P5 ;PORT 5 OUTPUT
002B IOW P6 ;PORT 6 OUTPUT
002C MOV A,@0X01
002D IOW 0X0F ;ENABLE TCC_INT
002E MOV A,@0X05 ;1/64
002F CONTW
0030 ENI
;SCAN -----------------------------------------------
SCAN:
0031 MOV A,MIN
HTD:
0032 CLR&nbs
H_H:
0033 ADD A,@246 ;A=A-10 16进制转10进制
0034 JBS RF,FC
0035 JMP H_L
0036 INC DDH
0037 JMP H_H
H_L:
0038 ADD A,@10
0039 CALL T7 ;显示个位
003A IOW P6
003B MOV P6,A
003C MOV A,@255 ;DISPLAY DIGIT 0
003D MOV P5,A
003E MOV A,DDH ;显示十位
003F CALL T7
0040 IOW P6
0041 XOR A,@0XFF
0042 MOV P6,A
0043 MOV A,@00 ;DISPLAY DIGIT 1
0044 MOV P5,A
0045 JMP SCAN
程序与TC2.ICE差异之处有下:
TCC中断子程序部份增加了A,R3的暂存动作及SEC、MIN的限数动作。0008--000A及0016--0018行系对A及R3做暂存及复原的动作。
000C--0011行系对秒做59的比较动作,SEC比59大则SEC=0,MIN=MIN+1。
0012--0015行系对分做99的比较动作,若MIN比99大则MIN=0。
此处为何要对中断子程序做A及R3的暂存及复原的动作呢?这是因为在主程序(SCAN)内时时会用到A及R3,及中断子程序中也会用到A及R3之故,若不在中断前后将A及R3的数值维持不变,那么主程序将会有错乱的情形产生。
在扫描程序部份增加了16进制变成10进制的动作。纵然二位数字来显示MIN(分)的讯息是可行的,然将16进制变成10进制才能符合人类的习性。0033--0038行即在做16进制转10进制的动作,将MIN的数值拆成个位数及拾位数,并在0039--003D时显示个位数,而在003E--0044时显示拾位数。
效果观察:
《免电源的电话使用计时器(第9页)》
本文链接地址:http://www.oyaya.net/fanwen/view/146413.html
001C RETL @0B01000000 ;0 0100 0000
001D RETL @0B01111001 ;1 0111 1001
001E RETL @0B00100100 ;2 0010 0100
001F RETL @0B00110000 ;3 0011 0000
0020 RETL @0B00011001 ;4 0001 1001
0021 RETL @0B00010010 ;5 0001 0010
0022 RETL @0B00000010 ;6 0000 0010
0023 RETL @0B01011000 ;7 0101 1000
0024 RETL @0B00000000 ;8 0000 0000
0025 RETL @0B00010000 ;9 0001 0000
;INIT -----------------------------------------------
INIT:
0026 MOV A,@0X00
0027 MOV MIN,A
0028 MOV SEC,A
0029 IOW 0X0E ;DISABLE WDT
002A IOW P5 ;PORT 5 OUTPUT
002B IOW P6 ;PORT 6 OUTPUT
002C MOV A,@0X01
002D IOW 0X0F ;ENABLE TCC_INT
002E MOV A,@0X05 ;1/64
002F CONTW
0030 ENI
;SCAN -----------------------------------------------
SCAN:
0031 MOV A,MIN
HTD:
0032 CLR&nbs
p;DDH
H_H:
0033 ADD A,@246 ;A=A-10 16进制转10进制
0034 JBS RF,FC
0035 JMP H_L
0036 INC DDH
0037 JMP H_H
H_L:
0038 ADD A,@10
0039 CALL T7 ;显示个位
003A IOW P6
003B MOV P6,A
003C MOV A,@255 ;DISPLAY DIGIT 0
003D MOV P5,A
003E MOV A,DDH ;显示十位
003F CALL T7
0040 IOW P6
0041 XOR A,@0XFF
0042 MOV P6,A
0043 MOV A,@00 ;DISPLAY DIGIT 1
0044 MOV P5,A
0045 JMP SCAN
程序与TC2.ICE差异之处有下:
TCC中断子程序部份增加了A,R3的暂存动作及SEC、MIN的限数动作。0008--000A及0016--0018行系对A及R3做暂存及复原的动作。
000C--0011行系对秒做59的比较动作,SEC比59大则SEC=0,MIN=MIN+1。
0012--0015行系对分做99的比较动作,若MIN比99大则MIN=0。
此处为何要对中断子程序做A及R3的暂存及复原的动作呢?这是因为在主程序(SCAN)内时时会用到A及R3,及中断子程序中也会用到A及R3之故,若不在中断前后将A及R3的数值维持不变,那么主程序将会有错乱的情形产生。
在扫描程序部份增加了16进制变成10进制的动作。纵然二位数字来显示MIN(分)的讯息是可行的,然将16进制变成10进制才能符合人类的习性。0033--0038行即在做16进制转10进制的动作,将MIN的数值拆成个位数及拾位数,并在0039--003D时显示个位数,而在003E--0044时显示拾位数。
效果观察:
《免电源的电话使用计时器(第9页)》