📄 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控制命令
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 ;DS1302片选端
IO_DATA BIT P1.6 ;DS130通信口
SCLK BIT P1.7 ;DS1302时钟(单片机模拟)
;others register difined
KEY_I0 BIT P3.4 ;继电器控制IO
DATA_IO BIT P3.5 ;DS18B20通信口
UESLESS_BIT BIT 08H ;设定值无效状态位
LS_TDATA EQU 2EH ;获取温度值高8BIT寄存器
MS_TDATA EQU 2FH ;~低8BIT寄存器(定义在此地址方便位操作)
KEY_DATA EQU 30H ;键值存放寄存器
TIME1_CN EQU 42H ;定时器1计数寄存器
LCD_STAT EQU 43h ;LCD显示状态寄存器
AC_ADD EQU 44H ;LCD显示计数器值暂存器
AC_DATA EQU 45H ;读取LCD显示值暂存器
TIME0_CN EQU 46H ;定时器0计数寄存器
CHAR EQU 47H ;温度符号寄存器
MS_TEMP EQU 48H ;处理后待送出显示的温度寄存器
LS_TEMP EQU 49H ;
POINT EQU 4AH ;小数点
FLOT EQU 4BH ;0.5℃精度位
CH_RESULT EQU 4CH ;
;********************************
;* start of program *
;********************************
ORG 0000H
AJMP START
ORG 0003H
AJMP INT_INT0
ORG 000BH
DEC TIME0_CN
MOV TH0,#02H
MOV TL0,#18H
AJMP INT_TIME0
ORG 001BH
AJMP INT_TIME1
ORG 0100H
START: MOV SP,#50H
MOV IE,#83H
MOV TMOD,#11H ;设置定时器工作方式
MOV TH0,#0ffH
MOV TL0,#0fEH
CALL PRE_DS18B20 ;初始化DS18B20
CALL DS1302_BEGIN ;初始化DS1302
MOV A,#38h ;初始化LCD
call wrcmd
mov point,#2eh ;小数点显示
MOV P1,#0C3h
MOV LCD_STAT,#0
MOV TIME0_CN,#1
MOV TIME1_CN,#0
MOV R0,#WORK_DATA ;读DS1302_RAM的值
MOV R2,#8
MOV R4,#0CFH
CALL READ_DS1302
SETB TR0
LOP:
ANL 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
JNZ QUIT_TIME0
MOV TIME0_CN,#1
call int_ds1820
mov a,#0cch ;跳过ROM
call set_commd
mov a,#0beh ;READ_ROM COMMD
call set_commd
call read_data
call int_ds1820 ;复位脉冲
setb DATA_IO
call change_data
MOV R0,#WEEK ;读DS1302时钟值
MOV R2,#6
MOV R4,#8DH
CALL READ_DS1302
;交换年与星期的值
MOV A,32H
MOV R0,#33H
XCH A,@R0
MOV 32H,A
CALL COMPAIR ;任务时间判断
CALL LCD_DISPLAY
QUIT_TIME0:
CALL INT_DS1820
MOV A,#0CCH
CALL SET_COMMD
MOV A,#44H ;启动DS18B20
CALL SET_COMMD
SETB EA
SETB TR0
RETI
;**********************************TIME1
INT_TIME1:
PUSH ACC
CLR EA
CLR TR1
INC TIME1_CN
MOV TH1,#9EH
MOV TL1,#58H
SETB TR1
SETB EA
POP ACC
RETI
;***************************************DS18B20初始化程序
PRE_DS18B20:
CALL INT_DS1820
MOV A,#0CCH ;跳过ROM
CALL SET_COMMD
MOV A,#4EH
CALL SET_COMMD
mov a,#00h
call set_commd
mov a,#00h
call set_commd
mov a,#1fh
call set_commd
call int_ds1820
mov a,#0cch
call set_commd
mov a,#48h
Call set_commd
call int_ds1820
ret
;ds18b20处理子程序
int_ds1820:
setb DATA_IO
NOP
clr DATA_IO
mov r2,#50 ;600USdelay
djnz r2,$
setb DATA_IO ;释放总线
mov r2,#25
djnz r2,$ ;300us delay
SETB DATA_IO
ret
set_commd:
SETB DATA_IO
mov r3,#8
clr c
gn:clr DATA_IO
rrc a
NOP
mov DATA_IO,c ;发送数据到总线
mov r2,#6 ;延时至少60US,以让DS1820能有足够的时间采样
djnz r2,$
setb DATA_IO ;总线拉高
nop
djnz r3,gn
ret
read_data:
mov r1,#LS_TDATA
mov r3,#8
mov r4,#2
lop1:
clr DATA_IO ;拉低总线
nop
setb DATA_IO ;释放总线
nop ;6usdelay
mov c,DATA_IO ;读总线值
rrc a
mov r2,#6
djnz r2,$
djnz r3,lop1
mov @r1,a
inc r1 ;MS_TDATA
mov r3,#8
djnz r4,lop1
ret
CHANGE_DATA: ;温度数据处理子程序
JB 2fh.3,LOW_0 ;正负判断
JMP HIGH_0
LOW_0:
MOV CHAR,#45 ;显示负号
CLR C
MOV A,2EH
SUBB A,#1
MOV 2EH,A
JC SUB_2FH
DDF:MOV R0,#2FH
MOV A,2EH
XCHD A,@R0 ;交换2EH与2FH的低4位
SWAP A ;交换2EH高低位值
CPL A ;取反,求得补码放入2EH,符号位放入2FH
MOV 2EH,A
MOV A,2FH
CPL A
MOV 2FH,A
JMP PAND_P
SUB_2FH:CLR C
MOV A,2FH
SUBB A,#1
MOV 2FH,A
JMP DDF
PAND_P:JB 2FH.3,INC_05
MOV FLOT,#48
BJJ:MOV A,2EH
MOV DPTR,#TEMP_TABL
MOVC A,@A+DPTR
MOV CH_RESULT,A
ANL A,#0F0H ;屏蔽低位值
SWAP A
ADD A,#48
MOV MS_TEMP,A
MOV A,CH_RESULT
ANL A,#0FH ;屏蔽高位值
ADD A,#48
MOV LS_TEMP,A
RET
INC_05:MOV FLOT,#53
JMP BJJ
HIGH_0:
MOV CHAR,#43 ;温度值大于0,
MOV R0,#2FH
MOV A,2EH
XCHD A,@R0
SWAP A
MOV 2EH,A
JMP PAND_P
TEMP_TABL:
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H
DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H
DB 50H,51H,52H,53H,54H,55H,56H,57H,58H,59H
DB 60H,61H,62H,63H,64H,65H,66H,67H,68H,69H
DB 70H,71H,72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H,88H,89H
DB 90H,91H,92H,93H,94H,95H,96H,97H,98H,99H
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$DS1302初始化子程序
DS1302_BEGIN:
mov r5,#10001110b ;允许写入数据
mov r1,#LCD_STAT ;写0
call wr_data_ds1302
mov r5,#10010000b ;设置电源工作方式
mov r1,#LCD_STAT ;写0
call wr_data_ds1302
mov r5,#10000000b ;启动振荡电路
mov r1,#LCD_STAT ;写0
call wr_data_ds1302
ret
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$键扫描子程序
KEY_SCANF:
MOV A,P1
ANL A,#0E3H
JNB ACC.0,COM0
JNB ACC.1,COM1
RET
COM0:
MOV P1,#0cEH
nop
MOV A,P1
JNB ACC.2,PRESS1
JNB ACC.3,PRESS3
JNB ACC.4,PRESS5
RET
COM1:
MOV P1,#0cDH
nop
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,#3
RET
PRESS3: MOV KEY_DATA,#2
RET
PRESS4: MOV KEY_DATA,#4
RET
PRESS5: MOV KEY_DATA,#5
RET
PRESS6: MOV KEY_DATA,#6
RET
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$读DS1302里的值
READ_DS1302:
clr rst
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 sclk
CLR RST
DJNZ R2,RD_DATA0
RET
;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
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 R5,#5
KTJ:MOV A,@R0
CALL SET_DATA
INC R0
DJNZ R5,KTJ
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
clr acc.7
jb ACC.7,wtbusy
RET
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$星期显示处理程序
WEEK0: MOV A,32H ;SP=54
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -