⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 14at20053121537918945.asm

📁 89S51的程序
💻 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 + -