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

📄 new_clock_gai.asm

📁 1
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		SJMP EXIT
MMADD:
        INC  month             ;月份加1
        SJMP EXIT
DDADD:  INC  DATE
        SJMP EXIT

;***********退出中断0******************************************
EXIT:	
        POP  ACC
	    POP  PSW
	    RETI

;***********键盘子程序*****************************************
KEY:  lcall  keytest
      jnb    keystate,over
      ajmp   next00
over: ajmp   keyend
next00:	
      acall  DIS_JUDGE
      acall  DIS_JUDGE
      acall  DIS_JUDGE      ;消除抖动
      lcall  keytest1
      jnb    keystate,over
      MOV    dptr,#duanxuan
      MOV    a,#00h		 
      movx   @dptr,a        ;关显示

;***********读取键盘的值***************************************
        MOV    a,#01h
		mov    dptr,#weixuan
		movx   @dptr,a
		movx   a,@dptr
		anl    a,#0fh
key0:   cjne   a,#01h,key1
		mov    keys,#00h
		setb   keystate
		ajmp   keyend
key1:   cjne   a,#02h,key2
		mov    keys,#01h
		setb   keystate
		ajmp   keyend
key2:   cjne   a,#04h,key3
		mov    keys,#02h
		setb   keystate
		ajmp   keyend
key3:   cjne   a,#08h,keynext1
		mov    keys,#03h
		setb   keystate
		ajmp   keyend
keynext1:
        mov    a,#02h
		mov    dptr,#weixuan
		movx   @dptr,a
		movx   a,@dptr
		anl    a,#0fh
key4:   cjne   a,#01h,key5
		mov    keys,#04h
		setb   keystate
		ajmp   keyend
key5:   cjne   a,#02h,key6
		mov    keys,#05h
		setb   keystate
		ajmp   keyend
key6:   cjne   a,#04h,key7
		mov    keys,#06h
		setb   keystate
		ajmp   keyend
key7:   cjne   a,#08h,keynext2
		mov    keys,#07h
		setb   keystate
		ajmp   keyend
keynext2:
        mov    a,#04h
		mov    dptr,#8fffh
		movx   @dptr,a
		movx   a,@dptr
		anl    a,#0fh
key8:	cjne   a,#01h,key9
		mov    keys,#08h
		setb   keystate
		ajmp   keyend
key9:   cjne   a,#02h,keyA
		mov    keys,#09h
		setb   keystate
		ajmp   keyend
keyA:   cjne   a,#04h,keyB
		mov    keys,#0ah
		setb   keystate
		ajmp   keyend
keyB:   cjne   a,#08h,keynext3
		mov    keys,#0bh
		setb   keystate
		ajmp   keyend
keynext3:clr   keystate		
keyend:  ret
			
;************键盘测试程序,返回结果在keystate中************************
keytest:
          mov   a,#0ffh
          MOV   dptr,#weixuan
	      MOVX  @dptr,a
	      MOVX  a,@dptr
	      anl   a,#0fh
	      jz    keytest0
	      setb  keystate
	      jmp   keytest1
keytest0: clr   keystate
keytest1: ret

;************键盘处理子程序**********************************
dokey:    jb      keystate,key_all
          ajmp    keyend1

;判断键值
key_all:
          mov	  a,keys
key_0:    cjne    a,#00h,key_1
          ajmp    key00
key_1:    cjne	  a,#01h,key_2
	      ajmp    key11
key_2:	  cjne	  a,#02h,key_3
	      ajmp    key22
key_3:	  cjne	  a,#03h,key_4
	      ajmp    key33
key_4:	  cjne    a,#04h,key_5
	      ajmp    key44
key_5:    cjne	  a,#05h,key_6
	      ajmp    key55
key_6:	  cjne	  a,#06h,key_7
	      ajmp    key66
key_7:	  cjne	  a,#07h,key_8
	      ajmp    key77
key_8:	  cjne    a,#08h,key_9
          ajmp    key88
key_9:    cjne	  a,#09h,key_a
		  ajmp    key99
key_a:	  cjne	  a,#0ah,key_b
		  ajmp    keyaa
key_b:	  cjne	  a,#0bh,keyend1
          ajmp    keybb

;执行相应的动作
key00:   lcall    houradd1    ;key0键按下,小时加1
         ajmp     keyend1
key11:   lcall    minuteadd1  ;key1键按下,分钟加1
         ajmp     keyend1
key22:   lcall    secondadd1  ;key2键按下,秒钟加1
         ajmp     keyend1
key33:	 lcall    clock       ;key3键按下,闹钟/时钟切换
         ajmp     keyend1
key44:   lcall    yearadd1	  ;key4键按下,年数加1
         ajmp     keyend1
key55:	 lcall    MONTHADD1	  ;key5键按下,月份加1
         ajmp     keyend1
key66:   lcall    DATEADD1	  ;key6键按下,天数加1
         ajmp     keyend1
key77:   lcall    DT 		  ;key7键按下,日历/时钟切换
		 ajmp     keyend1
key88:	 lcall    killclock
         ajmp     keyend1
key99:   lcall    killclock
         ajmp     keyend1
keyaa:   lcall    killclock
         ajmp     keyend1
keybb:	 lcall    killclock	  ;keyB键按下,停止闹铃
                    
keyend1: lcall    dis_JUDGE		
         ret 

;*********日历/时钟切换***************************
DT:   
    CPL TIME_CAL         ;TIME_CAL为日历/时钟切换标志位,其值为1进入日历状态,为0则退出
	MOV SECTMP,SECOND1	 ;获得按键时秒钟时刻
	MOV MINTMP,MINUTE1	 ;获得按键时分钟时刻
    ret

;*********消除闹铃子程序**************************
killclock:  
	   SETB  P1.6		 ;蜂鸣器停止
       CLR   alarm;		 ;闹钟归为无效
	   CLR   MARK	     ;闹铃停止   
over1: RET          

;*********小时加1子程序***************************
houradd1:
       jnb mark1,dao1 	   
       inc hour2
       MOV A,hour2		   ;在闹铃状态时,给闹铃的时加1
       jmp dao2          
dao1: 
       inc hour1
       MOV A,hour1         ;在计时状态时,给计时的时加1
dao2:
       CJNE A,#24,houradd1_end
       jnb mark1,dao3 
       MOV hour2,#00H
       jmp houradd1_end  
dao3:  
       MOV hour1,#00H
houradd1_end:
       ret

;*********分钟加1子程序**********************************
minuteadd1:
       jnb mark1,dao11     
       inc minute2
       MOV A,minute2	   ;在闹铃状态时,给闹铃的分加1
       jmp dao22
dao11:  
       inc minute1
       MOV A,minute1       ;在计时状态时,给计时的分加1   
dao22:
       CJNE A,#60,minuteadd1_end
       jnb mark1,dao44 
       MOV minute2,#00H
       jmp minuteadd1_end
dao44: 
       MOV minute1,#00H
minuteadd1_end :
       ret

;*********秒钟加1子程序**********************************
secondadd1:
       jnb mark1,dao111    
       inc second2
       MOV A,second2	   ;在闹铃状态时,给闹铃的秒加1
       jmp dao222
dao111:  
       inc second1
       MOV A,second1       ;在计时状态时,给计时的秒加1   
dao222:
       CJNE A,#60,secondadd1_end
       jnb mark1,dao444 
       MOV second2,#00H
       jmp secondadd1_end
dao444: 
       MOV second1,#00H
secondadd1_end: 
       ret

;**********年月日加1子程序************************************
yearadd1:
        MOV  A,year2			    ;取年数
		CJNE A,#99,yadd1	        ;是否为99年?未够99年转至YYADD
		MOV  year2,#00H	    
		INC  year1			        ;够99年,年数低位复0,高位加1
        jmp  yearadd1_end
yadd1:  INC  year2
        jmp  yearadd1_end
yearadd1_end: 
        ret
monthadd1:
        inc  month				    ;月份数加1
		MOV  A,month
		CJNE A,#13,monthadd1_end    ;够12月则归一
		MOV  month,#1
        jmp  monthadd1_end
monthadd1_end: 
        ret
dateadd1:
        inc  date
        MOV  A,month
        CJNE A,#2,NOTFEB_ad         ;是否为二月,不是二月转至NOTFEB_ad
ISFEB_ad:	
        NOP						
		MOV  A,YEAR2                ;判断是否闰年
        MOV  B,#4
        DIV  AB
		MOV  R5,B
		CJNE R5,#0,PING_ad	
RUN_ad:	MOV  A,date			        ;是闰年,取天数(2月份).
		CJNE A,#30,dateadd1_end	    ;29天是否到?未够29天转至结尾
		MOV  date,#1
		jmp  dateadd1_end
PING_ad:	
        MOV  A,date			        ;不是闰年,取天数
		CJNE A,#29,dateadd1_end	    ;28天是否到?未够28天转至结尾
		MOV  date,#1			    ;够28天,天数置为1
		jmp  dateadd1_end	
NOTFEB_ad:                          ;不是2月份
		CJNE A,#4,YUE1_ad		    ;是否为4月份?
		AJMP T12_ad
YUE1_ad:	
        CJNE A,#6,YUE2_ad		    ;是否为6月份?
		AJMP T12_ad
YUE2_ad:	
        CJNE A,#9,YUE3_ad	    	;是否为9月份?
		AJMP T12_ad
YUE3_ad:	
        CJNE A,#11,T11_ad		    ;是否为11月份?
		AJMP T12_ad
T11_ad:	MOV  A,date	     	        ;是大月,取天数
		CJNE A,#32,dateadd1_end	    ;31天是否到?未够31天转至结尾
		MOV  date,#1
		jmp  dateadd1_end           ;够31天转至T30_ad
T12_ad:	MOV  A,date			        ;是小月,取天数
		CJNE A,#31,dateadd1_end	    ;30天是否到?未够30天转至结尾
		MOV	 date,#1
		jmp  dateadd1_end
dateadd1_end: 
        ret
				
;***********闹钟子程序************************************    
clock:
       cpl  keytime                 ;其值为1进入设置闹铃状态,为0则退出
       setb mark1					;设闹钟状态标志位为1
       jnb  keytime,goback      
       MOV  hourall,hour2
       MOV  minuteall,minute2
       MOV  secondall,second2	
       jmp  clockover
goback: 
       clr  mark1      				;闹钟标志位清零
       setb alarm                   ;退出时置1
clockover:   ret

;************闹铃响子程序*********************************
voice:
       mov   a,hour2
       cjne  a,hour1,over2
       mov   a,minute2
       cjne  a,minute1,NOISE
       mov   a,second2
       cjne  a,second1,NOISE
       mov   a,second2
       add   a,#12             ;闹钟响应的默认时长定位12s
	   MOV   COUNT,A			  
	   SUBB  A,#60			  ;当闹钟时刻位于48~60s之间时,闹铃时长控制位有可能大于60s,做差以判断
	   JC    SET_MARK	   	  ;当ACC小于60s时,借位CY=0,当ACC大于60s时,借位CY等于1,转到SET_MARK
	   MOV   COUNT,A			  ;ACC<60S,闹铃结束时刻移入计数器COUNT
SET_MARK:
       SETB  MARK			  ;用MARK来决定闹铃是否还该继续
noise: 
       JNB   MARK,OVER2		  ;根据MARK判断是否要闹铃,MARK=1,则闹铃;否则over
	   ACALL ALA_DELAY
       SETB  p1.6
	   ACALL ALA_DELAY
	   CLR   P1.6
	   MOV   A,COUNT		  
	   CJNE  A,SECOND1,OVER2  ;判断闹铃是否已持续12s
clear: 
       setb  p1.6
       clr   alarm
	   CLR   MARK
	   MOV   COUNT,#0		  ;闹铃结束,关蜂鸣器,清除闹钟有效位,闹铃有效位,计数器清零
over2: 
       ret
;************闹铃用延迟子程序*******************************
ALA_DELAY:
       MOV   R3,#0FFH      
       MOV   R4,#0FFH      
	   MOV   R5,#0FFH
DE1:   DJNZ  R4,DE1
       DJNZ  R3,DE1     
DE2:   DJNZ  R5,DE2
	   RET           

END

⌨️ 快捷键说明

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