新闻  |   论坛  |   博客  |   在线研讨会
上传一个在学校时用51做的毕业设计(含源程序)
张阳 | 2008-04-16 17:30:29    阅读:1937   发布文章

使用1602_LCD AT89S52  18B20  Keilc51编译调试实现的温度上下限可设定范围报警,时间可调显示,一天可设三个闹钟,八首音乐,一个秒表,4*4按键另加三个按键

全汇编实现(估计大家现在是不喜欢ASM了),呵呵,,程序差不多写满AT89S52 的8K BYTES 了

硬件电路比较简单,主要靠程序上的实现

在学校那时候可是花了咱近半个多月的时间。

不过程序写得比较乱,组织得也不好,很多还可以优化的地方,由于那时在学校赶时间,就没来得及优化修改了。。

;********************************************************
;使用1602_LCD AT89S52  18B20实现的温度报警,时间可调显示,
;一天可设三个闹钟,八首音乐,一个秒表,
;全汇编实现,程序差不多写满8K BYTES 了

;硬件电路比较简单,主要靠程序上的实现

;完成时间____2006\09\27\sml
;********系统初始化***********************
T2CON   EQU 0C8H  
CP_RL2  BIT 0C8H.0
C_T2    BIT 0C8H.1
TR2     BIT 0C8H.2
EXEN2   BIT 0C8H.3
TCLK    BIT 0C8H.4
RCLK    BIT 0C8H.5
EXF2    BIT 0C8H.6
TF2     BIT 0C8H.7
RCAP2H  EQU 0CBH
RCAP2L  EQU 0CAH
TH2     EQU 0CDH
TL2     EQU 0CCH
ET2     BIT IE.5
ORG 00H
JMP INPORT
ORG 0BH
LJMP TM0
ORG 001BH
LJMP INTT0
ORG 002BH
LJMP TIME_T2
ORG 30H
INPORT:
TMP_H EQU 29H ;温度高字节
TMP_L EQU 28H
TEMPHEAD EQU 6BH
DI_DA DATA 21H
SEC DATA 22H
MIN DATA 23H
HOUR DATA 24H
RS EQU P3.5;确定具体硬件的连接方式
RW EQU P3.4 ;确定具体硬件的连接方式
E  EQU P3.3 ;确定具体硬件的连接方式

;秒表暂RAM单元定义
WATCH_H EQU 4DH
WATCH_M EQU 4EH
WATCH_S EQU 4FH
WATCH_MS EQU 50H
WATCH_H_H EQU 51H
WATCH_H_L EQU 52H
WATCH_M_H EQU 53H
WATCH_M_L EQU 54H
WATCH_S_H EQU 55H
WATCH_S_L EQU 56H
WATCH_MS_H EQU 57H
WATCH_MS_L EQU 58H

ALARM1_H EQU 59H
ALARM1_M EQU 5AH
ALARM2_H EQU 5BH
ALARM2_M EQU 5CH
ALARM3_H EQU 5DH
ALARM3_M EQU 5EH
ALARM1_H_H EQU 5FH
ALARM1_H_L EQU 60H
ALARM2_H_H EQU 61H
ALARM2_H_L EQU 62H
ALARM3_H_H EQU 63H
ALARM3_H_L EQU 64H
ALARM1_M_H EQU 65H
ALARM1_M_L EQU 66H
ALARM2_M_H EQU 67H
ALARM2_M_L EQU 68H
ALARM3_M_H EQU 69H
ALARM3_M_L EQU 6AH

STOPWATCH_FLAG1 EQU 04H
CLR 04H

ALARM1_ON_OR_OFF EQU 07H
ALARM2_ON_OR_OFF EQU 06H
ALARM3_ON_OR_OFF EQU 05H

;TEMPERATURE_ALARM_BEEP_FLAG EQU 04H;在温度CONTROL时,要考虑到这条件进去

KEY_SET EQU P0.3
KEY_UP  EQU P0.4
KEY_DOWN EQU P0.5
DS18B20_FLAG EQU PSW.0;开始时要查18B20存在否
SET_FLAG EQU 01H
FLASH_FLAG EQU 02H
K_ON EQU 03H;是个位标志哦
SETB K_ON
SETB FLASH_FLAG
SETB SET_FLAG
CLR 07H
CLR 06H
CLR 05H


MOV A,#0
MOV 25H,A
MOV 26H,A

MOV 32H,A
MOV 33H,A



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:LCALL 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:LCALL 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:LJMP 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:LCALL 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


