📄 1602_lcd at89s52.txt
字号:
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 + -