📄 14at20053121537918945.asm
字号:
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;秒表程序
;作者:曹祁 2005.03.03
;硬件:1、显示 P2口段选,P1口P1.0~P1.1位选
; 2、键盘 P1.4~P1.6接3个键
; 3、晶振 11.0592MHz
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;系统全局变量定义
SEC EQU 30H ;秒计时
NUM EQU 31H ;记录成绩数目
CURE EQU 32H ;当前要显示的成绩
REC1 EQU 33H ;成绩1~5
REC2 EQU 34H
REC3 EQU 35H
REC4 EQU 36H
REC5 EQU 37H
DIS0 EQU 38H ;显示缓冲1、0
DIS1 EQU 39H
STAT EQU 3AH ;秒表停止0、计时1、查询2三种状态标志
COUNT EQU 40H
KEY0 EQU 41H
KEY1 EQU 42H
KEY2 EQU 43H
;以下是位变量
K0PR EQU 00H
K1PR EQU 01H
K2PR EQU 02H
K0CU EQU 03H
K1CU EQU 04H
K2CU EQU 05H
;系统常量定义
TIMH DATA 0DCH
TIML DATA 00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ORG 0000H
SJMP MAIN
ORG 000BH
LJMP TIMER0
ORG 001BH
LJMP SCAN
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;主程序
;作者:曹祁 2005.03.03
;功能:初始化系统,并执行主循环
;输出:
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MAIN:
INIT: MOV SP,#5FH
MOV SEC,#00H
MOV NUM,#0FFH ;秒表停止时,用户数为-1,计时开始为0
MOV CURE,#00H
MOV REC1,#00H
MOV REC2,#00H
MOV REC3,#00H
MOV REC4,#00H
MOV REC5,#00H
MOV STAT,#00H ;以上初始化可以用循环实现
MOV P1,#0FFH
MOV P2,#0FFH
MOV TMOD,#11H
MOV TL1,#00H
MOV TL2,#0B8H
SETB ET1
SETB EA
SETB TR1
MLOOP:
LCALL DISP
LCALL KEYPR
LJMP MLOOP
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;1S定时程序
;作者:曹祁 2005.03.03
;功能:通过100个10毫秒定时实现1S定时,并更新SEC单元
;输入:无
;输出:SEC
;暂存:A
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TIMER0:
PUSH A
PUSH PSW
MOV TL0,#TIML
MOV TH0,#TIMH
DJNZ COUNT,TEXIT
MOV COUNT,#100
MOV A,SEC
INC A
DA A
CJNE A,#60H,T0001
MOV A,#0
T0001: MOV SEC,A
TEXIT: POP PSW
POP A
RETI
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;显示程序DISP
;作者:曹祁 2005.03.03
;功能:动态2位显示
;输入:DIS1;DIS0,SEC,STAT
;输出:P1,P2
;暂存:A,R0,R1,R6,R7
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISP:
MOV A,STAT
CJNE A,#1,DI001 ;如果是计时状态
MOV A,SEC ;将秒拆分为两位显示
LCALL SPLIT
DI001: MOV R0,#DIS0
MOV R1,#0FEH
DI002: MOV A,R1
MOV P1,A
MOV A,@R0
MOV DPTR,#DTAB
MOVC A,@A+DPTR
MOV P2,A
MOV R7,#02H ;延时1ms
DI003: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,DI003
INC R0
MOV A,R1
RL A
MOV R1,A
JNB ACC.2,DI002
RET
DTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7D,07H,7FH,6FH ;共阴七段码
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;定时键盘扫描程序
;作者:曹祁 2005.03.03
;功能:每20ms进行一次键盘扫描,如果连续3次状态一致,则记录一次按键状态
;输入:DITH;DIS0
;输出:K0CU~K2CU,K0PR~K2PR
;暂存:C
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SCAN:
PUSH A
PUSH PSW
ORL P1,#70H
MOV A,P1
CPL A
MOV C,ACC.4
MOV A,KEY0
RLC A
ANL A,#07H
JNZ SC001
MOV C,K0CU
MOV K0PR,C
CLR K0CU
SC001: CPL A
ANL A,#07H
JNZ SC002
MOV C,K0CU
MOV K0PR,C
SETB K0CU
SC002: MOV C,ACC.5
MOV A,KEY1
RLC A
ANL A,#07H
JNZ SC003
MOV C,K1CU
MOV K1PR,C
CLR K1CU
SC003: CPL A
ANL A,#07H
JNZ SC004
MOV C,K1CU
MOV K1PR,C
SETB K1CU
SC004: MOV C,ACC.6
MOV A,KEY2
RLC A
ANL A,#07H
JNZ SC005
MOV C,K2CU
MOV K2PR,C
CLR K2CU
SC005: CPL A
ANL A,#07H
JNZ SC006
MOV C,K2CU
MOV K2PR,C
SETB K2CU
SC006: POP PSW
POP A
RETI
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;键盘处理程序
;作者:曹祁 2005.03.03
;功能:实现停止功能,显示全部灭
;输入:20H
;输出:无
;暂存:A
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
KEYPR:
MOV A,20H
ANL A,#09H
CJNE A,#1,KP001
LCALL KEY0P
KP001: MOV A,20H
ANL A,#12H
CJNE A,#2,KP002
LCALL KEY1P
KP002: MOV A,20H
ANL A,#24H
CJNE A,#4,KP003
LCALL KEY2P
KP003:
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;键0(回表键)处理程序
;作者:曹祁 2005.03.03
;功能:实现停止功能,显示全部灭
;输入:无
;输出:无
;暂存:无
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
KEY0P:
MOV SEC,#00H
MOV NUM,#0FFH ;秒表停止时,用户数为-1,计时开始为0
MOV REC1,#00H
MOV REC2,#00H
MOV REC3,#00H
MOV REC4,#00H
MOV REC5,#00H
MOV STAT,#00H
CLR TR0
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;键1(计时键)处理程序
;作者:曹祁 2005.03.03
;功能:1、停止时,开始计时
; 2、计时时,每按一次记录一个成绩;满5个后进入查询状态
; 3、查询时,本键无效
;输入:无
;输出:无
;暂存:无
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
KEY1P:
MOV A,STAT
CJNE A,#0,K1S1
MOV A,TMOD
ANL A,#0F0H
ORL A,#01H
MOV TMOD,A ;定时器0置为方式1
MOV TL0,#TIML
MOV TH0,#TIMH
SETB ET0
SETB EA
SETB TR0
INC STAT
LJMP K1EXIT
K1S1: CJNE A,#1,K1S2
MOV A,NUM
ADD A,#REC1
MOV R0,A
MOV A,SEC
MOV @R0,A
INC NUM
MOV A,NUM
CJNE A,#5,K1EXIT
CLR TR0
INC STAT ;记录满5个成绩,进入查询态
MOV CURE,#1
MOV A,REC1
LCALL SPLIT
LJMP K1EXIT
K1S2: CJNE A,#2,K1SE
SJMP K1EXIT
K1SE: LJMP MAIN
K1EXIT: RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;键2(成绩查询键)处理程序
;作者:曹祁 2005.03.03
;功能:1、停止时,本键无效
; 2、计时时,有成绩记录时进入查询状态;否则无效
; 3、查询时,成绩循环查询;无成绩则不显示
;输入:无
;输出:无
;暂存:无
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
KEY2P:
MOV A,STAT
CJNE A,#0,K2S1
LJMP K2EXIT
K2S1: CJNE A,#1,K2S2
MOV A,NUM
CJNE A,#0FFH,K2EXIT
JZ K2EXIT
CLR TR0
MOV CURE,#1
MOV A,REC1
LCALL SPLIT
LJMP K2EXIT
K2S2: CJNE A,#2,K2SE
INC CURE
MOV A,NUM
CJNE A,CURE,K2001
K2001: JNC K2002
MOV CURE,#0
K2002: MOV A,#REC1-1
ADD A,CURE
MOV R0,A
MOV A,@R0
LCALL SPLIT
LJMP K2EXIT
K2SE: LJMP MAIN
K2EXIT: RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;拆字程序
;作者:曹祁 2005.03.03
;功能:将A中的数据拆分,放入显示缓冲
;输入:A
;输出:DIS0;DIS1
;暂存:无
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SPLIT: PUSH A
ANL A,#0FH
MOV DIS0,A
POP A
ANL A,#0F0H
SWAP A
MOV DIS1,A
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -