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

📄 shuzizhong.asm

📁 这是用Keil开发的计算器程序
💻 ASM
字号:
;****************** 主程序*****************************
	    ORG      0000H
	    AJMP  	 MAIN
	    ORG      000BH
	    LJMP     CLOCK           ;转时钟程序
	    ORG      0100H
	    PORT     EQU 4400H       ;定义8155控制寄存器、A、B、C端口符号地址
	    PORTA    EQU 4401H
	    PORTB    EQU 4402H
	    PORTC    EQU 4403H
	    SECBIT   EQU 08H	     ;定义各标识位符号地址
	    MINBIT   EQU 09H
	    HOURBIT  EQU 0AH
	    RMINBIT  EQU 0BH
	    RHOURBIT EQU 0CH
	    RTIMBIT  EQU 0DH
	    ARMBIT   EQU 0EH
	    TIMDATA  EQU 30H
	    RTIMDATA EQU 31H
	    MSEC1    EQU 32H
	    MSEC2    EQU 33H
	    SEC      EQU 34H
	    MIN      EQU 35H
	    HOUR     EQU 36H
	    RSEC     EQU 37H
	    RMIN     EQU 38H
	    RHOUR    EQU 39H
	    COUNT    EQU 3AH
MAIN:   MOV      SP,#60H
        MOV      DPTR,#PORT
	    MOV      A,#03H          ;设8155A、B口输出,C口输入
	    MOVX     @DPTR,A
	    MOV      21H,#00H		 ;清零闹钟标识位
	    MOV      RHOUR,#00H      ;设置闹钟单元初值
	    MOV      RMIN,#00H
	    MOV      RSEC,#00H
	    MOV      HOUR,#00H	     ;设置时钟单元初值
	    MOV      MIN,#00H
 	    MOV      MSEC1,#00H
	    MOV      MSEC2,#00H
	    MOV      TIMDATA,#00H	 ;时钟修改记忆单元清零
	    MOV      RTIMDATA,#00H   ;闹钟修改记忆单元清零
	    MOV      COUNT,#00H	     ;闹钟保持10S计时单元清零
	    MOV      TMOD,#02H	     ;定时器T0方式2
	    MOV      TL0,#06H        ;定时250us初始值
	    MOV      TH0,#06H
	    SETB     EA			     ;中断允许
	    SETB     ET0
	    SETB	 TR0			 ;启动定时器
	    MOV      B,#SEC			 ;时钟单元首地址送B
BEGIN:  LCALL    KEYTEST		 ;调用判别键入测试程序
        JNZ      RETEST			 ;有键入则转去抖程序
	    LCALL    DISPLAY		 ;无键入调用显示程序
	    JNB      ARMBIT,BEGIN	 ;判别闹钟设定标识位
	    LCALL    ALARM			 ;调闹钟程序
	    AJMP     BEGIN			 ;返回
RETEST: LCALL   DISPLAY			 ;调用显示子程序延时去抖
        LCALL   KEYTEST
        JNZ     KEDATA			 ;若无抖动,则查键号,否则返回
		LJMP    BEGIN
KEDATA: LCALL   SERCH			 ;调键号测试程序
        CJNE    A,#00H,NEXT1	 ;判别是否时钟修改功能键
		LCALL   FTION0			 ;是时钟参数修改功能键则调用时钟修改程序
		SJMP    NEXT3
NEXT1:  CJNE    A,#01H,NEXT2	 ;判别是否闹钟修改功能键
        LCALL   FTION1			 ;是闹钟参数修改功能键则调用闹钟设定程序
		SJMP    NEXT3
NEXT2:  CJNE    A,#02H,NEXT3	  ;判别是否加1功能键
        LCALL   CUM				  ;是加1功能键则调用加1修改程序
NEXT3:  SJMP    BEGIN			  ;循环返回
;**************************** 时钟参数修改子程序FTION0*******************************
;功能:根据时钟修改功能键按下的次数,分别将时钟修改标识位SECBIT、MINBIT、HOURBIT置“1”
;入口:TIMDAT,时钟修改功能键按下次数,每按一次时钟修改功能鍵,该单元内容加1
;出口:TIMDAT、SECBIT、HOURBIT,根据当前TIMDAT的次数,分别将对应时钟修改标识位置1

