新聞中心

        帶LCD的時間控制器

        作者: 時間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
        說明:

        本帶LCD時間控制器,是在本人畢業(yè)時間《基于單片機的時間控制器的設(shè)計》的基礎(chǔ)上進行修改的。
        使得時間的控制和修改更容易,更直觀。并擴展了紅外遙控的功能,但由于條件限制,并沒有把此功能
        的程序加上。
        按鍵說明:
        K1 設(shè)置當前時間/按鍵超過1s,則置整點報時標志
        K2 顯示控制時間/小時加
        K3 設(shè)置控制時間/分鐘加
        K4 控制ON/OFF設(shè)置/確定
        K5 控制開/關(guān)

        本文引用地址:http://www.104case.com/article/201611/317330.htm

        ELEC 繼電器
        SPK 蜂鳴器
        Y_LED 繼電器工作指示
        C_LED 被控電器指示燈
        W_LED 計時工作指示燈
        D_LED 整點報時指示燈

        實物圖:

        程序代碼:

        ;=============================

        ; 帶LCD的時間控制器
        ; DIPS082-LCD
        ; KS0066-控制器

        ;=============================
        LOEQU 24 ; 加載低字節(jié)
        HIEQU 99 ; 加載高字節(jié)
        ;-----------------------------
        COEQU 200 ; 5ms中斷計數(shù)時間常數(shù)
        ; 計數(shù)200次表示1s
        ALBEQU 20H.0 ; 控制設(shè)置標志
        CLOCK EQU 20H.1 ; 整點報時標志
        HOUREQU 30H ; 存放小時變量
        MINEQU 31H ; 存放分鐘變量
        SECEQU 32H ; 存放秒鐘變量
        DEDAEQU 33H ; 5ms計數(shù)值
        SEC0EQU 34H ; 存放舊的秒數(shù)
        ;-----------------------------
        DDRAMEQU 35H ; LCD地址變量
        COM EQU 22H ; LCD指令寄存器
        DAT EQU 21H ; LCD數(shù)據(jù)寄存器
        COUNT EQU 22H ; 計數(shù)器

        HHEQU 36H ; 控制設(shè)置小時變量
        MMEQU 37H ; 控制設(shè)置分鐘變量
        ;-----------------------------
        ; KEY4.....
        K1EQU P2.1 ; 設(shè)置當前時間
        K2EQU P2.0 ; 顯示控制時間/小時加
        K3EQU P3.6 ; 設(shè)置控制時間/分鐘加
        K4EQU P3.7 ; 控制ON/OFF設(shè)置/確定
        K5 EQU P3.1 ; 控制開/關(guān)
        ;-----------------------------
        ; LCD .....
        RSEQU P3.4 ; 寄存器選擇
        RWEQU P3.5 ; 讀寫控制
        E EQU P3.3 ; LCD使能
        ;-----------------------------
        ELEC EQU P3.0 ; 繼電器
        SPKEQU P2.2 ; 蜂鳴器
        Y_LED EQU P2.6 ; 繼電器工作指示
        C_LEDEQU P2.4 ; 被控電器指示燈
        W_LEDEQU P2.3 ; 計時工作指示燈
        D_LEDEQU P2.5 ; 整點報時指示燈
        ;-----------------------------
        ORG 0000H ; 程序代碼由地址0
        JMP START ; 跳至主函數(shù)開始執(zhí)行
        ORG 000BH ; 定時器TIMER0中斷地址
        JMP T0_INT ; 跳至TIMER0中斷啟始地址
        ;#############################

        ; 主程序

        ;#############################
        START:
        CLR Y_LED ; 繼電器工作指示關(guān)
        CLR ELEC ; 繼電器關(guān)
        CLR CLOCK ; 清除整點報時標志
        SETB D_LED ; 整點報時指示燈關(guān)
        ;-----------------------------
        CLR ALB ; 清除控制標志
        MOV HH,#0 ; 內(nèi)定的控制時間為--00:00
        MOV MM,#0

        LCALL SET_LCD ; LCD初始化
        LCALL BZ ; 蜂鳴器連續(xù)兩次發(fā)音
        LCALL BZ
        LCALL LED_BL ; LED閃動,表示工作開始

        LCALL INIT ; 初始化變量
        LCALL INIT_TIMER ; 初始化定時器
        LCALL MENU ;
        ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

        ; 循環(huán)程序

        ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        LOOP:
        LCALL TIME_PRO ; 時間計時處理
        ; 按鍵掃描............
        JB K1,L1 ; 未按下K1鍵則繼續(xù)掃描
        ; K1.....時間設(shè)置/設(shè)整點報時
        ; K1 : ADJ TIME K2:HOUR K3:MIN K4: OK
        LCALL D_LAY ; 1s延時
        JNB K1,LL ; 按鍵超過1s,則設(shè)整點報時
        LCALL BZ ; LED閃動
        MOV DPTR,#MADJ ; 現(xiàn)實執(zhí)行消息
        MOV A,#1 ;
        LCALL LCD_PRINT ; 在LCD顯示字符
        LCALL SET_TIME ; 設(shè)置目前時間
        LCALL MENU ; 菜單
        JMP LOOP ; 繼續(xù)循環(huán)
        ;.............................
        L1:JB K2,L2 ; 未按下K2鍵則繼續(xù)掃描
        ; K2............控制時間顯示
        JNB K2,$ ; 等待K2鍵釋放
        LCALL BZ ; 蜂鳴器發(fā)音
        MOV DPTR,#MLAL ; 顯示控制消息
        MOV A,#1 ;
        LCALL LCD_PRINT ; 在LCD顯示字符
        LCALL LOOK_ATIME ; 查看控制時間
        LCALL DELAY ; 延時
        LCALL LED_BL ; 工作LED閃動
        LCALL LED_BL ;
        LCALL MENU ; 菜單
        JMP LOOP ; 繼續(xù)循環(huán)
        ;.............................
        L2:JB K3,L3 ; 未按下K3鍵則繼續(xù)掃描
        ; K3.....控制時間設(shè)置
        ; K3 : ADJ ATIME K2:HOUR K3:MIN K4: OK
        JNB K3,$ ; 等待K3鍵釋放
        LCALL BZ ; 蜂鳴器發(fā)音
        MOV DPTR,#MAADJ ; 顯示控制消息
        MOV A,#1 ;
        LCALL LCD_PRINT ; 在LCD顯示字符
        LCALL SET_ATIME ; 控制時間設(shè)置
        LCALL LED_BL ; 工作LED閃動
        LCALL LED_BL
        LCALL MENU ; 菜單
        JMP LOOP ; 繼續(xù)循環(huán)
        LL: SJMP L6
        ;.............................
        L3:JB K4,L4 ; 未按下K4鍵則繼續(xù)掃描
        ; K4.......控制開關(guān)/確定
        JNB K4,$ ; 等待K4鍵釋放
        CPL ALB ; 控制設(shè)置標志取反
        JNB ALB,L31 ; 沒有控制標志,則發(fā)音一聲
        ; ALARM ON....................
        CLR C_LED ; 控制指示燈亮
        LCALL BZ ; 有控制標志,則蜂鳴器發(fā)音三聲
        LCALL BZ
        LCALL BZ
        JMP LOOP ; 返回
        L31:
        ; ALARM OFF...................
        SETB C_LED ; 控制指示燈滅
        LCALL BZ ; 蜂鳴器發(fā)音一聲
        JMP LOOP ; 返回
        ;.............................
        L4: JB K5,L5 ; 未按下K4鍵則繼續(xù)掃描
        ;K5.........電器控制開/關(guān)
        JNB K5,$ ; 等待K5鍵釋放
        CPL Y_LED ; LED取反
        CPL ELEC
        LCALL BZ ; 蜂鳴器發(fā)音一聲
        L5: JMP LOOP ; 返回
        L6: CPL CLOCK ; 值整點報時標志
        CPL D_LED ; 整點報時指示燈亮
        LCALL DELAY
        JMP LOOP ; 返回
        ;-----------------------------
        LMESS1: DB "Wlecome!",0
        LMESS2: DB " happy! ",0
        ;=============================
        ; 初始化控制變量子程序
        ;=============================
        INIT:
        MOV DEDA,#0 ; 5ms計數(shù)值清除為0
        MOV SEC0,#0 ; 舊的秒數(shù)清除為0
        MOV SEC,#0 ; 秒鐘變量清除為0
        MOV MIN,#0 ; 分鐘變量清除為0
        MOV HOUR,#1 ; 小時變量清除為1
        RET ; 子程序返回
        ;=============================
        ;初始化定時器接口子程序
        ;=============================
        INIT_TIMER:
        MOV TMOD,#00000000B ; 設(shè)置定時器T0工作方式為方式0
        MOV IE, #10000010B ;
        MOV TL0,#LO ; 加載低字節(jié)
        MOV TH0,#HI ; 加載高字節(jié)
        SETB TR0 ; 啟動定時器T0開始計時
        RET
        ;*****************************
        ; 定時器0中斷服務(wù)程序
        ;*****************************
        T0_INT: ; 中斷程序每隔5ms中斷一次
        PUSH ACC ; 累加器放入堆棧
        MOV TL0,#LO ; 加載低字節(jié)
        MOV TH0,#HI ; 加載高字節(jié)
        INC DEDA ; 5ms計數(shù)值加1
        ; 1 SEC TIME OUT CHECK
        MOV A,DEDA ; 5ms計數(shù)值
        CJNE A,#CO,TT ; 是否1s到了?
        MOV DEDA,#0 ; DEDA值0

        CPL W_LED ; LED燈亮滅變換
        INC SEC ; 秒計數(shù)加1
        MOV A,SEC ; 秒數(shù)據(jù)放在累加器里,用于比較
        CJNE A,#60,TT ; 是否到1 min?
        ; 1 MIN TIME OUT
        INC MIN ; 分計數(shù)加1
        MOV SEC,#0 ; 秒計數(shù)清除為0
        MOV A,MIN
        CJNE A,#60,TT ; 是否到1 h ?
        ; 1 HOUR TIME OUT
        INC HOUR ; 小時計數(shù)加1
        MOV MIN,#0 ; 分計數(shù)清除為0
        MOV A,HOUR
        CJNE A,#24,TT ; 是否24 h到了?
        MOV SEC,#0 ; 秒鐘變量清0
        MOV MIN,#0 ; 分鐘變量清0
        MOV HOUR,#0 ; 小時變量清0
        TT:
        POP ACC ; 將累加器由堆棧取出
        RETI ; 中斷返回
        ;=============================
        ; 設(shè)置當前時間
        ; K2:HH K3:MM K4:OK
        ;=============================
        ; K2:HH K3:MMK4:OK
        SET_TIME:
        CLR TR0 ; 關(guān)定時器0
        MOV SEC,#0 ; 秒鐘變量清0
        ; SCAN 3 KEY TO ADJ...........
        S0:
        JB K2,S1 ; 未按下K2鍵則繼續(xù)掃描
        ; 小時調(diào)整
        LCALL BZ ; 蜂鳴器發(fā)音一聲
        INC HOUR ; 小時加1
        MOV A,HOUR ; 小時值放在累加器中,用于比較
        CJNE A,#24,S11 ; 是否24 h到了?
        MOV HOUR,#0 ; 小時變量清0
        S11:
        LCALL CONV ; 轉(zhuǎn)換LCD顯示數(shù)據(jù)
        MOV R5,#20 ;
        LCALL DELAY ; 延時
        JMP S0 ; 繼續(xù)程序執(zhí)行
        ;....................
        S1:JB K3,S2 ; 未按下K3鍵則繼續(xù)掃描
        ; 分鐘調(diào)整
        LCALL BZ ; 蜂鳴器發(fā)音一聲
        INC MIN ; 分鐘加1
        MOV A, MIN ; 分鐘值放在累加器中,用于比較
        CJNE A,#60,S21 ; 是否60 min到了?
        MOV MIN,#0 ; 分鐘變量清0
        S21:
        LCALL CONV ; 轉(zhuǎn)換LCD顯示數(shù)據(jù)
        MOV R5,#20 ; 20*10ms
        LCALL DELAY ; 延時
        JMP S0 ; 繼續(xù)程序執(zhí)行

        ;.....................
        S2:JB K4,S0 ; 未按下K4鍵則繼續(xù)掃描
        JNB K4,$ ; 有鍵按下則等待放開
        ; K4 KEYED OK ..........
        LCALL BZ ; 設(shè)置完成,蜂鳴器發(fā)音兩聲
        LCALL BZ ;
        SETB TR0 ; 啟動定時器
        RET
        ;=============================
        ; LCD第一行顯示程序
        ;=============================
        ; A:DIG X: LCD X POS
        ; SHOW ON LCD LINE1
        SHOW_DIG:
        MOV B,#10 ; 設(shè)置被除數(shù)
        DIV AB ; 除法運算,結(jié)果A存商數(shù),B存余數(shù)
        ADD A,#30H ; A為十位數(shù),轉(zhuǎn)換為字符
        PUSH B ; B放入堆棧暫存起來
        MOV B,DDRAM ; 設(shè)置LCD顯示的位置
        LCALL LCDP1 ; 由LCD顯示出來

        POP B ; B由堆棧取出來
        MOV A,B ; B為個位數(shù)
        ADD A,#30H ; 轉(zhuǎn)換為字符
        INC DDRAM ; LCD顯示位置加1
        MOV B,DDRAM ; 設(shè)置LCD顯示位置
        LCALL LCDP1 ; 由LCD顯示出來
        RET
        ;=============================
        ; LCD第二行顯示程序
        ;=============================
        ; A:DIG X: LCD X POS
        ; SHOW ON LCD LINE2
        SHOW_DIG2:
        MOV B,#10 ; 設(shè)置被除數(shù)
        DIV AB ; 除法運算,結(jié)果A存商數(shù),B存余數(shù)
        ADD A,#30H ; A為十位數(shù),轉(zhuǎn)換為字符
        PUSH B ; B放入堆棧暫存起來
        MOV B,DDRAM ; 設(shè)置LCD顯示的位置
        LCALL LCDP2 ; 由LCD顯示出來

        POP B ; B由堆棧取出來
        MOV A,B ; B為個位數(shù)
        ADD A,#30H ; 轉(zhuǎn)換為字符
        INC DDRAM ; LCD顯示位置加1
        MOV B,DDRAM ; 設(shè)置LCD顯示位置
        LCALL LCDP2 ; 由LCD顯示出來
        RET
        ;=============================
        ; 轉(zhuǎn)換顯示當前時間子程序
        ; 時時:分分:秒秒
        ;=============================
        CONV:
        ; SHOW HOUR...............顯示小時數(shù)據(jù)
        MOV A,HOUR ; 小時數(shù)據(jù)放在A中
        MOV DDRAM,#0 ; 設(shè)置要顯示的地址
        LCALL SHOW_DIG2 ; 在第二行顯示
        INC DDRAM ; 顯示地址加1
        MOV A,#: ; 加載" : "
        MOV B,DDRAM ; LCD顯示地址放入B中
        LCALL LCDP2 ; LCD第二行顯示程序
        ; SHOW MIN...............顯示分鐘數(shù)據(jù)
        MOV A,MIN ; 分鐘數(shù)據(jù)放在A中
        INC DDRAM ; 顯示地址加1
        LCALL SHOW_DIG2 ; 在第二行顯示
        INC DDRAM ; 顯示地址加1
        MOV A,#: ; 加載" : "
        MOV B,DDRAM ; LCD顯示地址放入B中
        LCALL LCDP2 ; LCD第二行顯示程序
        ; SHOW SEC...............顯示秒鐘數(shù)據(jù)
        MOV A,SEC ; 秒鐘數(shù)據(jù)放在A中
        INC DDRAM ; 顯示地址加1
        LCALL SHOW_DIG2 ; 在第二行顯示
        RET
        ;****************************
        ; LCD初始化設(shè)置程序
        ; 并測試
        ;****************************
        SET_LCD:
        LCALL INIT_LCD ; 初始化LCD

        MOV R5,#10 ; 10*10ms
        LCALL DELAY ; 延遲一下

        MOV DPTR,#LMESS1 ; 指針指在顯示消息1
        MOV A,#1 ; 顯示在第一行上
        LCALL LCD_PRINT ; 顯示執(zhí)行消息1于LCD第一行

        MOV DPTR,#LMESS2 ; 指針指在顯示消息2
        MOV A,#2 ; 顯示在第二行上
        LCALL LCD_PRINT ; 顯示執(zhí)行消息2于LCD第二行
        RET
        ;****************************
        ; LCD控制指令初始化設(shè)置
        ;****************************
        INIT_LCD:
        MOV COM,#38H ; 雙行顯示,8位數(shù)據(jù),5X8點陣
        LCALL W_COM
        MOV COM,#06H ; 輸入方式設(shè)置:AC自動加1
        LCALL W_COM
        MOV COM,#0CH ; 顯示開,光標關(guān)
        LCALL W_COM
        MOV COM,#01H ; 清LCD顯示屏
        LCALL W_COM
        RET
        ;****************************
        ; 清出LCD的第一行字符
        ;****************************
        CLR_LINE1:
        MOV COM,#80H ; 設(shè)置第一行地址
        LCALL W_COM ; 寫入地址
        MOV R0,#8 ; 設(shè)置計數(shù)值
        C1: MOV DAT,# ; 載入空格符至LCD
        LCALL W_DAT ; 輸出字符至LCD
        DJNZ R0,C1 ; 計數(shù)結(jié)束
        RET
        ;****************************
        ; 在LCD顯示字符
        ;****************************
        ; A=LINE 1 OR 2
        ; DPTR = MESSAGE POINTER
        LCD_PRINT:
        CJNE A,#1,LINE2 ; 判斷是否為第一行
        LINE1:MOV COM,#80H ; 設(shè)置LCD的第一行地址
        LCALL W_COM ; 寫入命令
        LCALL CLR_LINE ; 清除該行字符數(shù)據(jù)
        MOV COM,#80H ; 設(shè)置LCD的第一行地址
        LCALL W_COM ; 寫入命令
        JMP FILL ; 填入字符

        LINE2:MOV COM,#0C0H ; 設(shè)置LCD的第二行地址
        LCALL W_COM ; 寫入命令
        LCALL CLR_LINE ; 清除該行字符數(shù)據(jù)
        MOV COM,#0C0H ; 設(shè)置LCD的第二行地址
        LCALL W_COM ; 寫入命令
        FILL:
        CLR A ; A清零
        MOVC A,@A+DPTR ; 由消息區(qū)取出字符
        CJNE A,#0,LC1 ; 判斷是否為結(jié)束碼
        RET
        LC1:
        MOV DAT,A ; 將數(shù)據(jù)放入LCD數(shù)據(jù)寄存器
        LCALL W_DAT ; 寫入數(shù)據(jù)
        INC DPTR ; 指針加 1
        JMP FILL ; 繼續(xù)填入字符
        RET
        ;****************************
        ; LCD清出顯示
        ;****************************
        CLR_LINE:
        MOV R0,#8 ; 設(shè)置個數(shù)
        CL1: MOV DAT,# ; 載入空格符至LCD
        LCALL W_DAT ; 輸出字符至LCD
        DJNZ R0,CL1 ; 計數(shù)結(jié)束
        RET
        ;****************************
        ; 判斷忙標志程序
        ;****************************
        B_LCD: PUSH ACC ; 把ACC壓入堆棧
        CLR RS ; RS=1
        SETB RW ; RW=1
        B_LCD1: MOV P1,#0FFH ; P1口置"1"
        SETB E ; E =1
        MOV A,P1 ; 從P1口讀出數(shù)據(jù)
        NOP ; 空操作
        CLR E ; E =0
        JB ACC.7,B_LCD1 ; 判斷忙標志
        POP ACC ; 把ACC彈出堆棧
        RET
        ;***************************
        ; 寫命令到LCD程序
        ;***************************
        W_COM: LCALL B_LCD ; 判斷忙標志
        CLR RS ; RS=0
        CLR RW ; RW=0
        SETB E ; E =1
        MOV P1,COM ; 寫入指令到P1口
        CLR E ; E =0
        RET
        ;***************************
        ; 寫數(shù)據(jù)到LCD程序
        ;***************************
        W_DAT: LCALL B_LCD ; 判斷忙標志
        SETB RS ; RS=1
        CLR RW ; RW=0
        SETB E ; E =1
        MOV P1,DAT ; 寫入數(shù)據(jù)
        CLR E ; E =0
        RET
        ;============================
        ; LCD第一行顯示程序
        ;============================
        LCDP1:
        ; LINE 1
        PUSH ACC ; 將A放入堆棧
        MOV A,B ; 設(shè)置顯示地址
        ADD A,#80H ; 設(shè)置LCD的第一行地址
        MOV COM,A ; 把地址放入指令寄存器
        LCALL W_COM ; 寫入命令
        POP ACC ; 由堆棧中取出A
        MOV DAT,A ; 把數(shù)據(jù)放入數(shù)據(jù)寄存器
        LCALL W_DAT ; 寫入數(shù)據(jù)
        RET
        ;============================
        ; LCD第二行顯示程序
        ;============================
        LCDP2:
        ; LINE 1
        PUSH ACC ; 將A放入堆棧
        MOV A,B ; 設(shè)置顯示地址
        ADD A,#0C0H ; 設(shè)置LCD的第二行地址
        MOV COM,A ; 把地址放入指令寄存器
        LCALL W_COM ; 寫入命令
        POP ACC ; 由堆棧中取出 A
        MOV DAT,A ; 把數(shù)據(jù)放入數(shù)據(jù)寄存器
        LCALL W_DAT ; 寫入數(shù)據(jù)
        RET
        ;****************************
        ; 延時程序
        ;****************************
        ; 總延遲 R5*10 ms
        DELAY:
        MOV R6,#50 ; R6存入50
        D1:MOV R7,#100 ; R7存入100
        DJNZ R7,$ ; R7不為零,則繼續(xù)
        DJNZ R6,D1 ; R6不為零,則繼續(xù)
        DJNZ R5,DELAY ; R5不為零,則繼續(xù)
        RET
        ; 1s 延時
        D_LAY: MOV R5,#100
        LCALL DELAY
        RET
        ;****************************
        ; 工作LED閃動程序
        ;****************************
        LED_BL:
        MOV R4,#4 ; R4存入4
        LE0:CPL W_LED ; 位反向
        MOV R5,#10 ; 延遲 100 ms
        LCALL DELAY ; 延時
        DJNZ R4, LE0 ;
        RET
        ;;***************************
        ; 菜單程序
        ;****************************
        MMENU:DB "Now_Time",0 ; 正常走時第一顯示
        MADJ:DB "2H 3M 4K",0 ; 調(diào)時時第二顯示
        MLAL:DB "CtrlTime",0 ; 查看控制時間時第一顯示
        MAADJ:DB "2H 3M 4K",0 ; 調(diào)時時第二顯示

        MENU: ;LCD顯示菜單
        MOV DPTR,#MMENU ; 存入菜單地址
        MOV A,#1 ;
        LCALL LCD_PRINT ; 在LCD顯示字符
        RET
        ;****************************
        ; 發(fā)音程序
        ;****************************
        BZ:
        MOV R6,#0 ; R6值零
        B1:LCALL DEX ; 短暫延遲
        CPL SPK ; 蜂鳴器取反
        DJNZ R6,B1 ;

        MOV R5,#10 ; 10*10ms
        LCALL DELAY ; 延時
        RET
        ;--------------------
        DEX:MOV R7,#180 ; 短暫延遲
        DE1:NOP ; 空操作
        DJNZ R7,DE1 ;
        RET
        ;============================
        ; 查看已設(shè)置的控制時間
        ;============================
        LOOK_ATIME:
        ; 顯示小時數(shù)...............
        MOV A,HH ; 調(diào)小時數(shù)據(jù)
        MOV DDRAM,#0 ; 設(shè)置顯示地址
        LCALL SHOW_DIG2 ; 在第二行顯示
        INC DDRAM ; 顯示地址加 1
        MOV A,#: ; 加載" : "
        MOV B,DDRAM ; LCD顯示地址放入B中
        LCALL LCDP2 ; LCD第二行顯示
        ; 顯示分鐘數(shù)...............
        MOV A,MM ; 調(diào)小時數(shù)據(jù)
        INC DDRAM ; 顯示地址加 1
        LCALL SHOW_DIG2 ; 在第二行顯示
        INC DDRAM ; 顯示地址加 1
        MOV A,#: ; 加載" : "
        MOV B,DDRAM ; LCD顯示地址放入B中
        LCALL LCDP2 ; LCD第二行顯示
        ; 顯示秒鐘數(shù)...............
        MOV A,#0 ; 設(shè)置秒為 00
        INC DDRAM ; 顯示地址加 1
        LCALL SHOW_DIG2 ; 在第二行顯示
        RET
        ;============================
        ; 設(shè)置控制時間
        ; K2:HH K3:MM K4:OK
        ;============================
        ; K2:HH K3:MMK4:OK
        SET_ATIME:
        LCALL LOOK_ATIME ; 加載控制時間數(shù)據(jù)
        ; SCAN 3 KEY TO ADJ.........
        AS0:
        JB K2,AS1 ; 未按下K2鍵則繼續(xù)掃描
        ; K2......... 調(diào)整小時
        LCALL BZ ; 蜂鳴器響一聲
        INC HH ; 小時加1
        MOV A, HH ; 小時值放在累加器中,用于比較
        CJNE A,#24,AS11 ; 是否到24h?
        MOV HH,#0 ; 小時清0
        AS11:
        LCALL LOOK_ATIME ; 加載控制時間數(shù)據(jù)
        MOV R5,#20 ; 20*10ms
        LCALL DELAY ; 延時
        JMP AS0 ; 繼續(xù)按鍵掃描
        ;....................
        AS1:JB K3,AS2 ; 未按下K2鍵則繼續(xù)掃描
        ; K3........ 分鐘調(diào)整
        LCALL BZ ; 蜂鳴器響一聲
        INC MM ; 分鐘加1
        MOV A,MM ;
        CJNE A,#60,AS21 ; 是否到 60 min ?
        MOV MM,#0 ; 分鐘數(shù)清0
        AS21:
        LCALL LOOK_ATIME ; 加載控制時間數(shù)據(jù)
        MOV R5,#20 ; 20*10ms
        LCALL DELAY ; 延時
        JMP AS0 ; 繼續(xù)按鍵掃描
        ;.....................
        AS2:JB K4,AS0 ; 未按下K4鍵則繼續(xù)掃描
        ; K4........ 設(shè)置完成
        JNB K4,$ ; 等K4鍵放開
        SETB ALB ; 設(shè)置控制標志
        CLR C_LED ; 控制指示燈亮
        LCALL BZ ; 蜂鳴器發(fā)音三聲
        LCALL BZ ;
        LCALL BZ
        RET
        ;============================
        ; 更新時間并檢查控制時間
        ;============================
        TIME_PRO:
        ; UPDATE TIME...........
        MOV A,SEC ; 加載當前秒數(shù)
        MOV B,SEC0 ; 載入舊秒數(shù)
        CJNE A,B,TI1 ; 是否過了1 s ?
        JMP TI2 ; 檢查是否啟動控制器
        TI1:LCALL CONV ; LCD顯示時間數(shù)據(jù)
        MOV SEC0,SEC ; 記錄舊的秒數(shù)
        TI2:
        ; 檢查是否啟動控制器
        JB ALB,TI3 ; 有啟動標志,則比較時間
        JB CLOCK,TI4 ; 有啟動標志,則比較時間
        RET
        TI3:
        ; 檢查鬧鐘時間是否到了....
        MOV A,HOUR ; 當前小時時間
        MOV B,HH ; 控制小時時間
        CJNE A,B,BK ; 檢查控制小時時間

        MOV A,MIN ; 當前分鐘時間
        MOV B,MM ; 控制分鐘時間
        CJNE A,B,BK ; 檢查控制分鐘時間
        ; TIME MATCH.................
        LCALL TIME_OUT ; 到點工作程序
        SJMP BK
        ; 檢查是否為整點
        TI4:
        MOV A,SEC
        CJNE A,#0,BK ; 秒是否為0?
        MOV A,MIN ; 分是否為0?
        CJNE A,#0,BK
        MOV A,HOUR
        TI40: LCALL BZ ; 多少時間就發(fā)音多少次
        DEC A
        MOV R5,#40
        LCALL DELAY
        CJNE A,#0,TI40
        LCALL LED_BL ; W_LED閃爍
        CPL CLOCK
        CPL D_LED
        BK:
        RET
        ;****************************
        ; 到點工作程序
        ;****************************
        TIME_OUT:
        CPL Y_LED ; 繼電器
        CPL ELEC ; 被控制器件
        M1:LCALL LED_BL ; 工作燈閃爍
        LCALL BZ ; 蜂鳴器發(fā)音
        ; K4..........停止
        JB K4,M1 ; 未按下K4鍵則繼續(xù)掃描
        JNB K4,$ ; 等待K4鍵釋放
        NOP
        NOP
        LCALL LED_BL ; 工作燈閃爍
        CLR ALB ; 清除控制標志
        SETB C_LED ; 關(guān)閉控制標志燈
        RET
        END
        ;-- 結(jié)束 --
        ;---------------------------



        關(guān)鍵詞: LCD時間控制

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 阿克苏市| 开封县| 湘乡市| 江安县| 英山县| 乌鲁木齐市| 宣恩县| 耿马| 满城县| 农安县| 乐安县| 淅川县| 凤凰县| 山阳县| 广宗县| 崇礼县| 彝良县| 陆河县| 上高县| 安泽县| 凯里市| 新野县| 社会| 思南县| 江阴市| 达日县| 沁阳市| 渑池县| 石柱| 莱西市| 若尔盖县| 沙坪坝区| 逊克县| 梁山县| 平安县| 乌什县| 巍山| 余姚市| 沅江市| 平南县| 澎湖县|