;下面是显示闹钟值

MOV P1,#11000101B
LCALL ENABLE

MOV DPTR,#LED_DATA
MOV R1,ALARM2_H_H //已经是压缩型BCD码了,,
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,ALARM2_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,ALARM2_M_H //已经是压缩型BCD码了,
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,ALARM2_M_L //已经是压缩型BCD码了,,
MOV R0,#1
LCALL DISPLAY

;顺序执行下面的

LOOPPP: JB P0.4,PANP05_2;转判P0.5;;;;;;;;;还没有写此句程序呢后面
LCALL DELAY2S
JB P0.4,ADJ_ALARM_2_H ;如果一S之后为放开了,其实是在1S前就放开了的,则知道是调闹钟的小时值的
JNB P0.4,$;1S后还未放开,则等,1S后已经放开,则早就放开,所以进行不同操作
CPL ALARM2_ON_OR_OFF;如果一S后还为0则取反ALARM1_ON_OR_OFF标志,关掉闹钟
LJMP ALARM_K1
ADJ_ALARM_2_H:
            MOV A,ALARM2_H
            ADD A,#1
DA A
MOV ALARM2_H,A
CJNE A,#24H,ALARM_NEXT_2
MOV A,#0
MOV ALARM2_H,A

ALARM_NEXT_2:LJMP ALARM_DATACON_DIS_2;跳到先转换数据,再显示

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

   LJMP ALARM_DATACON_DIS_2
PAN03_2: JB P0.3,LOOPPP
LCALL DELAY2S
        JB P0.3,DISPLAY_ALARM3 ;如果一S之后为放开了,其实是在1S前就放开了的,则知道是设闹钟2
        JNB P0.3,$;
LJMP BACKK;如果长久按P0.3则跳出到主程序中去

;下面是设置第三个闹钟

DISPLAY_ALARM3:

   LCALL DISPLAY_ALARM_CLOCK_3

ALARM_K2:JB ALARM3_ON_OR_OFF,DISPLAY__ON_3
LCALL DISPLAY_ALARM_OFF
LJMP ALARM_DATACON_DIS_3
DISPLAY__ON_3:LCALL DISPLAY_ALARM_ON

ALARM_DATACON_DIS_3:
MOV A,ALARM3_H
SWAP A
ANL A,#0FH
MOV ALARM3_H_H,A
MOV A,ALARM3_H
ANL A,#0FH
MOV ALARM3_H_L,A

MOV A,ALARM3_M
SWAP A
ANL A,#0FH
MOV ALARM3_M_H,A
MOV A,ALARM3_M
ANL A,#0FH
MOV ALARM3_M_L,A


;下面是显示闹钟值

MOV P1,#11000101B
LCALL ENABLE

MOV DPTR,#LED_DATA
MOV R1,ALARM3_H_H //已经是压缩型BCD码了
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,ALARM3_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,ALARM3_M_H //已经是压缩型BCD码了,
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,ALARM3_M_L //已经是压缩型BCD码了
MOV R0,#1
LCALL DISPLAY

;顺序执行下面的

LOOPPPP: JB P0.4,PANP05_3;转判P0.5;;;;;;;;;还没有写此句程序呢后面
LCALL DELAY2S
JB P0.4,ADJ_ALARM_3_H ;如果一S之后为放开了,其实是在1S前就放开了的,则知道是调闹钟的小时值的
JNB P0.4,$;1S后还未放开,则等,1S后已经放开,则早就放开,所以进行不同操作
CPL ALARM3_ON_OR_OFF;如果一S后还为0则取反ALARM1_ON_OR_OFF标志,关掉闹钟
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

2008-4-16 12:47:34
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
MOV A,#48H ;将高低温限值寄存器数据送18B20-EPROM保存.
LCALL WRITE
A_END:

RET







;***************18b20指令子程序**********************
READ_TEMP:  ;读1820内部温度子程序.
     LCALL RESET
     JB 70h,EXT1
     LCALL SKIP_ROM
     LCALL TEMP_CONV ;温度AD变换
     LCALL DELAY_600MS  ;时........
     LCALL RESET
     LCALL SKIP_ROM
     LCALL TEMP_GET ;发取温度的命令
     LCALL READ ;接收...
  EXT1:
     RET

SKIP_ROM:;跳过ROM检测
    MOV A,#0CCH ;#0CCH为跳过rom命令
    LCALL WRITE
    RET