FTION0:  CLR     TR0			  ;	关定时器
         CLR     RMINBIT		  ;禁止闹钟参数修改,清闹钟分修改标识位0BH
		 CLR     RHOURBIT		  ;清闹钟小时修改标识位0CH
		 MOV     B,#SEC			  ;将时钟秒单元设为显示首地址
		 MOV     RTIMDATA,#00H	  ;清闹钟修改位置标识记录
		 INC     TIMDATA		  ;将时钟修改记录值加1
		 MOV     A,TIMDATA
		 CJNE    A,#01H,TW0		  ;若记录值为1,则将时钟秒修改标识置1
		 SETB    SECBIT			  ;时钟秒标识位08H置1
		 LJMP    BAC0
TW0:     CJNE    A,#02H,THREE0	  ;若记录值为1,则将时钟秒个性标识置1
         CLR     SECBIT			  ;时钟秒标识位08H清零
		 SETB    MINBIT			  ;时钟分标识位09H置1
		 LJMP    BAC0
THREE0:  CJNE    A,#03H,BACK	  ;若记录值为3,则将时钟小时修改标识置1
         CLR     MINBIT			  ;时钟分标识位清零
		 SETB    HOURBIT		  ;时钟小时标识位0AH置1
		 LJMP    BAC0
BACK:    MOV     TIMDATA,#00H	  ;若按4次,则清时钟单元修改位置记录
         CLR     HOURBIT		  ;时钟小时标识位0AH清零
		 SETB    TR0			  ;定时器重新启动
BAC0:    RET
;**********************闹钟参数修改功能键设定子程序FTION1*****************************
;功能:根据闹钟修改功能键按下的次数,分别将闹钟修改标识位RMINBIT、RHOURBIT置“1”
;入口:RTIMDAT,闹钟修改功能键按下次数,每按下一次闹钟修改功能键,该单元内容加1
;出口:RTIMDAT、ARMBIT、B、RMINBIT、RHOURBIT,根据当前RTIMDAT的次数,分别将对应闹钟修改标识位置1,
;并设置闹钟参数显示单元首地址和闹钟启动标志

FTION1:  CLR      SECBIT		   ;08H清零,禁止时钟时间修改
         CLR      MINBIT		   ;时钟秒标识位09H清零
		 CLR      HOURBIT		   ;时钟小时标识位0AH清零
		 MOV      B,#RSEC		   ;将闹钟单元地址设为显示首地址
		 MOV      TIMDATA,#00H
		 INC      RTIMDATA		   ;将闹钟个性记录值加1
		 MOV      A,RTIMDATA
		 CJNE     A,#01H,TOW1
		 SETB     RMINBIT		   ;若记录值为1,则将闹钟分单元修改标识位0BH
		 LJMP     BAC1			   ;置1
TOW1:    CJNE     A,#02H,THREE1
         CLR      RMINBIT		   ;若记录值为2,则将闹钟分单元修改标识位0BH
		 SETB     RHOURBIT		   ;清零,将闹钟小时单元修改标识位0CH置1
		 LJMP     BAC1
THREE1:  CLR      RHOURBIT		   ;将闹钟小时单元修改标识位0CH清零
         SETB     ARMBIT		   ;F0标识位为1表示闹钟已设定
		 MOV      B,#SEC		   ;恢复时钟显示单元首地址
		 MOV      RTIMDATA,#00H	   ;将闹钟修改记录值清零
BAC1:    RET
;************************加1键修改子程序CUM*******************************************
;功能:根据时钟和闹钟修改标识位的状态,将时钟或闹钟对应显示单元内容加1
;入口:SECBIT、MINBIT、RSECBIT、RMINBIT、RHOURBIT,若其中某标识位已被置“1”,将对应的时钟或闹钟显示单元内容加1 
;出口:34H~39H,时钟或闹钟显示单元

