MOV R4,#14;
MOV TMOD,#11H
MOV TL0,#0B0H
MOV TH0,#3CH
SETB ET0
SETB TR0
SETB ET1
MOV DI_DA,#00H
CLR C_T2 ;
CLR CP_RL2;允许重载
;T2MOD的TO2是T2输出允许
MOV RCAP2H,#0D9H ;预先值高 10ms 12MHZ
MOV RCAP2L,#0B8H
MOV TH2,#0D9H
MOV TL2,#0B8H
SETB ET2
SETB EA
LCD_INIT://lcd的初化配置
;15MS
MOV R6,#30
LCALL DELAY_BY_R6 ;15ms
MOV P1,#38H ;写38h
LCALL WRITE_NOT_CHECK_BUSY
MOV R6,#10
LCALL DELAY_BY_R6 ;5ms
MOV P1,#38H
LCALL WRITE_NOT_CHECK_BUSY
MOV R6,#10
LCALL DELAY_BY_R6 ;5ms
;-----设转初始值
SETB E
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#00111000B ;8位2行5x7点阵
LCALL ENABLE ;调用写入命令子程序
MOV P1,#00001100B ;显示器开、光标开、光标允许闪烁
LCALL ENABLE ;调用写入命令子程序
MOV P1,#00000110B;文字不动,光标自动右移
LCALL ENABLE ;调用写入命令子程序
STORE_DEFINE_DATA: ;把自定义字符存入CGRAM
MOV P1,#40H ;CGRAM起始地址
LCALL ENABLE
MOV R2,#8
MOV DPTR,#DEFINE_DATA
MOV R3,#0
NEXTP:
MOV A,R3
MOVC A,@A+DPTR
MOV P1,A
LCALL WRITE_DATA_TO_LCD
INC R3
DJNZ R2,NEXTP
;****************主程序*******************
START:
LCALL RESET
JNB 70h,MAIN1
MOV P1,#0C0H ;写入显示起始地址(第二行第一个位置)
LCALL ENABLE ;调用写入命令子程序(写入字符串前要查忙)
DS18B20_NOT_READY:
LCALL DISPLAY_18B20_ERROR
LOOP1:
LCALL RESET
JNB 70h,MAIN1
JMP LOOP1 ;如果栓测不到18b20程序下面不执行
MAIN1:
MOV R1,#4 ;清单元数据
MOV R0,#21H
CLEAR:MOV A,#0
MOV @R0,A
INC R0
DJNZ R1,CLEAR
MOV R1,#30
MOV R0,#4DH
CLEAR1:MOV A,#0
MOV @R0,A
INC R0
DJNZ R1,CLEAR1
MOV R1,#9
MOV R0,#6BH
CLEAR2:MOV A,#0
MOV @R0,A
INC R0
DJNZ R1,CLEAR2
MOV R1,#6
MOV R0,#40H
CLEAR3:MOV A,#0
MOV @R0,A
INC R0
DJNZ R1,CLEAR3
BACKK:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
LCALL DISPLAY_WATING ;等待第一次结果.
LCALL SKIP_ROM
LCALL TEMP_CONV
LCALL DELAY_600MS
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MAIN :
LCALL RESET
LCALL SKIP_ROM
LCALL RELCALL_EPROM ;调入温度限值
MAIN_MAIN:
LCALL READ_TEMP ;读18b20的内部温度
JB 70h,DS18B20_NOT_READY ;中途失败!
LCALL DATA_CONV ; 数据转换,同时有温度比较和报警动作标志K_ON=1则对应开机器
LCALL DISPLAY_18B20_TEMP
LCALL DISPLAY_TIME
LCALL CONTROL
LCALL ALARM_COMPARE
JNB KEY_SET,S1;KEY_SET是设定上下限的标志按钮P0.3。。。
LCALL TIME_ADJ
LCALL MUSIC
JMP MAIN_MAIN
S1
CALL DELAY_2MS ;延时消抖
JB KEY_SET,MAIN
JNB KEY_SET,$;等待按键放开
LCALL KEY ;有键输入
AJMP MAIN
MUSIC:MOV A,#0F0H
MOV P2,A
MOV A,P2
CJNE A,#0F0H,KEYIN1
RET
KEYIN1:MOV R3,#0F7H;令第四行为0
MOV R1,#00H
SCAN: MOV A,R3
MOV P2,A
MOV A,P2
MOV R4,A;读回的值暂放R4中
SETB C
MOV R5,#04H;四列要扫描
K: RLC A
JNC DONE
INC R1
INC R1
DJNZ R5,K
MOV A,R3
SETB C
RRC A
MOV R3,A
JC SCAN
RET
DONE:MOV A,P2
XRL A,R4
JZ DONE
MOV A,R1
MOV DPTR,#FUNCTION_TAB
JMP @A+DPTR
FUNCTION_TAB:
AJMP FU0
AJMP FU1
AJMP FU2
AJMP FU3
AJMP FU4
AJMP FU5
AJMP FU6
AJMP FU7
AJMP FU8
AJMP FU9
AJMP FU10
AJMP FU11
AJMP FU12
AJMP FU13
AJMP FU14
AJMP FU15
FU0:
RET
FU1:
RET
FU2:
RET
FU3:
RET
FU4:
RET
FU5:;SETB P0.1
;CLR TEMPERATURE_ALARM_BEEP_FLAG
RET
FU6:
;MOV P1,#00000001B ;清屏并光标复位
;LCALL ENABLE;调用写入命令子程序
LCALL DISPLAY_ALARM_CLOCK_1;程序在后面加,只显示"ALARM_CLOCK_1"
ALARM_K:JB ALARM1_ON_OR_OFF,DISPLAY__ON
LCALL DISPLAY_ALARM_OFF
LJMP ALARM_DATACON_DIS
DISPLAY__ON
CALL DISPLAY_ALARM_ON
;下面是转换
ALARM_DATACON_DIS:
MOV A,ALARM1_H
SWAP A
ANL A,#0FH
MOV ALARM1_H_H,A
MOV A,ALARM1_H
ANL A,#0FH
MOV ALARM1_H_L,A
MOV A,ALARM1_M
SWAP A
ANL A,#0FH
MOV ALARM1_M_H,A
MOV A,ALARM1_M
ANL A,#0FH
MOV ALARM1_M_L,A
;下面是显示闹钟值
MOV P1,#11000101B
LCALL ENABLE
MOV DPTR,#LED_DATA
MOV R1,ALARM1_H_H //已经是压缩型BCD码了,
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#LED_DATA
MOV R1,ALARM1_H_L //已经是压缩型BCD码了,
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#MAO
MOV R1,#0;从字串中的第一个开始显示
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#LED_DATA
MOV R1,ALARM1_M_H //已经是压缩型BCD码了,
MOV R0,#1
LCALL DISPLAY
MOV DPTR,#LED_DATA
MOV R1,ALARM1_M_L //已经是压缩型BCD码了
MOV R0,#1
LCALL DISPLAY
;再下面就是判P0.30.40.5了
LOOPP: JB P0.4,PANP05;转判P0.5;;;;;;;;;
LCALL DELAY2S
JB P0.4,ADJ_ALARM_H ;如果一S之后为放开了,其实是在1S前就放开了的,则知道是调闹钟的小时值的
JNB P0.4,$;1S后还未放开,则等,1S后已经放开,则早就放开,所以进行不同操作
CPL ALARM1_ON_OR_OFF;如果一S后还为0则取反ALARM1_ON_OR_OFF标志,关掉闹钟
LJMP ALARM_K
ADJ_ALARM_H:MOV A,ALARM1_H
ADD A,#1
DA A
MOV ALARM1_H,A
CJNE A,#24H,ALARM_NEXT
MOV A,#0
MOV ALARM1_H,A
ALARM_NEXT
JMP ALARM_DATACON_DIS;跳到先转换数据,再显示
PANP05:JB P0.5,PAN03; 如果此时P0.5也为1,则转判P0.3
LCALL DELAY2S
JNB P0.5,$;等放开
MOV A,ALARM1_M
ADD A,#1
DA A
MOV ALARM1_M,A
CJNE A,#60H,ALARM_NEXT
MOV A,#0
MOV ALARM1_M,A
LJMP ALARM_DATACON_DIS
PAN03: JB P0.3,LOOPP
LCALL DELAY2S
JB P0.3,DISPLAY_ALARM2 ;如果一S之后为放开了,其实是在1S前就放开了的,则知道是设闹钟2
JNB P0.3,$;
LJMP BACKK;如果长久按P0.3则跳出到主程序中去
;下面是设置第二个闹钟
DISPLAY_ALARM2:
LCALL DISPLAY_ALARM_CLOCK_2
ALARM_K1:JB ALARM2_ON_OR_OFF,DISPLAY__ON_2
LCALL DISPLAY_ALARM_OFF
LJMP ALARM_DATACON_DIS_2
DISPLAY__ON_2
CALL DISPLAY_ALARM_ON
ALARM_DATACON_DIS_2:
MOV A,ALARM2_H
SWAP A
ANL A,#0FH
MOV ALARM2_H_H,A
MOV A,ALARM2_H
ANL A,#0FH
MOV ALARM2_H_L,A
MOV A,ALARM2_M
SWAP A
ANL A,#0FH
MOV ALARM2_M_H,A
MOV A,ALARM2_M
ANL A,#0FH
MOV ALARM2_M_L,A