RELCALL_EPROM:;重调Eprom的值到18B20的暂存RAM中去,,这样一上电18B20中RAM就有数据了
    MOV A,#0B8H;在重调之前有配置或设定好下上限温度值吗?看看按键程序处有什么?
    LCALL WRITE
    RET


TEMP_CONV:
    MOV A,#44H ;AD变换
LCALL WRITE
RET

TEMP_GET:
    MOV A ,#0BEH;读18b20命令
    LCALL WRITE
    RET


;****************************18B20基本时序子程序*********************************
RESET:  ;初始化子程序    同时也检测18B20是否存在,,,
   SETB P0.0
   NOP
   CLR P0.0    ;拉低
   MOV R3,#150 ; *4=600US
   LCALL DELAY_BY_R3
   SETB P0.0    ;拉高
   MOV R3,#15  ; 60US
   LCALL DELAY_BY_R3
   MOV R3,#60 ;4个周期*60=240US内检测
A1: JNB P0.0,A2 ;检测到低平信号
    DJNZ R3,A1 ;如果没有应答的低电平信号,返回A1重新检测,超时后下一行,
    SETB 70h ;DS1820不存在.
    JMP A3
A2: CLR 70h
    MOV R3,120;240US;等恢复时间2*120=240us
    DJNZ R3, $
A3:
   RET
;------------------------

WRITE:
    MOV R2,#8;一个字节为8位
    CLR C ;C位清0 C位用来放A的一位数据,用移位的方法放入C
B1: SETB P0.0
NOP
    CLR P0.0
MOV R3,#4 ;16US
LCALL DELAY_BY_R3
RRC A        ;把A中的数送入C
MOV P0.0,C   ;把C送入总线
    MOV R3,#12    ;48US(一位数据的发送:60us<tx<120us)
LCALL DELAY_BY_R3
SETB P0.0  ;拉高1us结束一位
NOP
DJNZ R2,B1
         RET

READ:
MOV R1,#9 ;接收4个字节数据依次是1.低位 2.高位. 3.高限 4.低限
MOV R0,#TEMPHEAD;低位放28H;高位放29h (1. 28H,2. 29H 3. 2AH 4. 2BH )
MOV B,#00H
READTEMP2:LCALL READDS1820
MOV @R0,A
INC R0
READTEMP21:LCALL CRC8CAL
DJNZ R1,READTEMP2
MOV A,B
JNZ READTEMPOUT
MOV A,TEMPHEAD
MOV TMP_L,A
MOV A,TEMPHEAD+1
MOV TMP_H,A
MOV A,TEMPHEAD+2
MOV 2AH,A
MOV A,TEMPHEAD+3
MOV 2BH,A
READTEMPOUT:RET

CRC8CAL:PUSH ACC
        MOV R7,#08H
CRCLOOP1:XRL A,B
         RRC A
MOV A,B
JNC CRCLOOP2
XRL A,#18H
CRCLOOP2:RRC A
         MOV B,A
POP ACC
RR A
PUSH ACC
DJNZ R7,CRCLOOP1
POP ACC
RET


READDS1820:
MOV R2,#8;一字节数据8位
C11: CLR C ;清除C
SETB P0.0
NOP
NOP
CLR P0.0 ;拉低.
NOP ;1us秒后拉高?
NOP
NOP
SETB P0.0
MOV R6,#07H
DJNZ R6,$
MOV C,P0.0 ;读出18b20的数据
RRC  A ;移入A
MOV R6,#3CH
DJNZ R6,$
SETB P0.0
DJNZ R2,C11 ;一个字节收完
MOV R6,#3CH
DJNZ R6,$
RET
;*********************************************************************************



;*****************LCD_控制命令***************
DISPLAY: MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
LCALL WRITE_DATA_TO_LCD
INC R1
DJNZ R0,DISPLAY
RET


WRITE_NOT_CHECK_BUSY:
SETB E
NOP
NOP
CLR RS ;写入控制命令的子程序
CLR RW
CLR E
RET


ENABLE: ;只要先将命令数据或地址先送P1,再调用ENABLE就可以写入哦
SETB E
NOP
NOP
CLR RS ;写入控制命令的子程序
CLR RW
CLR E
LCALL TEST_BUSY
SETB E
RET


TEST_BUSY:
SETB E
NOP
NOP
MOV P1,#0FFH ;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,TEST_BUSY ;如果P1.7为高电平表示忙就循环等待
RET


WRITE_DATA_TO_LCD:
SETB E
NOP
NOP
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL TEST_BUSY ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
RET




