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

📄 clock.asm

📁 一个电子日历时钟的汇编程序
💻 ASM
字号:

;#################

DISPBUFFER DATA 30H

TEMPKey    DATA 3DH

FLASHPOS   DATA 3EH
RAMPOS     DATA 3FH
DISPBITS   DATA 40H


MAX        DATA 41H
;SCOUNT1    DATA 42H
;SCOUNT2    DATA 43H
FLASHCOUNT DATA 44H

DISPNO     DATA 45H
;FUNNO      DATA 46H

KEYOLD     DATA 47H
KEYLENGTH  DATA 48H

LOOPNO     DATA 4BH

;##################

;MAX1FLAG        BIT 23H.0
;MAX2FLAG        BIT 23H.1
;MAX3FLAG        BIT 23H.2
;MAX5FLAG        BIT 23H.3
;MAX7FLAG        BIT 23H.4
;MAX9FLAG        BIT 23H.5

;PORT0FLAG       BIT 24H.0
;PORT1FLAG       BIT 24H.1
;PORT2FLAG       BIT 24H.2

DISPFLAG        BIT 25H.0
;DISPDATEFLAG    BIT 25H.1
UPDATEDISPFLAG  BIT 25H.2
INNORMalDISPFLAG  BIT 25H.3
KEYRUNFLAG      BIT 25H.4
KEYCONCLICKFLAG BIT 25H.5
FLASHFLAG       BIT 25H.6

;WRDATEFLAG      BIT 26H.0
;WRCLOCKFLAG     BIT 26H.1

;HIGHFLAG        BIT 26H.2
BLACKFLAG       BIT 26H.3

K1FLAG          BIT 26H.4
;K3FLAG          BIT 26H.5
;K4FLAG          BIT 26H.6
;K3DOWNFLAG      BIT 26H.7

;################

ORG 0000H

AJMP INIT

ORG 000BH

AJMP INT1MS

ORG 001BH

AJMP INT15MS


;###################

ORG 0050H

INIT:
      
MOV TMOD,#11H
MOV TL1,#20H
MOV TH1,#0d1H

MOV IE,#0AH
MOV IP,#02H

MOV SP,#5FH

MOV R7,#48H
MOV R0,#18H

INITRAM:

MOV @R0,#00H
INC R0
DJNZ R7,INITRAM
;--------------------------
MOV R0,#0AH
MOVX A,@R0
MOV R1,A
ANL A,#70H
XRL A,#20H
JZ START1         

MOV A,R1
CLR ACC.4
SETB ACC.5
CLR ACC.6
MOVX @R0,A          

MOV R0,#0BH
MOV A,#02H
MOVX @R0,A           

MOV R0,#01H
MOV A,#00H
MOVX @R0,A
MOV R0,#03H
MOV A,#0ffH
MOVX @R0,A          
MOV R0,#05H
MOVX @R0,A          

;---------------------
START1:

SETB TR1
SETB EA

WAITINT:

SJMP WAITINT
;####################


INT15MS:

MOV TL1,#20H
MOV TH1,#0d1H

MOV TL0,#0ffH
MOV TH0,#0FfH

SETB DISPFLAG
;mov dispbits,#00h
SETB TR0

jb INNORMALDISPFLAG,readkey 

MOV R0,#0CH
MOVX A,@R0
MOV 20H,A

JNB 20H.4,READKEY ;20H.4--SECONDUPDATEFLAG

LCALL RDCLOCKDATE 
setb updatedispflag
;mov dispno,#01h

READKEY:

LCALL KEYSCAN


WAITINT1MS:

JB DISPFLAG,WAITINT1MS
LCALL UPDATEDISPBUFFER

RETI



;###################

INT1MS:

MOV TL0,#18H
MOV TH0,#0FCH
PUSH PSW
PUSH ACC

SETB PSW.3

MOV A,DISPBITS
ADD A,#30H;  30H--DISPBUFFER
MOV R0,A
MOV P2,@R0
INC DISPBITS
MOV A,DISPBITS
XRL A,#0bH
JZ DISPEND
SJMP RETURN1MS

DISPEND:

MOV DISPBITS,#00H
CLR DISPFLAG
CLR TR0

RETURN1MS:

POP ACC
POP PSW

RETI



;################

RDCLOCKDATE:


MOV R0,#0BH
MOVX A,@R0
SETB ACC.7
MOVX @R0,A

MOV R0,#00H
MOVX A,@R0
MOV R1,#18H
MOV @R1,A

MOV R0,#02H
MOVX A,@R0
INC R1
MOV @R1,A

MOV R0,#04H
MOVX A,@R0
INC R1
MOV @R1,A

MOV R6,#03H
INC R0

RDDATE:

INC R0
INC R1
MOVX A,@R0
MOV @R1,A
DJNZ R6,RDDATE

MOV R0,#0BH
MOVX A,@R0
CLR ACC.7
MOVX @R0,A

RET


;################


WRCLOCKDATE:

CLR EA

MOV R0,#0BH
MOVX A,@R0
SETB ACC.7
MOVX @R0,A

WRCLOCK:

MOV R1,#18H
MOV R0,#00H
MOV A,@R1
MOVX @R0,A

MOV R0,#02H
INC R1
MOV A,@R1
MOVX @R0,A

MOV R0,#04H
INC R1
MOV A,@R1
MOVX @R0,A

WRDATE:

MOV R6,#03H
MOV R1,#1BH
MOV R0,#06H

REWRDATE:

MOV A,@R1
MOVX @R0,A
INC R0
INC R1
DJNZ R6,REWRDATE

RETURNWR:

MOV R0,#0BH
MOVX A,@R0
CLR ACC.7
MOVX @R0,A

SETB EA

RET


;################




;---------------------------------------------

KEYSCAN:

ORL P1,#07H
MOV A,P1
ANL A,#07H
XRL A,#07H                ;低3位
JZ KEYUP                  ;没有按键转走


XRL A,#07H 
CJNE A,keyold,KEYne       ;是否与上次读键相等,不等则转走

jnb acc.0,KEYIS1
JNB ACC.1,KEYIS2
JNB ACC.2,KEYIS3


AJMP RETURNKEY

KEYIS1:                 ;设置键 

MOV R7,#00H              
CLR KEYCONCLICKFLAG
aJMP KEYYEAR             

KEYIS2:                 ;移位键(k2)

MOV R7,#01H
CLR KEYCONCLICKFLAG
aJMP KEYYEAR

KEYIS3:                 ;增一键,允许连击

MOV R7,#02H
SETB KEYCONCLICKFLAG

KEYYEAR:

INC KEYLENGTH                   ;键年龄增1
JNB KEYRUNFLAG,KEYRUN           ;是否已执行,没执行转执行
JNB KEYCONCLICKFLAG,RETURNKEY   ;已执行,判断是否允许连击,不允许转退出
MOV A,KEYLENGTH                 ;允许连击,则判断键年龄是否到
clr c                 
subb A,#15H           ;允许连击,则判断键年龄(一秒击四次--250ms一次)是否到,不到转退出
jc returnkey

KEYRUN:

SETB KEYRUNFLAG                 ;设置运行标志
MOV KEYLENGTH,#00H              ;键年龄清0
MOV DPTR,#KEYVALUERUN           ;
MOV A,R7
RL A
JMP @A+DPTR

KEYVALUERUN:

AJMP K1
AJMP K2
AJMP K3

KEYUP:                  ;按键全部抬起

MOV A,#07H              ;恢复本次读键值

KEYNE:                  ;相临两次读键值不等,即没有按键

MOV KEYLENGTH,#00H      ;键年龄清零
CLR KEYRUNFLAG          ;清已运行标志
MOV keyold,A            ;保存本次按键值

RETURNKEY:

RET


;##################


K1:

cpl k1flag
jnb k1flag,k1up

MOV A,1dh
SWAP A                     ;
ANL A,#0FH                 ;取月的十位
MOV TEMPKEY,A              ;放入调整区
;MOV DISPNO,#02H            ;设置显示号
MOV LOOPNO,#00H            ;设置位置号为0
MOV FLASHPOS,#30H          ;闪烁位对应显缓30H
mov max,#02h
setb innormaldispflag
clr UPDATEDISPFLAG        ;清更新显缓标志
SETB FLASHFLAG             ;设置闪烁标志
MOV FLASHCOUNT,#00H
LJMP RETURNKEY

k1up:

SETB UPDATEDISPFLAG
MOV DISPNO,#01H
CLR INNORMALDISPFLAG        ;清非正常标志
clr  flashflag

lcall movekey
lcall wrclockdate

LJMP RETURNKEY

;###########################

K2:

jb k1flag,k20
ljmp returnkey

k20:

lcall movekey

;JB K2FLAG,K22
;SETB K2FLAG

;K22:


SETB UPDATEDISPFLAG
;MOV DISPNO,#02H            ;设置显示号


LJMP RETURNKEY 
;#################

movekey:

INC LOOPNO
MOV A,LOOPNO
clr c
subb a,#0bh
Jc K21
MOV LOOPNO,#00H

K21:

MOV A,LOOPNO
RL A
MOV DPTR,#K22
JMP @A+DPTR

K22:

AJMP POS1  
AJMP POS2  
AJMP POS3  
AJMP POS4
AJMP POS5  
AJMP POS6  
AJMP POS7  
AJMP POS8
AJMP POS9  
AJMP POS10  
AJMP POS11  
  
RETURNK2:

ret
;###################

POS1:


MOV A,1bh
aNL A,#0F0H
ORL A,TEMPKEY
MOV 1bh,A


MOV A,1dh
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#30H

MOV MAX,#02H

LJMP RETURNK2

POS2:

MOV A,1dh
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV 1dh,A

MOV A,1dh
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#31H

MOV MAX,#0AH

LJMP RETURNK2


POS3:

MOV A,1dh
aNL A,#0F0H
oRL A,TEMPKEY
MOV 1dh,A


MOV A,1ch
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#32H

MOV MAX,#04H

LJMP RETURNK2

POS4:

MOV A,1ch
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV 1ch,A


MOV A,1ch
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#33H

MOV MAX,#0AH

LJMP RETURNK2

POS5:

MOV A,1ch
aNL A,#0F0H
oRL A,TEMPKEY
MOV 1ch,A


MOV A,1ah
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#34H

MOV MAX,#03H

LJMP RETURNK2

POS6:

MOV A,1ah
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV 1ah,A


MOV A,1ah
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#35H

MOV MAX,#0AH

LJMP RETURNK2

POS7:

MOV A,1ah
aNL A,#0F0H
oRL A,TEMPKEY
MOV 1ah,A


MOV A,19h
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#36H

MOV MAX,#06H

LJMP RETURNK2

POS8:

MOV A,19h
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV 19h,A


MOV A,19h
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#37H

MOV MAX,#0AH

LJMP RETURNK2

POS9:

MOV A,19h
aNL A,#0F0H
oRL A,TEMPKEY
MOV 19h,A


MOV A,18h
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#38H

MOV MAX,#06H

LJMP RETURNK2

POS10:

MOV A,18h
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV 18h,A


MOV A,18h
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#39H

MOV MAX,#0AH

LJMP RETURNK2

POS11:

MOV A,18h
aNL A,#0F0H
oRL A,TEMPKEY
MOV 18h,A


MOV A,1bh
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#3aH

MOV MAX,#08H

LJMP RETURNK2

;#################

K3:


jnb k1flag,returnk3

INC TEMPKEY
clr c
mov a,tempkey
SUBB A,MAX
JC RETURNK3
MOV TEMPKEY,#00H

MOV A,LOOPNO
CJNE A,#0AH,RETURNK3
MOV TEMPKEY,#01H

RETURNK3:

LJMP RETURNKEY



;######################

UPDATEDISPBUFFER:

JB UPDATEDISPFLAG,dispno1
LJMP FLASH

dispno1:

;mov a,dispno

;CJNE A,#01H,DISPNO2
MOV A,1dh
ANL A,#0F0H
SWAP A
ORL A,#00H
MOV 30H,A

MOV A,1dh
ANL A,#0FH
ORL A,#10H
MOV 31H,A

MOV A,1ch
ANL A,#0F0H
SWAP A
ORL A,#20H
MOV 32H,A

MOV A,1ch
ANL A,#0FH
ORL A,#30H
MOV 33H,A

MOV A,1ah
ANL A,#0F0H
SWAP A
ORL A,#40H
MOV 34H,A

MOV A,1ah
ANL A,#0FH
ORL A,#50H
MOV 35H,A

MOV A,19h
ANL A,#0F0H
SWAP A
ORL A,#60H
MOV 36H,A

MOV A,19h
ANL A,#0FH
ORL A,#70H
MOV 37H,A

MOV A,18h
ANL A,#0F0H
SWAP A
ORL A,#80H
MOV 38H,A

MOV A,18h
ANL A,#0FH
ORL A,#90H
MOV 39H,A

MOV A,1bh
ANL A,#0FH
ORL A,#0a0H
MOV 3aH,A

;ljmp flash

;DISPNO2:

;CJNE A,#02H,FLASH


FLASH:

CLR UPDATEDISPFLAG

JnB INNORMALDISPFLAG,RETURNUPDATE       ;D1
;clr flashflag
;INC FLASHCOUNT
;MOV A,FLASHCOUNT
;clr c
;subb A,#32H
;Jc RETURNUPDATE

;MOV FLASHCOUNT,#00H 
;SJMP RETURNUPDATE

D1:


INC FLASHCOUNT
MOV A,FLASHCOUNT
clr c
subb A,#15H
Jc d2
CPL BLACKFLAG
MOV FLASHCOUNT,#00H

d2:

MOV R0,FLASHPOS
MOV A,FLASHPOS
ANL A,#0FH
SWAP A
JB BLACKFLAG,BLACK
ORL A,TEMPKEY
SJMP SETFLASH

BLACK:

ORL A,#0FH

SETFLASH:


MOV @R0,A


RETURNUPDATE:

RET

END


⌨️ 快捷键说明

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