我在用51做一个篮球计分计时器,网上找了一个程序实现了几分功能,是用c编程的,还想加一个计时功能,找了一个汇编编程的,想把汇编转成c,哪位高手帮个忙。下面是程序:
Time EQU 24
T0IntCnt Data 30H
DispTime Data 31H
KeyStart Bit P2.4
KeyPause Bit P2.5
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T0Int
ORG 0030H
MAIN:
SETB 00H
MOV SP, #70H
MOV DPTR, #TAB ;DPTR指向表首地址
MOV DispTime, #Time ;显示24S时间
MOV T0IntCnt, #20 ;中断20次
;初始化Timer0
MOV TMOD, #01H ;T0方式1
MOV TH0, #3CH ;计数初值3CB0
MOV TL0, #0B0H
SETB ET0
SETB TR0
SETB EA
;初始化化串行口
MOV SCON, #00H
ACALL Display
LOOP:
SETB KeyStart
JB KeyStart, OO
MOV DispTime, #24
MOV TH0, #3CH ;计数初值3CB0
MOV TL0, #0B0H
ACALL Display
OO:
SETB KeyPause
JB KeyPause, UU
CPL 00H
MOV C, 00H
MOV TR0, C
UU:
JNB F0, LOOP
CLR F0
ACALL Display
AJMP LOOP
;显示程序
;具备前0消隐
Display:
MOV A, DispTime ;分解时间
MOV B, #10
DIV AB
MOV R7, A ;保存十位
MOV R6, B ;保存个位
MOV A, B ;显示个位
HH:
MOVC A, @A+DPTR
MOV SBUF, A
JNB TI, $
CLR TI
ZZ:
MOV A, R7 ;取出十位
CJNE A,#00, WW
MOV A, #10
WW:
MOVC A, @A+DPTR ;显示十位
MOV SBUF, A
JNB TI, $
CLR TI
ret
;T0中断服务程序
T0Int:
DJNZ T0IntCnt, OUT
MOV T0IntCnt, #20
SETB F0
DEC DispTime
MOV A, DispTime
CJNE A,#0ffh, OUT
MOV DispTime, #Time
OUT:
MOV TH0, #3CH ;计数初值3CB0
MOV TL0, #0B0H
reti
;串行显示
Tab:
DB 03H,9FH,25H,0DH,99H
DB 49H, 41H,1FH,01H,09H
DB 0FFH
;并行显示
;Tab:
DB 0c0H,0f9H,0a4H,0b0H,99H
DB 92H, 82H,0f8H,80H,90H
DB 0FFH
END
下边图一张是24秒的,两外两张是局部放大图。按下面的键暂停,再按一下继续计时,按上面的键复位,恢复24秒继续计时 接上电源直接就显示24秒计时
24秒图
(原文件名:未命名.jpg)
24秒局部放大图
(原文件名:未命名1.jpg)
24秒局部放大图
(原文件名:未命名2.jpg)
如果时间取的很短的话可以分成几个部分,分别完成扫描按键,计数(也就是计时),和刷显示的任务,这勉强能算分时系统。
一周热门 更多>