;***************************数据转换***************************
DATA_CONV:  ;数据转换

   MOV A,24H
SWAP A
ANL A,#0FH
MOV 46H,A
MOV A,24H
ANL A,#0FH
MOV 47H,A

MOV A,23H
SWAP A
ANL A,#0FH
MOV 48H,A
MOV A,23H
ANL A,#0FH
MOV 49H,A

MOV A,22H
SWAP A
ANL A,#0FH
MOV 4AH,A
MOV A,22H
ANL A,#0FH
MOV 4BH,A


MOV A,28H ;低字节
ANL A,#0FH;去除高位
MOV B,#6;乘6得到实际数值的100倍.
MUL AB
MOV B,#10
DIV AB
MOV 33H,A;小数位高
MOV 32H,B; 小数位低
MOV A,28H
MOV C,29H.0 ;29h高位的低4字节
RRC A
MOV C,29H.1
RRC A
MOV C,29H.2
RRC A
MOV C,29H.3
RRC A
MOV 28H,A ;重新合成.结果存在28H.
MOV A,28H
MOV B,#10
DIV AB
MOV 26H,A ;整数位高
MOV 25H,B ;整数位低
;-------------------------
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 ;百位

CLR C ;只在下上限两温度之间才能正常工作
MOV A,28H;现温度值与高温限值比较
SUBB A,2AH
JC BIG ;如果高.则关机器

CLR K_ON
AJMP CONVERT_END
BIG:CLR C
MOV A,2BH;现温度与低温限值比较
SUBB A,28H
JC X_BIG ;低温限值比现温高,则开机器

CLR K_ON
AJMP CONVERT_END

X_BIG:
   SETB K_ON


CONVERT_END:
   RET


DATA_CONV1 :
   MOV A,24H
SWAP A
ANL A,#0FH
MOV 46H,A
MOV A,24H
ANL A,#0FH
MOV 47H,A

MOV A,23H
SWAP A
ANL A,#0FH
MOV 48H,A
MOV A,23H
ANL A,#0FH
MOV 49H,A

MOV A,22H
SWAP A
ANL A,#0FH
MOV 4AH,A
MOV A,22H
ANL A,#0FH
MOV 4BH,A
RET
/*********显示时间TIME字符串及时间值***************/
2008-4-16 12:48:45
DISPLAY_TIME: PUSH PSW
MOV P1,#11000000B
LCALL ENABLE
MOV DPTR,#TIME
MOV R1,#0
MOV R0,#6
LCALL DISPLAY
/***************/
MOV DPTR,#LED_DATA
MOV R1,46H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY


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

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

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

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

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

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

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



;********************显示温度*************************
DISPLAY_18B20_TEMP: ;LCD_显示子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB3;显示'WENDU:'
MOV R1,#0 ;码表初值
MOV R0,#7;字数
LCALL DISPLAY
;---------------显示温度值高位
MOV DPTR,#LED_DATA
MOV R1,26H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示温度值低位
MOV DPTR,#LED_DATA
MOV R1,25H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示小数点
MOV DPTR,#DOT
MOV R1,#0 ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示温度值小数高位
MOV DPTR,#LED_DATA
MOV R1,33H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示温度值小数低位
MOV DPTR,#LED_DATA
MOV R1,32H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示单位度
MOV DPTR,#SIGN
MOV R1,#0 ;码表初值
MOV R0,#2;字数
LCALL DISPLAY
RET



;******************显示限值.*****************
DISPLAY_18B20_TEMP_XZ:
MOV P1,#11000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_L ; 显示'L:'
MOV R1,#0 ;码表初值
MOV R0,#2;字数
LCALL DISPLAY

;---------------显示温度限值高位
MOV DPTR,#LED_DATA
MOV R1,45H ;码表初值(45H中存的是十进制值)只是一位数百位,通过查表可找出相应ASCII值
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

MOV P1,#11000111B; 显示位置
LCALL ENABLE
;----
MOV DPTR,#TAB_H ; 显示'H:'
MOV R1,#0 ;码表初值
MOV R0,#2;字数
LCALL DISPLAY
;---------------显示高温度限值高位
MOV DPTR,#LED_DATA
MOV R1,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
RET



      
;**********************提示语**********************
DISPLAY_18B20_HELLO:
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_HELLO
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
RET

/*
DISPLAY_18B20_TESTING:
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_TESTING
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
RET
*/


DISPLAY_18B20_ERROR:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE
MOV DPTR,#TAB1
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
RET



DISPLAY_WATING:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB2
MOV R1,#0 ;码表初值
MOV R0,#13;字数
LCALL DISPLAy
RET
DISPLAYINT_MUSIC:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#MUSICSTRING
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
DISPLAY_NAME:
MOV P1,#11000000B; 显示位置
LCALL ENABLE ;执行指令

MOV R1,#0 ;码表初值
MOV R0,#15;字数
LCALL DISPLAy
RET

STOPWATCH:DB '   STOPWATCH    '
STOPWATCH_INIT:DB '--00:00:00:00---'
DISPLAYINT_STOPWATCH_000000:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#STOPWATCH
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
MOV P1,#11000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#STOPWATCH_INIT
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
RET


MUSICSTRING:DB 'PLAYING... MUSIC'
MUSIC_NAME_15: DB '<JUST LOVE YOU>'
MUSIC_NAME_8: DB 'ZHOU_ZAI_XIANG_X'
MUSIC_NAME_9: DB 'SHUI_SHANG_PU_DE'
MUSIC_NAME_10: DB ' SHANG-HAI-TAN  '
MUSIC_NAME_11: DB 'GU-DAN-BEI-P-QIU'
MUSIC_NAME_12: DB 'TAO-HUA-DUO.-KAI'
MUSIC_NAME_13: DB 'DA-CHENG-XIAO_AI'
MUSIC_NAME_14: DB '-----QIU_FU-----'

DISPLAY_SAVE:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_SAVE
MOV R1,#0 ;码表初值
MOV R0,#10;字数
LCALL DISPLAy
RET


DISPLAY_SETING_TEMP_H:
MOV P1,#00000001B ;清屏并光标复位#00000001H是命令哦
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_SETING_TEMP_H
MOV R1,#0 ;码表初值
MOV R0,#13;字数
LCALL DISPLAy
RET

DISPLAY_SETING_TEMP_L:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_SETING_TEMP_L
MOV R1,#0 ;码表初值
MOV R0,#13;字数
LCALL DISPLAy
RET
DISPLAY_ALARM_CLOCK_1:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#ALARM_CLOCK_1
MOV R1,#0 ;码表初值
MOV R0,#10;字数
LCALL DISPLAy
RET

DISPLAY_ALARM_CLOCK_2:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#ALARM_CLOCK_2
MOV R1,#0 ;码表初值
MOV R0,#10;字数
LCALL DISPLAy
RET

DISPLAY_ALARM_CLOCK_3:

MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#ALARM_CLOCK_3
MOV R1,#0 ;码表初值
MOV R0,#10;字数
LCALL DISPLAy
RET





ALARM_CLOCK_1:DB 'AL.CLOCK_1'
ALARM_CLOCK_2:DB 'AL.CLOCK_2'
ALARM_CLOCK_3:DB 'AL.CLOCK_3'
ALARM_ON:DB ' ON '
ALARM_OFF:DB 'OFF'
DISPLAY_ALARM_ON:
MOV P1,#10001100B
LCALL ENABLE
MOV DPTR,#ALARM_ON
MOV R1,#0 ;码表初值
MOV R0,#3;字数
LCALL DISPLAy
RET
DISPLAY_ALARM_OFF:
MOV P1,#10001100B
LCALL ENABLE
MOV DPTR,#ALARM_OFF
MOV R1,#0 ;码表初值
MOV R0,#3;字数
LCALL DISPLAy
RET

DISPLAY_ON:
MOV P1,#11001101B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_ON
MOV R1,#0 ;码表初值
MOV R0,#3;字数
LCALL DISPLAy
RET

DISPLAY_OFF:
MOV P1,#11001101B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_OFF
MOV R1,#0 ;码表初值
MOV R0,#3;字母数
LCALL DISPLAy
RET



/*
ADJ_FLASH:
JB FLASH_FLAG,
MOV P1,#1 ;在显示数字的位置用三个空格..
LCALL ENABLE;
*/
;*****************提示语**********************

TM0:PUSH 28H

PUSH ACC
     PUSH PSW

MOV TL0,#0B0H
MOV TH0,#3CH
INC DI_DA
MOV A,DI_DA
CJNE A,#14H,DDONE
MOV DI_DA,#00H
MOV A,SEC
ADD A,#01H
DA A
MOV SEC,A
CJNE A,#60H,DDONE
MOV SEC,#00H
MOV A,MIN
ADD A,#01H
DA A
MOV MIN,A
CJNE A,#60H,DDONE
MOV MIN,#00H
MOV A,HOUR
ADD A,#01H
DA A
MOV HOUR,A
CJNE A,#24H,DDONE
MOV HOUR,#00H
DDONE:POP PSW
POP ACC
POP 28H
RETI

INTT0:PUSH 28H
PUSH ACC
MOV TH1,R1
MOV TL1,R0
CPL P0.2
POP ACC
POP 28H
RETI

TIME_T2:PUSH 28H
PUSH PSW
         PUSH ACC
        CLR TF2 ;TF2需要软件清0,与T1 T0的不一样  
MOV A,WATCH_MS
ADD A,#1
MOV WATCH_MS,A
CJNE A,#100,T2_NEXT ;最大值才255的一字节是不能存#100H的,所以
MOV A,#0
MOV WATCH_MS,A
MOV A,WATCH_S
ADD A,#1  ;注意不要用INC
DA A
MOV WATCH_S,A
CJNE A,#60H,T2_NEXT
MOV A,#0
MOV WATCH_S,A
MOV A,WATCH_M
ADD A,#1
DA A
MOV WATCH_M,A
CJNE A,#60H,T2_NEXT
MOV A,#0
MOV WATCH_M,A
MOV A,WATCH_H
ADD A,#1
DA A
MOV WATCH_H,A
CJNE A,#24H,T2_NEXT
MOV A,#0
MOV WATCH_H,A
MOV WATCH_M,A
MOV WATCH_S,A
MOV WATCH_MS,A ;

T2_NEXT: ;是秒表数据转换程序,把各单元值的十个位分别存到两个单元中 但MS单元是三位的,,所以不可能DA   
   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
;下面所需要的字串
STRII_1:DB '----';执行到了这个地方


;下面是显示秒表值程序要先清屏啊
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;再由第二行第3列开始显示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
;注意要补偿中断中产生的延时,在定时初值里补偿

   POP ACC
   POP PSW
   POP 28H
      RETI

;**************廷时程序************************
DELAY_BY_R3:
NOP
NOP
DJNZ R3,DELAY_BY_R3
RET

DELAY_BY_R6:
D11: MOV R7,#0
DJNZ R7,$
DJNZ R6,D11
RET




DELAY_2MS:
          MOV R6,#2
F2:       MOV R7,#75
F1:       NOP
  NOP
  DJNZ R7,F1
          DJNZ R6,F2
  RET

DELAY_600MS:
          MOV R6,#0
G2:       MOV R7,#0
G1:       NOP
  NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
  DJNZ R7,G1
          DJNZ R6,G2
  RET

DELAY_1M:
MOV R6,#0
MOV R7,#0
E1:  NOP
NOP
DJNZ R7,E1
DJNZ R6,E1
RET
DELAY20MS:
MOV R7,#200
DEL1:MOV R6,#50
DJNZ R6,$
DJNZ R7,DEL1
RET

DELAY2S:MOV R7,#250
DELAY2S1:MOV R6,#100
DELAY2S2:MOV R5,#10
DJNZ R5,$
DJNZ R6,DELAY2S2
DJNZ R7,DELAY2S1
RET




DEFINE_DATA:
DB 0CH,12H,12H,0CH,00H,00H,00H,00H;度
;DB 04H,0CH,12H,0DH,1EH,04H,08H,00H;
;DB 0EH,04H,1FH,04H,04H,0AH,11H,00H;
;DB 0EH,0EH,0EH,1FH,04H,0EH,17H,00H;
;DB 10H,1FH,02H,0FH,0AH,1FH,02H,00H;
;DB 0FH,09H,0FH,09H,0FH,09H,13H,00H;
;DB 0FH,09H,09H,0FH,09H,09H,0FH,00H;

LED_DATA: DB '0123456789'


TAB_HELLO:
    DB 'Hello!' ;6
    DB 0H,1H,2H,3H,4H,5H,6H

TAB_TESTING:
    DB 'TEXTING...' ;10

TAB1:
    DB '18B20 NO CONNECT'

TAB2:
    DB 'Waiting......'

TAB3:
    DB 'Temper '

DOT:
    DB "."

SIGN:
    DB 00H,'C'

TAB_L:
    DB 'L:'

TAB_H:
    DB 'H:'
  
TAB_SETING_TEMP_H:
    DB 'SETING_TMP:H '

TAB_SETING_TEMP_L:
    DB 'SETING_TMP:L '

TAB_SAVE:
    DB 'SAVEING...'

TAB_ON:
    DB 'ON '

TAB_OFF:
    DB 'OFF'
TIME:DB 'TIME  '
MAO:DB ':'

MUSIC_TAB15_JUSTLOVEYOU:DB 0FBH,4,2,0FAH,15H,2,0FCH,44H,6,0FDH,09H,2,0FCH,0ACH,2,0FCH,44H,2,0FBH,90H,1,0FBH,04H,1,0FAH,15H,2
DB 0FBH,4H,6,0FBH,90H,2,0FBH,04H,4,0FBH,90H,2,0FBH,04H,2,0FDH,82H,6,0FEH,22H,2,0FDH,0C8H,2,0FDH,82H,2,0FDH,09H,1
DB 0FCH,0ACH,1,0FCH,44H,2,0FCH,0ACH,16,0FCH,0ACH
DB 2,0FCH,0CH,2,0FDH,82H,6,0FDH,0C8H,2,0FDH,82H,4,0FDH,0C8H,2,0FDH,82H,2,0FDH,09H,3,0F9H,5BH,1
DB 0FCH,44H,8,0FCH,44H,2,0FCH,0ACH,2,0FBH,90H,6,0FBH,04H,2,0FDH,82H,2
DB 0FDH,09H,2,0FCH,0ACH,1,0FCH,44H,1,0FBH,90H,2,0FBH,04H,8,00H,00H,4,0FBH,04H,2,0FAH,15H,2,0FBH,90H
DB 6,0FBH,04H,2,0FDH,82H,2
DB 0FDH,09H,2,0FCH,0ACH,2,0FCH,0ACH,2,0FCH,44H,16,0FCH,44H,2,0FCH,44H,2,0FCH,0CH,6,0FCH,0CH,2,0FCH,0CH
DB 4,0FCH,0ACH,2,0FCH,44H,2,0FCH,0CH,2
DB 0FBH,90H,2,0FBH,90H,8,00H,00H,2,0FDH,09H,2,0FCH,0ACH,6,0FBH,90H,2,0FCH,0ACH,4,0FDH,82H,2,0FDH,0C8H,2
DB 0FDH,09H,16,0FDH,09H,2,0FCH,0ACH,6,0FCH,0ACH,2,0FDH,82H,4,0FCH,0ACH,2
DB 0FCH,44H,2,0FCH,44H,6,0FCH,0ACH,2,0FDH,09H,8,0FDH,0C8H,2,0FDH,82H,2
DB 0FDH,34H,2,0FDH,09H,2,0FCH,0ACH,4,00,00,2,0FCH,44H,2,0FCH,44H,16
DB 0FBH,04H,2,0FAH,15H,2,0FCH,44H,6,0FDH,09H,2,0FCH,0ACH,2,0FCH,44H,2
DB 0FBH,90H,1,0FBH,04H,1,0FAH,15H,2,0FBH,04H,6,0FBH,90H,2,0FCH,44H,2
DB 0FBH,90H,2,0FBH,04H,2,0FDH,82H,6,0FEH,22H,2,0FDH,0C8H,2,0FDH,82H,2
DB 0FAH,15H,1,0FCH,0ACH,1,0FCH,44H,2,0FCH,0ACH,8,00,00,2,0FCH,0ACH,2
DB 0FDH,09H,2,0FDH,34H,2,0FDH,82H,6,0FDH,0C8H,2,0FDH,82H,4,0FDH,0C8H,2
DB 0FDH,82H,2,0FDH,09H,3,0F9H,5BH,1,0FCH,44H,8,0FCH,44H,2,0FCH,0CH,2
DB 0FBH,90H,6,0FBH,04H,2,0FDH,82H,2,0FDH,09H,2,0FCH,0ACH,2,0FCH,0ACH,2,0FCH,44H,2,0FFH,0FFH,8
MUSIC_TAB14_QIUFU:

DB 0FDH,0C8H,16,0FDH,09H,2,0FDH,82H,2,0FDH,82H,3,0FCH,0ACH,1,0FCH,0ACH,8,0FDH,09H,2,0FDH,82H,2,0FCH,44H,8,0FCH,44H,2,0FCH,0ACH,2,0FDH,09H,2,0FDH,0C8H,2,0FDH,82H,3,0FCH,0ACH,1,0FCH,0ACH,4,00H,00H,3,0FDH,82H,1
DB 0FEH,22H,1,0FEH,06H,4,00H,00H,2,0FDH,82H,1,0FDH,82H,1,0FDH,82H,1,0FDH,82H,1,0FDH,09H,1,0FDH,82H,1,0FDH,82H,2,0FDH,09H,1,0FCH,0ACH,1,0FCH,44H,1,0FCH,44H,2,0FBH,90H,1,0FDH,0C8H,1,0FDH,82H,1,0FCH,0ACH,1,0FDH,09H,1,0FDH,09H,4,00H,00H,4
DB 00H,00H,1,0FCH,0ACH,1,0FCH,0ACH,1,0FCH,0ACH,1,0FCH,0ACH,1,0FCH,0ACH,1,0FCH,0ACH,1,0FCH,0ACH,1,0FDH,09H,1,0FDH,82H,1,0FDH,09H,1,0FDH,82H,1,0FDH,82H,4,0FDH,0C8H,1,0FDH,0C8H,1,0FDH,0C8H,1,0FEH,22H,1,0FEH,06H,1,0FDH,0C8H,1,0FDH,82H,1,0FEH,06H,1,0FEH,06H,1,0FDH,0C8H,4,00H,00H,4
DB 00H,00H,2,0FEH,22H,1,0FEH,22H,1,0FEH,22H,3,0FEH,06H,1,0FEH,06H,1,0FDH,82H,1,0FDH,0C8H,1,0FDH,82H,1,0FDH,82H,2,0FDH,09H,1,0FCH,0ACH,1,0FCH,44H,1,0FCH,44H,2,0FBH,90H,1,0FDH,0C8H,1,0FDH,82H,1,0FCH,0ACH,1,0FDH,09H,1,0FDH,09H,4,00H,00H,4
DB 00H,00H,1,0FCH,0ACH,1,0FCH,0ACH,1,0FCH,0ACH,1,0FCH,0ACH,1,0FCH,0ACH,2,0FCH,44H,1,0FDH,09H,1,0FDH,82H,1,0FDH,09H,1,0FDH,82H,1,0FDH,82H,4,0FDH,0C8H,1,0FDH,0C8H,1,0FDH,0C8H,1,0FEH,22H,1,0FEH,06H,1,0FDH,0C8H,1,0FDH,82H,1,0FEH,06H,1,0FEH,06H,1,0FDH,0C8H,4,00H,00H,2,0FEH,85H,1,0FEH,85H,1
DB 0FEH,56H,4,00H,00H,1,0FEH,22H,1,0FEH,22H,1,0FDH,0C8H,1,0FEH,06H,1,0FEH,06H,1,0FEH,06H,1,0FEH,06H,1,00H,00H,2,0FEH,85H,1,0FEH,85H,1,0FEH,56H,4,00H,00H,1,0FEH,56H,1,0FEH,0C1H,1,0FEH,0E4H,1,0FEH,0C1H,1,0FEH,85H,4,00H,00H,2,0FEH,85H,1,0FEH,85H,1
DB 0FEH,56H,4,00H,00H,1,0FEH,22H,1,0FEH,22H,1,0FDH,0C8H,1,0FEH,06H,1,0FEH,06H,1,0FEH,06H,1,0FEH,06H,1,00H,00H,2,0FEH,85H,1,0FEH,85H,1,0FEH,56H,4,00H,00H,1,0FEH,22H,1,0FDH,0C8H,1,0FEH,22H,1,0FDH,0C8H,4,00H,00H,4,00H,00H,1,0FEH,0E4H,1,0FEH,0E4H,1,0FEH,0C1H,1,0FEH,0E4H,2,0FEH,56H,1,0FEH,22H,1,0FEH,56H,1,0FEH,0C1H,2,0FEH,0C1H,1,0FEH,0C1H,1,0FEH,56H,2,0FEH,85H,1
DB 0FEH,0C1H,1,0FEH,0C1H,1,0FEH,0C1H,1,0FEH,0C1H,1,0FEH,0C1H,2,0FEH,85H,1,0FEH,56H,1,0FEH,56H,1,0FEH,85H,2,0FEH,85H,1,0FEH,85H,1,0FEH,85H,1,0FEH,56H,1,0FEH,22H,1,0FDH,0C8H,1,0FEH,22H,2,0FEH,22H,1,0FEH,22H,1,0FDH,0C8H,2,0FDH,82H,1,0FEH,0C1H,1,0FEH,0C1H,1,0FEH,0E

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
stonesx  2008-04-16 17:46:07 

赞叹一个,慢慢学习中。。。

推荐文章
最近访客