CUM:     JNB      SECBIT,CUM0
         MOV      A,SEC
		 ADD      A,#01H
		 DA       A
		 MOV      SEC,A
		 CJNE     A,#60H,CUMEND
		 MOV      SEC,#00H
		 LJMP     CUMEND
CUM0:    JNB      MINBIT,CUM1
         MOV      A,MIN
		 ADD      A,#01H
		 DA       A
		 MOV      MIN,A
		 CJNE     A,#60H,CUMEND
		 MOV      MIN,#00H
		 LJMP     CUMEND
CUM1:    JNB      HOURBIT,CUM2
         MOV      A,HOUR
		 MOV      A,#01H
		 DA       A
		 MOV      HOUR,A
		 CJNE     A,24H,CUMEND
		 LJMP     CUMEND
CUM2:    JNB      RMINBIT,CUM3
         MOV      A,RMIN
		 ADD      A,#01H
		 DA       A
		 MOV      RMIN,A
		 CJNE     A,#60H,CUMEND
		 MOV      RMIN,#00H
		 LJMP     CUMEND
CUM3:    JNB      RHOURBIT,CUMEND
         MOV      A,RHOUR
		 ADD      A,#01H
		 DA       A
		 MOV      RHOUR,A
		 CJNE     A,#24H,CUMEND
		 MOV      RHOUR,#00H
CUMEND:  RET
;*******************闹钟判断与启动程序ALARM*********************
;
;
;

ALARM:   MOV      A,RMIN
         CJNE     A,MIN,DONT0
		 MOV      A,RHOUR
		 CJNE     A,HOUR,DONT0
		 CLR      P1.0
		 SETB     RTIMBIT
DONT0:   MOV      A,COUNT
         CJNE     A,#10,DONT
		 MOV      COUNT,#00H
		 SETB     P1.0
		 CLR      ARMBIT
		 CLR      RTIMBIT
DONT:    RET
;***********************测键入子程序KEYTEST*************************
;功能:判断是否有键输入
;入口:无
;出口:累加器A,A的内容为0表示无键输入,A的内容指针指向8155的A口

KEYTEST: MOV       DPTR,#PORTA		 ;DPTR指针指向8155的A口
         MOV       A,#00H			 
		 MOVX      @DPTR,A			 ;扫描字00H送8155的A口
		 MOV       DPTR,#PORTC		 ;DPTR指针指向8155的C口
		 MOVX      A,@DPTR			 ;读入C口运行状态
		 CPL       A				 ;A取反
		 ANL       A,#0FH			 ;屏蔽高4位
		 RET
;************************时钟修正中断服务子程序CLOCK*****************
;功能:通过定时器中断,自动修改时钟参数
;入口:MSEC1、MSEC2、、SEC、MIN、HOUR,时钟毫秒、秒、分、时单元,存放原时钟参数
;出口:MSEC1、MSEC2、、SEC、MIN、HOUR,时钟毫秒、秒、分、时单元,存入修改后的时钟参数

CLOCK:   CLR       EA				 ;关中断
         PUSH      PSW				 ;保护现场
		 PUSH      ACC
         SETB      RS1
         INC       MSEC1
         MOV       A,MSEC1
         CJNE      A,#28H,BACK1
         MOV       MSEC1,#00H
         INC       MSEC2
         MOV       A,MSEC2
         CJNE      A,#64H,BACK1
		 MOV       MSEC2,#00H
         JNB       RTIMBIT,BACK0
		 INC       COUNT
BACK0:   MOV       A,SEC
         ADD       A,#01H
    	 DA        A
	     MOV       SEC,A
	     CJNE      A,#60H,BACK1
	     MOV       SEC,#00H
	     MOV       A,MIN
	     ADD       A,#01H
	     DA        A
	     MOV       MIN,A
	     CJNE      A,#60H,BACK1
	     MOV       MIN,#00H
	     MOV       A,HOUR
	     ADD       A,#01H
	     DA        A
	     MOV       HOUR,A
	     CJNE      A,#24H,BACK1
	     MOV       HOUR,#00H
BACK1:   POP       ACC
         POP       PSW
         SETB      EA
         RETI
         END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -