?? main.asm
字號:
;Main program
;LCD Registers addresses
LCD_CMD_WR equ 0FCFFH
LCD_DATA_WR equ 0FDFFH
LCD_BUSY_RD equ 0FEFFH
LCD_DATA_RD equ 0FFFFH
;LCD Commands
LCD_CLS equ 1
LCD_HOME equ 2
LCD_SETMODE equ 4
LCD_SETVISIBLE equ 8
LCD_SHIFT equ 16
LCD_SETFUNCTION equ 32
LCD_SETCGADDR equ 64
LCD_SETDDADDR equ 128
RTC EQU 32H
WEEK DATA RTC
YEAR DATA WEEK+1
MONTH DATA WEEK+2
DATE DATA WEEK+3
HOUR DATA WEEK+4
MINU DATA WEEK+5
WORK_DATA EQU 38H
S1_HOUR_DATA DATA WORK_DATA
S1_MINU_DATA DATA WORK_DATA+1
T1_HOUR_DATA DATA WORK_DATA+2
T1_MINU_DATA DATA WORK_DATA+3
S2_HOUR_DATA DATA WORK_DATA+4
S2_MINU_DATA DATA WORK_DATA+5
T2_HOUR_DATA DATA WORK_DATA+6
T2_MINU_DATA DATA WORK_DATA+7
;DS1302
RST BIT P1.5
IO_DATA BIT P1.6
SCLK BIT P1.7
;others register difined
KEY_I0 BIT P3.4
T_RST BIT P3.5
KEY_DATA EQU 30H
UESLESS_BIT BIT 08H
T_DATA EQU 40H
TH_DATA EQU 41H
TIME_COUNTER EQU 42H
LCD_STAT EQU 43h
AC_ADD EQU 44H
AC_DATA EQU 45H
TIME0_CN EQU 46H
CHAR_ EQU 47H
T_DATAH EQU 48H
T_DATAL EQU 49H
POINTER EQU 4AH
LAST_ EQU 4BH
;********************************
;* start of program *
;********************************
ORG 0000H
AJMP START
ORG 0003H
AJMP INT_INT0
ORG 000BH
DEC TIME0_CN
MOV TH0,#3CH
MOV TL0,#0B0H
AJMP INT_TIME0
ORG 001BH
AJMP INT_TIME1
ORG 0100H
START: MOV SP,#50H
MOV IE,#83H
MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV P1,#0C3h
CLR T_RST
MOV POINTER,#46
MOV TIME0_CN,#1
MOV TIME_COUNTER,#0
mov lcd_stat,#0
MOV R0,#WORK_DATA
MOV R2,#8
MOV R4,#0CFH
CALL READ_DS1302
mov A,#38h
call wrcmd
SETB TR0
LOP:
ORL PCON,#1 ;系統進入低功耗狀態
JMP LOP
;中斷子程序
;int0*********************************************
INT_INT0:
CLR EA
CLR TR0
CALL DELAY8MS
MOV A,P3
JNB ACC.2,BDUAN_STAT
SETB EA
SETB TR0
RETI
BDUAN_STAT:
POP ACC
POP ACC
MOV DPTR,#START_
PUSH DPL
PUSH DPH
RETI
;TIMER0 INTERRUPT PROGRAM********************************
INT_TIME0:
CLR EA
CLR TR0
MOV A,TIME0_CN
XRL A,#3
JZ SET_DS1620
BACK8:MOV A,TIME0_CN
JNZ QUIT_TIME0
MOV TIME0_CN,#4
MOV R2,#0AAH
CALL READ_T_DATA
MOV DPTR,#T_NO
MOV A,TH_DATA
JNB ACC.0,POS_
JMP NEG_
NEG_:MOV CHAR_,#45
MOV A,T_DATA
RRC A
SUBB A,#1
CPL A
MOVC A,@A+DPTR
MOV T_DATA,A
JMP P_C
POS_:MOV CHAR_,#43
MOV A,T_DATA
RRC A
MOVC A,@A+DPTR
MOV T_DATA,A
P_C:JC INC_5
JMP INC_0
INC_5:MOV LAST_,#53
JMP CHANGE_T
INC_0:MOV LAST_,#48
JMP CHANGE_T
CHANGE_T:MOV A,T_DATA
ANL A,#0FH
ADD A,#48
MOV T_DATAL,A
MOV A,T_DATA
ANL A,#0F0H
SWAP A
ADD A,#48
MOV T_DATAH,A
MOV R0,#WEEK
MOV R2,#6
MOV R4,#8DH
CALL READ_DS1302
;交換年與星期的值
MOV A,32H
MOV R0,#33H
XCH A,@R0
MOV 32H,A
CALL LCD_DISPLAY
CALL COMPAIR
QUIT_TIME0:
SETB EA
SETB TR0
RETI
SET_DS1620:
MOV R2,#0CH
MOV R4,#01H
CALL HAVE_DATA_WR
JMP BACK8
;**********************************TIME1
INT_TIME1:
PUSH ACC
PUSH PSW
CLR EA
CLR TR1
INC TIME_COUNTER
MOV TH1,#9EH
MOV TL1,#58H
SETB TR1
SETB EA
POP PSW
POP ACC
RETI
;====================================鍵掃描子程序
KEY_SCANF:
MOV A,P1
ANL A,#0E3H
JNB ACC.0,COM0
JNB ACC.1,COM1
RET
COM0:
MOV P1,#0FEH
MOV A,P1
JNB ACC.2,PRESS1
JNB ACC.3,PRESS3
JNB ACC.4,PRESS5
RET
COM1:
MOV P1,#0FDH
MOV A,P1
JNB ACC.2,PRESS2
JNB ACC.3,PRESS4
JNB ACC.4,PRESS6
RET
PRESS1: MOV KEY_DATA,#1
RET
PRESS2: MOV KEY_DATA,#2
RET
PRESS3: MOV KEY_DATA,#3
RET
PRESS4: MOV KEY_DATA,#4
RET
PRESS5: MOV KEY_DATA,#5
RET
PRESS6: MOV KEY_DATA,#6
RET
;讀DS1302里的值$$$$$$$$$$$$$$$$$$$$
READ_DS1302:
CLR SCLK
RD_DATA0:SETB RST
MOV A,R4
MOV R3,#8
LOPP:CLR SCLK
RRC A
MOV IO_DATA,C
SETB SCLK
nop
DJNZ R3,LOPP
MOV A,R4
CLR C
SUBB A,#02
MOV R4,A
MOV R3,#8
RD_DATA1:CLR SCLK
nop
MOV C,IO_DATA
RRC A
SETB SCLK
DJNZ R3,RD_DATA1
MOV @R0,A
INC R0
CLR RST
DJNZ R2,RD_DATA0
RET
;DS1620讀寫子程序(r2:commond r4:data R5:READ_TIMES)
NO_DATA_WR: ;不帶數據的寫子程序
CLR SCLK
SETB T_RST
MOV R3,#8 ;8 bits need to write into ds1620
MOV A,R2 ;R2里存將要發送的數據
GON1:CLR SCLK
RRC A ;將要發送位右移到C中
MOV IO_DATA,C
SETB SCLK
NOP
DJNZ R3,GON1
CLR T_RST
RET
HAVE_DATA_WR: ;帶數據傳送的子程序
CLR SCLK
SETB T_RST
MOV R3,#8
MOV A,R2
GON2:CLR SCLK
RRC A
MOV IO_DATA,C
SETB SCLK
NOP
DJNZ R3,GON2
MOV R3,#8
MOV A,R4
GON3:CLR SCLK
RRC A
MOV IO_DATA,C
SETB SCLK
NOP
DJNZ R3,GON3
CLR T_RST
RET
READ_T_DATA:
CLR SCLK
SETB T_RST
MOV R3,#8 ;8 bits need to write into ds1620
MOV A,R2 ;R2里存將要發送的數據
GON4:CLR SCLK
RRC A ;將要發送位右移到C中
MOV IO_DATA,C
SETB SCLK
NOP
DJNZ R3,GON4
CLR SCLK
MOV R5,#2
MOV R1,#T_DATA
RD_HIGH_BYE:MOV R3,#8
GON5:CLR SCLK
NOP
MOV C,IO_DATA
RRC A
SETB SCLK
DJNZ R3,GON5
MOV @R1,A
INC R1
DJNZ R5,RD_HIGH_BYE
CLR T_RST
RET
T_NO:
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
DB 20H,12H,22H,23H,24H,25H,26H,27H,28H,29H,30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H,50H,51H,52H,53H,54H,55H,56H,57H,58H,59H
;LCD子程序
LCD_DISPLAY:
MOV A,#LCD_SETDDADDR
CALL WRCMD
mov DPTR,#LINE1
mov r1,#year
call wrstr
mov a,#LCD_SETDDADDR+64
CALL WRCMD
mov dptr,#line2
mov r1,#HOUR
call wrstr
mov A,#LCD_SETVISIBLE+4 ;Make the display & blink visible:
call wrcmd
RET
wrstr:
clr A
movc A,@A+DPTR
jz wrstr1
cjne a,#42,goon2
JMP WEN
GOON2:CJNE A,#35,GOON3
JMP WEEK0
GOON3:CJNE A,#37,GOON
MOV R0,#CHAR_
MOV R2,#5
KTJ:MOV A,@R0
CALL SET_DATA
INC R0
DJNZ R2,KTJ
INC DPTR
INC DPTR
INC DPTR
JMP GOON1
WEN:mov a,@r1
anl a,#0f0h
swap a
add a,#48
call set_data
mov a,@r1
anl a,#0fh
add a,#48
call set_data
inc r1
jmp goon1
goon: call set_data
goon1: inc DPTR
jmp wrstr
set_data:
push dpl
push dph
mov dptr,#LCD_DATA_WR
movx @dptr,A
call wtbusy
pop dph
pop dpl
wrstr1: ret
wrcmd: mov dptr,#LCD_CMD_WR
movx @dptr,A
jmp wtbusy
wtbusy: mov dptr,#LCD_BUSY_RD
movx A,@dptr
jb ACC.7,wtbusy
reT
WEEK0: MOV A,32H
XRL A,#02H
JNZ NEXT1
JMP MONDAY
NEXT1:MOV A,32H
XRL A,#03H
JNZ NEXT2
JMP TUESDAY
NEXT2:MOV A,32H
XRL A,#04H
JNZ NEXT3
JMP WEDNESDAY
NEXT3:MOV A,32H
XRL A,#05H
JNZ NEXT4
JMP THURSDAY
NEXT4:MOV A,32H
XRL A,#06H
JNZ NEXT5
JMP FRIDAY
NEXT5:MOV A,32H
XRL A,#07H
JNZ NEXT6
JMP SATERDAY
NEXT6:JMP SUNDAY
;*********************
MONDAY:MOV DPTR,#MON
CALL WRSTR
ret
TUESDAY:MOV DPTR,#TUE
CALL WRSTR
ret
WEDNESDAY:MOV DPTR,#WED
CALL WRSTR
ret
THURSDAY:MOV DPTR,#THU
CALL WRSTR
ret
FRIDAY: MOV DPTR,#FRI
CALL WRSTR
ret
SATERDAY:MOV DPTR,#SAT
CALL WRSTR
ret
SUNDAY: MOV DPTR,#SUN
CALL WRSTR
ret
;++++++++++++++++++++++++++++++++++lcd tab1
MON:DB 'Monday '
DB 0
TUE:DB 'Tuesday '
DB 0
WED:DB 'Wednesday '
DB 0
THU:DB 'Thursday '
DB 0
FRI:DB 'Friday '
DB 0
SAT:DB 'Saturday '
DB 0
SUN:DB 'Sunday '
DB 0
line1:db '20*/*/* # '
db 0
line2:db ' *:* % C '
db 0
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -