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

📄 1602_lcd at89s52.txt

📁 使用1602_LCD AT89S52 18B20实现的温度报警
💻 TXT
📖 第 1 页 / 共 4 页
字号:
LJMP ALARM_K2
ADJ_ALARM_3_H:
            MOV A,ALARM3_H
            ADD A,#1
			DA A
			MOV ALARM3_H,A
			CJNE A,#24H,ALARM_NEXT_3
			MOV A,#0
			MOV ALARM3_H,A

ALARM_NEXT_3:LJMP ALARM_DATACON_DIS_3;跳到先转换数据,再显示

PANP05_3:JB P0.5,PAN03_3; 如果此时P0.5也为1,则转判P0.3
       LCALL DELAY2S
JNB P0.5,$;等放开
 MOV A,ALARM3_M
            ADD A,#1
			DA A
			MOV ALARM3_M,A
			CJNE A,#60H,ALARM_NEXT_3
			MOV A,#0
			MOV ALARM3_M,A

		   LJMP ALARM_DATACON_DIS_3
PAN03_3:	JB P0.3,LOOPPPP
		LCALL DELAY2S
        JB P0.3,TO_FU6	;如果一S之后为放开了,其实是在1S前就放开了的,则知道是设闹钟2
        JNB P0.3,$;
		LJMP BACKK;如果长久按P0.3则跳出到主程序中去
TO_FU6:LJMP FU6
;下面是主程序要调用的比较当前时钟与闹钟值
ALARM_COMPARE:
    JNB ALARM1_ON_OR_OFF,ALARM2_COMPARE
	MOV A,ALARM1_H
	CJNE A,HOUR,ALARM2_COMPARE
	MOV A,ALARM1_M
	CJNE A,MIN,ALARM2_COMPARE
	;CLR P0.1
	
	;SETB TEMPERATURE_ALARM_BEEP_FLAG;置位此标志,为1时在后面的CONTROL中SETB P0.1时要考虑此标志为1则不要SETB P0.1了
	CLR ALARM1_ON_OR_OFF

	MOV A,#0
	MOV ALARM1_H,A;响应闹钟后要清0
	MOV ALARM1_M,A
	
	LCALL FU12
 LCALL DELAY2S
 	MOV A,#0F0H
 MOV P2,A
ALARM2_COMPARE:
    JNB ALARM2_ON_OR_OFF,ALARM3_COMPARE
		MOV A,ALARM2_H
	CJNE A,HOUR,ALARM3_COMPARE
	MOV A,ALARM2_M
	CJNE A,MIN,ALARM3_COMPARE
	;CLR P0.1
	;SETB TEMPERATURE_ALARM_BEEP_FLAG
	CLR ALARM2_ON_OR_OFF
	MOV A,#0
	MOV ALARM2_H,A;响应闹钟后要清0
	MOV ALARM2_M,A
	;此句是后加的,还有下面
	LCALL FU12
 LCALL DELAY2S
 	MOV A,#0F0H
 MOV P2,A
ALARM3_COMPARE:
	  JNB ALARM3_ON_OR_OFF,COMPARE_BACK
		MOV A,ALARM3_H
	CJNE A,HOUR,COMPARE_BACK
	MOV A,ALARM3_M
	CJNE A,MIN,COMPARE_BACK
	;CLR P0.1
	;SETB TEMPERATURE_ALARM_BEEP_FLAG
	CLR ALARM3_ON_OR_OFF
	MOV A,#0
	MOV ALARM3_H,A;响应闹钟后要清0
	MOV ALARM3_M,A
	
	LCALL FU12

 LCALL DELAY2S
 	MOV A,#0F0H
 MOV P2,A
COMPARE_BACK:

	 RET
FU7:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序 

LCALL DISPLAYINT_STOPWATCH_000000;显示STOPWATCH及----00:00:00----
SETB STOPWATCH_FLAG1;注意在返回主程序前要清0此标志啊;此标志用于开始及暂停
LCALL STOPWATCH_CONTROL;调用判P0.345有无按下
RET;一般是不会自动返回的,只在STOPWATCH_CONTROL中用LJMP 跳回到主程序中继续其它时间温度

