?? all.asm
字號:
;********************************
;端口定義和MAIN 函數
;*******************************
;***********BIT*********************
DISPCON BIT P3.2
S1 BIT P1.3 ;設置鍵
S2 BIT P1.2 ;數字+1
S3 BIT P1.5
BEEP BIT P3.7
L1 BIT P1.7
L2 BIT P1.6
SETFLAG EQU 20H ;標志字節
;位控制在20H位尋址單元
HH BIT 00H ;當前設置位標志
HL BIT 01H
MH BIT 02H
ML BIT 03H
bb bit 04h
;位控制在21H位尋址單元
SS BIT 08H
FRESH BIT 09H ;通用控制位標志
S1PREESSED BIT 0AH
SEC BIT 0BH
WARNING BIT 0CH ;鬧鈴標志位
WARNSETTED BIT 0DH
TFIX BIT 0EH ;修正標志
falg bit 0fh ;settime子程序的閃爍修正
N EQU 60 ;誤差值,單位:1/10,默認為0
;****************BYTE*******************
;各種數據緩沖區定義
SECOND EQU 23H
BUF EQU 24H
HOUR EQU 24H
MINUTE EQU 25H
HOURH EQU 26H
HOURL EQU 27H
MINUH EQU 28H
MINUL EQU 29H
COUNT EQU 2AH
HHBACK EQU 2BH
HLBACK EQU 2CH
MHBACK EQU 2DH
MLBACK EQU 2EH
WARNHH EQU 2FH
WARNHL EQU 30H
WARNMH EQU 31H
WARNML EQU 32H
WARNCNT EQU 33H ;已設鬧鈴時間標志
;*************************************************
;中斷向量
;***********************************************
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIMER0
ORG 001BH
LJMP TIMER1
; ORG 0013H
; LJMP INT_1
ORG 0030H
MAIN:
MOV SP, #60H
LCALL SYS_INIT
LCALL T0_INIT
LCALL T1_INIT
LCALL UART_INIT
LCALL DISPLAYP
LCALL SETTIME
JB S3, MAIN_00
LCALL SETWARN
SETB WARNSETTED
MOV WARNCNT ,#0
CLR TFIX
MOV COUNT, #0
MAIN_00:
LCALL DISPLAY1
MAIN_0:
SETB TR0
SETB ET0
MAIN_1:
JB FRESH, MAIN_2
SJMP MAIN_3
MAIN_2:
LCALL DISPLAY1
;********************************************************
CLR FRESH ;
;********************************************************
SJMP MAIN_3
MAIN_3:
JBC SEC, MAIN_4
SJMP MAIN_1
MAIN_4:
CPL L1
CPL L2
JNB WARNING,MAIN_5
CPL BEEP
INC WARNCNT
MOV A, WARNCNT
XRL A,#16
JNZ MAIN_5
CLR WARNING
MOV WARNCNT, #0
MAIN_6:
SETB BEEP
MAIN_5:
MOV R6, #60
LCALL DEL20_0
SJMP MAIN_1
;************************************************
;十六進制轉化為BCD碼
;入口:在BUF中
;出口:分別放在HOURH,HOURL,MINUH,MINUL
;************************************************
HEX2BCD :
MOV R0, #BUF
MOV A, @R0
MOV B, #10
CLR C
DIV AB
MOV HOURH, A
MOV HOURL, B
INC R0
MOV A, @R0
MOV B, #10
CLR C
DIV AB
MOV MINUH, A
MOV MINUL, B
RET
;*************************************************
;顯示子程序:DISPLAY DISPLAY1, DISPLAYNEW
;入口: HOURH,HOURL,MINUH,MINUL,(BCD)形式
DISPLAY:
LCALL HEX2BCD
DISPLAY1:
SETB DISPCON
MOV A, HOURH
ADD A, #30H
MOVC A, @A+PC
MOV SBUF,A
DL1: JNB TI, DL1
CLR TI
MOV A, HOURL
ADD A, #24H
MOVC A, @A+PC
ANL A, #0FEH
MOV SBUF,A
DL2: JNB TI, DL2
CLR TI
MOV A, MINUH
ADD A, #16H
MOVC A, @A+PC
MOV SBUF,A
DL3: JNB TI, DL3
CLR TI
MOV A, MINUL
ADD A, #0AH
MOVC A, @A+PC
MOV SBUF,A
DL4: JNB TI, DL4
CLR TI
CLR DISPCON
RET
;*******************************************
;0~9的段碼(共陽極)
;*******************************************
SEGTAB: DB 03H,9FH,25H,0DH,99H
DB 49H,41H,1FH,01H,09H,0FFH
;*****************************************
;DISPLAYNEM的子程序,入口:待顯示 的數據在R0所指向的緩沖區(BCD )
DISPLAYNEW:
SETB DISPCON
MOV A, @R0
MOV DPTR, #SEGTABN
MOVC A, @A+DPTR
MOV SBUF,A
DNL1: JNB TI, DNL1
CLR TI
INC R0
MOV A, @R0
MOVC A, @A+DPTR
ANL A, #0FEH
MOV SBUF,A
DNL2: JNB TI, DNL2
CLR TI
INC R0
MOV A, @R0
MOVC A, @A+DPTR
MOV SBUF,A
DNL3: JNB TI, DNL3
CLR TI
INC R0
MOV A, @R0
MOVC A, @A+DPTR
MOV SBUF,A
DNL4: JNB TI, DNL4
CLR TI
CLR DISPCON
RET
;*******************************************
;0~9的段碼(共陽極)
;*******************************************
SEGTABN: DB 03H,9FH,25H,0DH,99H
DB 49H,41H,1FH,01H,09H,0FFH
;******************************************
;顯示P。
;*****************************************
DISPLAYP:
SETB DISPCON
MOV DPTR, #PSEG
CLR A
MOVC A, @A+DPTR
MOV SBUF, A
DPL1: JNB TI, DPL1
CLR TI
MOV A, #0FFH
MOV SBUF, A
DPL2: JNB TI, DPL2
CLR TI
MOV A, #0FFH
MOV SBUF, A
DPL3: JNB TI, DPL3
CLR TI
MOV A, #0FFH
MOV SBUF, A
DPL4: JNB TI, DPL4
CLR TI
CLR DISPCON
RET
;*****************************************
;P.的段碼
;*****************************************
PSEG: DB 30H
;*********************************************
;12小時制的T0定時中斷子程序:TIMER0
;定時時間為100MS,方式1的時間常數為3CB0H
;每次中斷,計數單元加一,10次為一秒,帶鬧鈴,誤差糾正
;*********************************************
TIMER0:
PUSH ACC
MOV TL0, #0B0H
MOV TH0, #3CH
CLR FRESH
CLR SEC
INC COUNT
MOV A, COUNT
JB TFIX, T0_00
XRL A, #10
SJMP T0_01
T0_00: XRL A, #N
T0_01: JZ T0_1
POP ACC
RETI
T0_1:
CLR TFIX
SETB SEC
MOV COUNT, #00H
INC SECOND
MOV A, SECOND
XRL A, #60
JZ T0_2
POP ACC
RETI
T0_2:
SETB FRESH
MOV SECOND, #00H
INC MINUL
MOV A, MINUL
XRL A, #0AH
JZ T0_3
LJMP ADJUST
T0_3:
MOV MINUL, #00H
INC MINUH
MOV A, MINUH
XRL A, #06
JZ T0_30
LJMP ADJUST
T0_30:
MOV MINUH, #00H
INC HOURL
MOV A, HOURH
JZ T0_300
MOV A, HOURL
XRL A,#03H
JZ T0_4
LJMP ADJUST
T0_300:
MOV A, HOURL
XRL A, #0AH
JZ T0_4
LJMP ADJUST
T0_4: MOV HOURL, #00
INC HOURH
MOV A, HOURH
XRL A, #02
JZ T0_40
LJMP ADJUST
T0_40: MOV HOURH, #00
MOV HOURL, #01
;--------------------
SETB TFIX
;--------------------
;時分發生變化時,進行鬧鈴的判斷
ADJUST:
JB WARNSETTED, ADJUST_1
POP ACC
RETI
ADJUST_1:
MOV A, HOURH
XRL A, WARNHH
JNZ ADJUST_2
MOV A, HOURL
XRL A, WARNHL
JNZ ADJUST_2
MOV A, MINUH
XRL A, WARNMH
JNZ ADJUST_2
MOV A, MINUL
XRL A, WARNML
JNZ ADJUST_2
SETB WARNING
POP ACC
RETI
ADJUST_2:
CLR WARNING
POP ACC
RETI
;******************************************
;系統初始華變量清零
SYS_INIT:
MOV IE, #00H; 關中斷
MOV R0, #20H; 清變量
MOV R1, #10H;
MOV A, #00H;
SYS_0: MOV @R0, A
INC R0
DJNZ R1, SYS_0
SETB EA
RET
;*******************************************
;定時器T0的初始化,定時常數為3CB0H,100ms
T0_INIT:
MOV TMOD, #11H; T0,T1方式1
MOV TH0, #3CH;
MOV TL0, #0B0H
RET
;*******************************************
;定時器T1的初始化,定時常數為3CB0H
T1_INIT:
MOV TH1, #3CH
MOV TL1, #0B0H
RET
;*********************************************
;UART初始化
;串口工作方式0
;TXD輸出時鐘,RXD數據輸出
UART_INIT:
MOV SCON, #00H
RET
;
;***********************************
;當前時間設置子程序:SETTIME
;按S1進入設置狀態,按S2進行+1
;************************************
SETTIME:
LCALL S1KEY
MOV SECOND, #00H
MOV MINUTE, #00H
MOV HOUR, #00H
MOV HOURH, #0
MOV HOURL, #0
MOV MINUH, #0
MOV MINUL, #0
MOV SETFLAG,#0
SETB HH
clr bb
setb falg
CLR SS
SETB TR1
SETB ET1
MOV COUNT, #0
SET_0:
JNB SS, SET_06
JNB HH, SET_02
MOV HHBACK, #0AH
MOV HLBACK, HOURL
MOV MHBACK, MINUH
MOV MLBACK, MINUL
SJMP SET_01
SET_02:
JNB HL, SET_03
MOV HHBACK, HOURH
MOV HLBACK, #0AH
MOV MHBACK, MINUH
MOV MLBACK, MINUL
SJMP SET_01
SET_03:
JNB MH, SET_04
MOV HHBACK, HOURH
MOV HLBACK, HOURL
MOV MHBACK, #0AH
MOV MLBACK, MINUL
SJMP SET_01
SET_04:
MOV HHBACK, HOURH
MOV HLBACK, HOURL
MOV MHBACK, MINUH
MOV MLBACK, #0AH
SET_01:
jb bb ,set_05
MOV R0, #HHBACK
lcall displaynew
cpl bb
SJMP SET_05
SET_06:
MOV R0, #HOURH
SET_05:
jnb falg, set_07
LCALL DISPLAYNEW ;---------------------
clr falg
set_07:
JB S1, SET_1
LCALL DELAY20MS
JB S1, SET_1
setb falg
JB ML, SET_00
MOV A, SETFLAG
RL A
MOV SETFLAG,A
SJMP SET_0
SET_00:
CLR TR1
CLR ET1
LCALL SETVALUE
RET
SET_1:
JB S2, SET_0
LCALL DELAY20MS
JB S2, SET_0
setb falg
JNB HH, SET_2
INC HOURH
MOV A, HOURH
XRL A, #2
JZ SET_10
LJMP SET_0
SET_10:
MOV HOURH, #0
LJMP SET_0
SET_2:
JNB HL, SET_3
INC HOURL
MOV A, HOURH
JNZ SET_20
MOV A, HOURL
XRL A, #0AH
JZ SET_21
LJMP SET_0
SET_21:
MOV HOURL, #0
LJMP SET_0
SET_20:
MOV A, HOURL
XRL A, #03H
JZ SET_22
LJMP SET_0
SET_22:
MOV HOURL, #0
LJMP SET_0
SET_3:
JNB MH, SET_4
INC MINUH
MOV A, MINUH
XRL A, #6
JZ SET_30
LJMP SET_0
SET_30:
MOV MINUH,#0
LJMP SET_0
SET_4:
INC MINUL
MOV A, MINUL
XRL A, #0AH
JZ SET_40
LJMP SET_0
SET_40:
MOV MINUL,#0
LJMP SET_0
;************************************
;鬧零設置
;************************************
SETWARN:
JB S1, $
LCALL DELAY20MS
LCALL DELAY20MS
JB S1, SETWARN
MOV WARNHH, #0
MOV WARNHL, #0
MOV WARNMH, #0
MOV WARNML, #0
MOV SETFLAG,#0
setb falg
clr bb
SETB HH
CLR SS
SETB TR1
SETB ET1
MOV COUNT, #0
SEW_0:
JNB SS, SEW_06
JNB HH, SEW_02
MOV HHBACK, #0AH
MOV HLBACK, WARNHL
MOV MHBACK, WARNMH
MOV MLBACK, WARNML
SJMP SEW_01
SEW_02:
JNB HL, SEW_03
MOV HHBACK, WARNHH
MOV HLBACK, #0AH
MOV MHBACK, WARNMH
MOV MLBACK, WARNML
SJMP SEW_01
SEW_03:
JNB MH, SEW_04
MOV HHBACK, WARNHH
MOV HLBACK, WARNHL
MOV MHBACK, #0AH
MOV MLBACK, WARNML
SJMP SEW_01
SEW_04:
MOV HHBACK, WARNHH
MOV HLBACK, WARNHL
MOV MHBACK, WARNMH
MOV MLBACK, #0AH
SEW_01:
jb bb ,sew_05
MOV R0, #HHBACK
lcall displaynew
cpl bb
SJMP SEW_05
SEW_06:
MOV R0, #WARNHH
SEW_05:
jnb falg, seW_07
LCALL DISPLAYNEW
clr falg
sew_07:
JB S1, SEW_1
LCALL DELAY20MS
JB S1, SEW_1
setb falg
JB ML, SEW_00
MOV A, SETFLAG
RL A
MOV SETFLAG,A
SJMP SEW_0
SEW_00:
CLR TR1
CLR ET1
LCALL SETVALUE
RET
SEW_1:
JB S2, SEW_0
LCALL DELAY20MS
JB S2, SEW_0
setb falg
JNB HH, SEW_2
INC WARNHH
MOV A, WARNHH
XRL A, #2
JZ SEW_10
LJMP SEW_0
SEW_10:
MOV WARNHH, #0
LJMP SEW_0
SEW_2:
JNB HL, SEW_3
INC WARNHL
MOV A, WARNHH
JNZ SEW_20
MOV A, WARNHL
XRL A, #0AH
JZ SEW_21
LJMP SEW_0
SEW_21:
MOV WARNHL, #0
LJMP SEW_0
SEW_20:
MOV A, WARNHL
XRL A, #03H
JZ SEW_22
LJMP SEW_0
SEW_22:
MOV WARNHL, #0
LJMP SEW_0
SEW_3:
JNB MH,SEW_4
INC WARNMH
MOV A, WARNMH
XRL A, #6
JZ SEW_30
LJMP SEW_0
SEW_30:
MOV WARNMH,#0
LJMP SEW_0
SEW_4:
INC WARNML
MOV A, WARNML
XRL A, #0AH
JZ SEW_40
LJMP SEW_0
SEW_40:
MOV WARNML, #0
LJMP SEW_0
;************************************************
;數據拼裝子程序:SETVALUE
;將HOURH,HOURL,MINUH,MIMUL平裝成HOUR,MINUTE
;************************************************
SETVALUE:
MOV HOUR, #00
MOV MINUTE,#00
MOV SECOND, #00
MOV A, HOURH
SWAP A
ORL A, HOURL
MOV HOUR, A
MOV A, MINUH
SWAP A
ORL A, MINUL
MOV MINUTE, A
RET
;*********************************************
;啟動走時子程序:RUN
;*********************************************
;********************************************
;S2鍵等待判斷子程序:S2KEY
;*********************************************
;***********************************************
;S1鍵等待判斷子程序:S1KEY
;***********************************************
S1KEY:
JB S1, $
LCALL DELAY20MS
JB S1, S1KEY
RET
;*********************************************
;延時20ms
;*********************************************
DELAY20MS:
MOV R6, #100
DEL20_0:
MOV R7, #0FFH
DJNZ R7, $
DJNZ R6, DEL20_0
RET
;*******************************************
;每中斷一次,計數單元加一。5次進行相應的處理
;*******************************************
TIMER1:
PUSH ACC
MOV TH1, #3CH
MOV TL1, #0BH
INC COUNT
MOV A, COUNT
XRL A, #5
JZ TIMER1_0
POP ACC
RETI
TIMER1_0:
CPL SS
setb bb
MOV COUNT, #0
POP ACC
RETI
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -