www.pudn.com > 14at20053121537918945.rar > 14at20053121537918945.asm, change:2005-03-12,size:9696b


;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
;秒表程序 
;作者:曹祁    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