RET
FU8:MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序 
LCALL DISPLAYINT_MUSIC
MOV DPTR,#MUSIC_NAME_8
LCALL DISPLAY_NAME
MOV DPTR,#MUSIC_TAB8_ZHOUXIANGCHUN
LCALL PLAYINGSONG
RET

FU9:MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序 
LCALL DISPLAYINT_MUSIC
MOV DPTR,#MUSIC_NAME_9
LCALL DISPLAY_NAME
MOV DPTR,#MUSIC_TAB9_SHUIZAIWOSHANG 
LCALL PLAYINGSONG   
 RET
 
FU10:  MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序 
LCALL DISPLAYINT_MUSIC
MOV DPTR,#MUSIC_NAME_10
LCALL DISPLAY_NAME
MOV DPTR, #MUSIC_TAB10_SHANGAITANG
LCALL PLAYINGSONG
 RET
 
FU11:  MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序 
LCALL DISPLAYINT_MUSIC
MOV DPTR,#MUSIC_NAME_11
LCALL DISPLAY_NAME
MOV DPTR,#MUSIC_TAB11_GUDANBEI
LCALL PLAYINGSONG
RET

FU12: MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序 
LCALL DISPLAYINT_MUSIC
MOV DPTR,#MUSIC_NAME_12
LCALL DISPLAY_NAME
 MOV DPTR,#MUSIC_TAB12_TAOHUADUODUOKAI
 LCALL PLAYINGSONG
 RET

FU13:	MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序 
LCALL DISPLAYINT_MUSIC
MOV DPTR,#MUSIC_NAME_13
LCALL DISPLAY_NAME
MOV DPTR,#MUSIC_TAB13_DACHENXIAAI
LCALL PLAYINGSONG
RET

FU14:MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序 
LCALL DISPLAYINT_MUSIC
MOV DPTR,#MUSIC_NAME_14
LCALL DISPLAY_NAME
MOV DPTR,#MUSIC_TAB14_QIUFU
LCALL PLAYINGSONG
RET

FU15: MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序 
LCALL DISPLAYINT_MUSIC
MOV DPTR,#MUSIC_NAME_15
LCALL DISPLAY_NAME
MOV DPTR,#MUSIC_TAB15_JUSTLOVEYOU
LCALL PLAYINGSONG
RET



CONTROL: ;如果28H值在上限值与90度之关,则报警
JB K_ON,CONTROL1;   K_ON的值在数据转换比较下上限温子程序设定
CLR P0.1;超上限温,,则报警,,,而
SETB P3.7;关显示器
;只是在LCD上显示OFF或ON表示机器状态其实在哪可让温报警呢,,在比较的地方可以吧?
AJMP CONTROL_END
CONTROL1:;JB TEMPERATURE_ALARM_BEEP_FLAG,CONTROL2

SETB P0.1
CLR P3.7
;CONTROL2:    CLR P3.7 ;显示器开时是正常工作的
CONTROL_END:
RET 
PLAYINGSONG:
 LOOP8:CLR A
 MOVC A,@A+DPTR
 MOV R1,A
 INC DPTR
 CLR A
 MOVC A,@A+DPTR
 MOV R0,A
 CLR A
 INC DPTR
 MOVC A,@A+DPTR
 MOV R2,A
 MOV A,R0
 ORL A,R1
 JZ STOP8
 MOV A,R0
 ANL A,R1
 CJNE A,#0FFH,NEXT8
EXIT8: CLR TR1
 MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
 RET
 
 STOP8:CLR TR1
 LCALL DELAY
 AJMP STOP18
 NEXT8: MOV A,#0F0H
      MOV P2,A
	  MOV A,P2
	  CJNE A,#0F0H,EXIT8
 MOV TH1,R1
 
 MOV TL1,R0
 SETB TR1
 
 LCALL DELAY
 STOP18:INC DPTR
 AJMP LOOP8


 
//**********下面是时间按键及调整程序****************


TIME_ADJ:JNB P0.4,TIME_HOUR
     JNB P0.5,TIME_MIN
	 RET

TIME_HOUR:LCALL DELAY2S
         
		 
		 JNB P0.4,$
		 MOV A,HOUR
		 ADD A,#1
		 DA A
		 CJNE A,#24H,TT1
		 MOV A,#0
	TT1:MOV HOUR,A
	    LCALL DATA_CONV1
		LCALL DISPLAY_TIME
		JNB P0.4,TIME_HOUR
		AJMP TIME_ADJ 


TIME_MIN:LCALL DELAY2S
			JNB P0.5,$
			MOV A,MIN
			ADD A,#1
			DA A
			CJNE A,#60H,TT2
			MOV A,#0
	TT2:    MOV MIN,A
	       LCALL DATA_CONV1
		   LCALL DISPLAY_TIME
		   JNB P0.5,TIME_MIN
		   AJMP TIME_ADJ

//***********/
;***************键处理程序******************
KEY: SETB 01H;01H是高低温设定标志位  (01H)=1设高限否则设低限
KEY_IN:   ;有键输入的程序
   MOV P1,#00000001B ;清屏并光标复位
  LCALL ENABLE;调用写入命令子程序
  JNB 01H,DSP_SET_L ;01如果是0,则显示L:
DSP_SET_H: ;显示高温的限值
  MOV P1,#10000000B
  LCALL DISPLAY_SETING_TEMP_H ;显示SETING_TEMP:H ..
  MOV DPTR,#LED_DATA
  MOV R1,42H ;码表初值   42H存的是限值哦
  MOV R0,#1;字数
  LCALL DISPLAY
;---------------显示温度限值低位
MOV DPTR,#LED_DATA
MOV R1,41H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示温度限值低位
MOV DPTR,#LED_DATA
MOV R1,40H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
AJMP KEY_SELECT

DSP_SET_L:;显示低温的限值
    MOV P1,#10000000B
    LCALL DISPLAY_SETING_TEMP_L ;显示SETING_TEMP:L ..
    MOV DPTR,#LED_DATA
    MOV R1,45H ;码表初值
    MOV R0,#1;字数
    LCALL DISPLAY
;---------------显示温度限值低位
MOV DPTR,#LED_DATA
MOV R1,44H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示温度限值低位
MOV DPTR,#LED_DATA
MOV R1,43H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
AJMP KEY_SELECT 

STOPWATCH_CONTROL:JB P0.3,W1;P0.3是控制秒表开始暂停的
                  JNB P0.3,$;等放开
				  JNB STOPWATCH_FLAG1,C1;标志为0则开始秒表
				  CPL STOPWATCH_FLAG1
				  SETB TR2
				  
				  LJMP STOPWATCH_CONTROL
				  W2:JB P0.5,STOPWATCH_CONTROL
   JNB P0.5,$
   CLR TR2
   CLR STOPWATCH_FLAG1;此句重要
   LJMP BACKK;跳出之前要跳到有清屏的地方
				C1:CLR TR2
				   CPL STOPWATCH_FLAG1
				   LJMP STOPWATCH_CONTROL
				   W1:JB P0.4,W2;P0.4用于将各单元归0,P0.5 则用于跳回到主程序中但退出前要清屏哦
					 JNB P0.4,$
					 CLR TR2
					 MOV A,#0
					 MOV WATCH_H,A
					 MOV WATCH_M,A
					 MOV WATCH_S,A
					 MOV WATCH_MS,A;清0后应该要调用显示一次吧,,让000000显示出来	试试启动TR2看(不行),否则紧接下写显示程序
					 ;下面还要调用数据转换哦
					 	   MOV A,WATCH_H
SWAP A	;先存的是十位
ANL A,#0FH
MOV WATCH_H_H,A
MOV A,WATCH_H
ANL A,#0FH
MOV WATCH_H_L,A

MOV A,WATCH_M
SWAP A
ANL A,#0FH
MOV WATCH_M_H,A
MOV A,WATCH_M
ANL A,#0FH
MOV WATCH_M_L,A

MOV A,WATCH_S
SWAP A
ANL A,#0FH
MOV WATCH_S_H,A
MOV A,WATCH_S
ANL A,#0FH
MOV WATCH_S_L,A

MOV A,WATCH_MS
MOV B,#10
DIV AB
MOV WATCH_MS_H,A
MOV WATCH_MS_L,B
					 ;下面是显示
					 MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
;紧接着显示STOPWATCH在上行
MOV P1,#10000000B
LCALL ENABLE
MOV DPTR,#STOPWATCH
MOV R1,#0
MOV R0,#16
LCALL DISPLAY

MOV P1,#11000000B;先显示----        ----  不能显示空格的,,否则之后显示数据时又要重新清屏,所以分开两次写吧
LCALL ENABLE
MOV DPTR,#STRII_1
MOV R1,#0
MOV R0,#2
LCALL DISPLAY
/***************/
MOV P1,#11000010B;再由第二行第四列开始显示STOPWATCH 的时,占两位后是:号
MOV DPTR,#LED_DATA;这方法可一位一位的显示
MOV R1,WATCH_H_H//已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY


MOV DPTR,#LED_DATA
MOV R1,WATCH_H_L //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#MAO
MOV R1,#0
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_M_H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_M_L //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#MAO
MOV R1,#0
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_S_H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_S_L //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#MAO
MOV R1,#0
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_MS_H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_MS_L //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY



MOV P1,#11001101B;先显示----        ----  不能显示空格的,,否则之后显示数据时又要重新清屏,所以分开两次写吧
LCALL ENABLE
MOV DPTR,#STRII_1
MOV R1,#0
MOV R0,#3
LCALL DISPLAY
CLR TR2
LJMP STOPWATCH_CONTROL



;---------选择加 或  减   两个按键
KEY_SELECT:
JNB KEY_SET,K_SET;第二次按下P0.3则等它放开后使01H取反,,,表示对低限设置
JNB KEY_UP,K_UP
JNB KEY_DOWN,K_DOWN
AJMP KEY_SELECT 
DELAY:MOV R3,#2
 D1:MOV R4,#125
 D2:MOV R5,#248
 DJNZ R5,$
 DJNZ R4,D2
 DJNZ R3,D1
 DJNZ R2,DELAY
 RET


K_SET:
LCALL DELAY_2MS
LCALL delay_2ms
LCALL delay_2ms
JB KEY_SET,KEY_SELECT 


MOV R5,#250
KSET_LOOP:
JB KEY_SET,KEY_CPL
LCALL DELAY_2MS
LCALL DELAY_2MS
DJNZ R5,KSET_LOOP
AJMP EXT_KEY


K_UP:
LCALL DELAY_2MS
LCALL delay_2ms
JB KEY_UP,KEY_SELECT
JNB  01H,K_UP_LOW

K_UP_HIGH:
JNB KEY_UP,$
MOV A,2AH
ADD A,#1 
MOV 2AH,A
JMP K_UP_DOWN_END

K_UP_LOW:
JNB KEY_UP,$
MOV A,2BH
ADD A,#1 
MOV 2BH,A
JMP K_UP_DOWN_END

;*********************

K_DOWN:
LCALL DELAY_2MS
JB KEY_DOWN,KEY_SELECT
JNB  01H,K_DOWN_LOW

K_DOWN_HIGH:
JNB KEY_DOWN,$
MOV A,2AH
DEC A 
MOV 2AH,A
JMP K_UP_DOWN_END

K_DOWN_LOW:
JNB KEY_DOWN,$
MOV A,2BH
DEC A 
MOV 2BH,A

K_UP_DOWN_END:

MOV A,2AH
MOV B,#10
DIV AB
MOV 40H,B ;高温限值个位 
MOV B,#10
DIV AB
MOV 41H,B;十位
MOV 42H,A;百位
;----------------------------
MOV A,2BH
MOV B,#10
DIV AB
MOV 43H,B ;低温限值位个位 
MOV B,#10
DIV AB
MOV 44H,B ;十位
MOV 45H,A ;百位

AJMP KEY_IN 


KEY_CPL:
CPL 01H
AJMP KEY_IN




EXT_KEY:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
LCALL DISPLAY_SAVE

LCALL RESET
LCALL SKIP_ROM
MOV A,#4EH
LCALL WRITE
MOV A,2AH ;2A数据送高温限值寄存器.
LCALL WRITE
MOV A,2BH ;2B数据送低温限什寄存器.
LCALL WRITE

LCALL RESET 
LCALL SKIP_ROM

⌨️ 快捷键说明

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