帶LCD的時(shí)間控制器
本帶LCD的時(shí)間控制器,是在本人畢業(yè)時(shí)間《基于單片機(jī)的時(shí)間控制器的設(shè)計(jì)》的基礎(chǔ)上進(jìn)行修改的。
使得時(shí)間的控制和修改更容易,更直觀。并擴(kuò)展了紅外遙控的功能,但由于條件限制,并沒有把此功能
的程序加上。
按鍵說明:
K1 設(shè)置當(dāng)前時(shí)間/按鍵超過1s,則置整點(diǎn)報(bào)時(shí)標(biāo)志
K2 顯示控制時(shí)間/小時(shí)加
K3 設(shè)置控制時(shí)間/分鐘加
K4 控制ON/OFF設(shè)置/確定
K5 控制開/關(guān)
ELEC 繼電器
SPK 蜂鳴器
Y_LED 繼電器工作指示
C_LED 被控電器指示燈
W_LED 計(jì)時(shí)工作指示燈
D_LED 整點(diǎn)報(bào)時(shí)指示燈
實(shí)物圖:
程序代碼:
;=============================
; 帶LCD的時(shí)間控制器
; DIPS082-LCD
; KS0066-控制器
;=============================
LOEQU 24 ; 加載低字節(jié)
HIEQU 99 ; 加載高字節(jié)
;-----------------------------
COEQU 200 ; 5ms中斷計(jì)數(shù)時(shí)間常數(shù)
; 計(jì)數(shù)200次表示1s
ALBEQU 20H.0 ; 控制設(shè)置標(biāo)志
CLOCK EQU 20H.1 ; 整點(diǎn)報(bào)時(shí)標(biāo)志
HOUREQU 30H ; 存放小時(shí)變量
MINEQU 31H ; 存放分鐘變量
SECEQU 32H ; 存放秒鐘變量
DEDAEQU 33H ; 5ms計(jì)數(shù)值
SEC0EQU 34H ; 存放舊的秒數(shù)
;-----------------------------
DDRAMEQU 35H ; LCD地址變量
COM EQU 22H ; LCD指令寄存器
DAT EQU 21H ; LCD數(shù)據(jù)寄存器
COUNT EQU 22H ; 計(jì)數(shù)器
HHEQU 36H ; 控制設(shè)置小時(shí)變量
MMEQU 37H ; 控制設(shè)置分鐘變量
;-----------------------------
; KEY4.....
K1EQU P2.1 ; 設(shè)置當(dāng)前時(shí)間
K2EQU P2.0 ; 顯示控制時(shí)間/小時(shí)加
K3EQU P3.6 ; 設(shè)置控制時(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 ; 計(jì)時(shí)工作指示燈
D_LEDEQU P2.5 ; 整點(diǎn)報(bào)時(shí)指示燈
;-----------------------------
ORG 0000H ; 程序代碼由地址0
JMP START ; 跳至主函數(shù)開始執(zhí)行
ORG 000BH ; 定時(shí)器TIMER0中斷地址
JMP T0_INT ; 跳至TIMER0中斷啟始地址
;#############################
; 主程序
;#############################
START:
CLR Y_LED ; 繼電器工作指示關(guān)
CLR ELEC ; 繼電器關(guān)
CLR CLOCK ; 清除整點(diǎn)報(bào)時(shí)標(biāo)志
SETB D_LED ; 整點(diǎn)報(bào)時(shí)指示燈關(guān)
;-----------------------------
CLR ALB ; 清除控制標(biāo)志
MOV HH,#0 ; 內(nèi)定的控制時(shí)間為--00:00
MOV MM,#0
LCALL SET_LCD ; LCD初始化
LCALL BZ ; 蜂鳴器連續(xù)兩次發(fā)音
LCALL BZ
LCALL LED_BL ; LED閃動(dòng),表示工作開始
LCALL INIT ; 初始化變量
LCALL INIT_TIMER ; 初始化定時(shí)器
LCALL MENU ;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 循環(huán)程序
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LOOP:
LCALL TIME_PRO ; 時(shí)間計(jì)時(shí)處理
; 按鍵掃描............
JB K1,L1 ; 未按下K1鍵則繼續(xù)掃描
; K1.....時(shí)間設(shè)置/設(shè)整點(diǎn)報(bào)時(shí)
; K1 : ADJ TIME K2:HOUR K3:MIN K4: OK
LCALL D_LAY ; 1s延時(shí)
JNB K1,LL ; 按鍵超過1s,則設(shè)整點(diǎn)報(bào)時(shí)
LCALL BZ ; LED閃動(dòng)
MOV DPTR,#MADJ ; 現(xiàn)實(shí)執(zhí)行消息
MOV A,#1 ;
LCALL LCD_PRINT ; 在LCD顯示字符
LCALL SET_TIME ; 設(shè)置目前時(shí)間
LCALL MENU ; 菜單
JMP LOOP ; 繼續(xù)循環(huán)
;.............................
L1:JB K2,L2 ; 未按下K2鍵則繼續(xù)掃描
; K2............控制時(shí)間顯示
JNB K2,$ ; 等待K2鍵釋放
LCALL BZ ; 蜂鳴器發(fā)音
MOV DPTR,#MLAL ; 顯示控制消息
MOV A,#1 ;
LCALL LCD_PRINT ; 在LCD顯示字符
LCALL LOOK_ATIME ; 查看控制時(shí)間
LCALL DELAY ; 延時(shí)
LCALL LED_BL ; 工作LED閃動(dòng)
LCALL LED_BL ;
LCALL MENU ; 菜單
JMP LOOP ; 繼續(xù)循環(huán)
;.............................
L2:JB K3,L3 ; 未按下K3鍵則繼續(xù)掃描
; K3.....控制時(shí)間設(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í)間設(shè)置
LCALL LED_BL ; 工作LED閃動(dòng)
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è)置標(biāo)志取反
JNB ALB,L31 ; 沒有控制標(biāo)志,則發(fā)音一聲
; ALARM ON....................
CLR C_LED ; 控制指示燈亮
LCALL BZ ; 有控制標(biāo)志,則蜂鳴器發(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 ; 值整點(diǎn)報(bào)時(shí)標(biāo)志
CPL D_LED ; 整點(diǎn)報(bào)時(shí)指示燈亮
LCALL DELAY
JMP LOOP ; 返回
;-----------------------------
LMESS1: DB "Wlecome!",0
LMESS2: DB " happy! ",0
;=============================
; 初始化控制變量子程序
;=============================
INIT:
MOV DEDA,#0 ; 5ms計(jì)數(shù)值清除為0
MOV SEC0,#0 ; 舊的秒數(shù)清除為0
MOV SEC,#0 ; 秒鐘變量清除為0
MOV MIN,#0 ; 分鐘變量清除為0
MOV HOUR,#1 ; 小時(shí)變量清除為1
RET ; 子程序返回
;=============================
;初始化定時(shí)器接口子程序
;=============================
INIT_TIMER:
MOV TMOD,#00000000B ; 設(shè)置定時(shí)器T0工作方式為方式0
MOV IE, #10000010B ;
MOV TL0,#LO ; 加載低字節(jié)
MOV TH0,#HI ; 加載高字節(jié)
SETB TR0 ; 啟動(dòng)定時(shí)器T0開始計(jì)時(shí)
RET
;*****************************
; 定時(shí)器0中斷服務(wù)程序
;*****************************
T0_INT: ; 中斷程序每隔5ms中斷一次
PUSH ACC ; 累加器放入堆棧
MOV TL0,#LO ; 加載低字節(jié)
MOV TH0,#HI ; 加載高字節(jié)
INC DEDA ; 5ms計(jì)數(shù)值加1
; 1 SEC TIME OUT CHECK
MOV A,DEDA ; 5ms計(jì)數(shù)值
CJNE A,#CO,TT ; 是否1s到了?
MOV DEDA,#0 ; DEDA值0
CPL W_LED ; LED燈亮滅變換
INC SEC ; 秒計(jì)數(shù)加1
MOV A,SEC ; 秒數(shù)據(jù)放在累加器里,用于比較
CJNE A,#60,TT ; 是否到1 min?
; 1 MIN TIME OUT
INC MIN ; 分計(jì)數(shù)加1
MOV SEC,#0 ; 秒計(jì)數(shù)清除為0
MOV A,MIN
CJNE A,#60,TT ; 是否到1 h ?
; 1 HOUR TIME OUT
INC HOUR ; 小時(shí)計(jì)數(shù)加1
MOV MIN,#0 ; 分計(jì)數(shù)清除為0
MOV A,HOUR
CJNE A,#24,TT ; 是否24 h到了?
MOV SEC,#0 ; 秒鐘變量清0
MOV MIN,#0 ; 分鐘變量清0
MOV HOUR,#0 ; 小時(shí)變量清0
TT:
POP ACC ; 將累加器由堆棧取出
RETI ; 中斷返回
;=============================
; 設(shè)置當(dāng)前時(shí)間
; K2:HH K3:MM K4:OK
;=============================
; K2:HH K3:MMK4:OK
SET_TIME:
CLR TR0 ; 關(guān)定時(shí)器0
MOV SEC,#0 ; 秒鐘變量清0
; SCAN 3 KEY TO ADJ...........
S0:
JB K2,S1 ; 未按下K2鍵則繼續(xù)掃描
; 小時(shí)調(diào)整
LCALL BZ ; 蜂鳴器發(fā)音一聲
INC HOUR ; 小時(shí)加1
MOV A,HOUR ; 小時(shí)值放在累加器中,用于比較
CJNE A,#24,S11 ; 是否24 h到了?
MOV HOUR,#0 ; 小時(shí)變量清0
S11:
LCALL CONV ; 轉(zhuǎn)換LCD顯示數(shù)據(jù)
MOV R5,#20 ;
LCALL DELAY ; 延時(shí)
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 ; 延時(shí)
JMP S0 ; 繼續(xù)程序執(zhí)行
;.....................
S2:JB K4,S0 ; 未按下K4鍵則繼續(xù)掃描
JNB K4,$ ; 有鍵按下則等待放開
; K4 KEYED OK ..........
LCALL BZ ; 設(shè)置完成,蜂鳴器發(fā)音兩聲
LCALL BZ ;
SETB TR0 ; 啟動(dòng)定時(shí)器
RET
;=============================
; LCD第一行顯示程序
;=============================
; A:DIG X: LCD X POS
; SHOW ON LCD LINE1
SHOW_DIG:
MOV B,#10 ; 設(shè)置被除數(shù)
DIV AB ; 除法運(yùn)算,結(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為個(gè)位數(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 ; 除法運(yùn)算,結(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為個(gè)位數(shù)
ADD A,#30H ; 轉(zhuǎn)換為字符
INC DDRAM ; LCD顯示位置加1
MOV B,DDRAM ; 設(shè)置LCD顯示位置
LCALL LCDP2 ; 由LCD顯示出來
RET
;=============================
; 轉(zhuǎn)換顯示當(dāng)前時(shí)間子程序
; 時(shí)時(shí):分分:秒秒
;=============================
CONV:
; SHOW HOUR...............顯示小時(shí)數(shù)據(jù)
MOV A,HOUR ; 小時(shí)數(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è)置程序
; 并測(cè)試
;****************************
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點(diǎn)陣
LCALL W_COM
MOV COM,#06H ; 輸入方式設(shè)置:AC自動(dòng)加1
LCALL W_COM
MOV COM,#0CH ; 顯示開,光標(biāo)關(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è)置計(jì)數(shù)值
C1: MOV DAT,# ; 載入空格符至LCD
LCALL W_DAT ; 輸出字符至LCD
DJNZ R0,C1 ; 計(jì)數(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è)置個(gè)數(shù)
CL1: MOV DAT,# ; 載入空格符至LCD
LCALL W_DAT ; 輸出字符至LCD
DJNZ R0,CL1 ; 計(jì)數(shù)結(jié)束
RET
;****************************
; 判斷忙標(biāo)志程序
;****************************
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 ; 判斷忙標(biāo)志
POP ACC ; 把ACC彈出堆棧
RET
;***************************
; 寫命令到LCD程序
;***************************
W_COM: LCALL B_LCD ; 判斷忙標(biāo)志
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 ; 判斷忙標(biāo)志
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
;****************************
; 延時(shí)程序
;****************************
; 總延遲 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 延時(shí)
D_LAY: MOV R5,#100
LCALL DELAY
RET
;****************************
; 工作LED閃動(dòng)程序
;****************************
LED_BL:
MOV R4,#4 ; R4存入4
LE0:CPL W_LED ; 位反向
MOV R5,#10 ; 延遲 100 ms
LCALL DELAY ; 延時(shí)
DJNZ R4, LE0 ;
RET
;;***************************
; 菜單程序
;****************************
MMENU:DB "Now_Time",0 ; 正常走時(shí)第一顯示
MADJ:DB "2H 3M 4K",0 ; 調(diào)時(shí)時(shí)第二顯示
MLAL:DB "CtrlTime",0 ; 查看控制時(shí)間時(shí)第一顯示
MAADJ:DB "2H 3M 4K",0 ; 調(diào)時(shí)時(shí)第二顯示
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 ; 延時(shí)
RET
;--------------------
DEX:MOV R7,#180 ; 短暫延遲
DE1:NOP ; 空操作
DJNZ R7,DE1 ;
RET
;============================
; 查看已設(shè)置的控制時(shí)間
;============================
LOOK_ATIME:
; 顯示小時(shí)數(shù)...............
MOV A,HH ; 調(diào)小時(shí)數(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í)數(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è)置控制時(shí)間
; K2:HH K3:MM K4:OK
;============================
; K2:HH K3:MMK4:OK
SET_ATIME:
LCALL LOOK_ATIME ; 加載控制時(shí)間數(shù)據(jù)
; SCAN 3 KEY TO ADJ.........
AS0:
JB K2,AS1 ; 未按下K2鍵則繼續(xù)掃描
; K2......... 調(diào)整小時(shí)
LCALL BZ ; 蜂鳴器響一聲
INC HH ; 小時(shí)加1
MOV A, HH ; 小時(shí)值放在累加器中,用于比較
CJNE A,#24,AS11 ; 是否到24h?
MOV HH,#0 ; 小時(shí)清0
AS11:
LCALL LOOK_ATIME ; 加載控制時(shí)間數(shù)據(jù)
MOV R5,#20 ; 20*10ms
LCALL DELAY ; 延時(shí)
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í)間數(shù)據(jù)
MOV R5,#20 ; 20*10ms
LCALL DELAY ; 延時(shí)
JMP AS0 ; 繼續(xù)按鍵掃描
;.....................
AS2:JB K4,AS0 ; 未按下K4鍵則繼續(xù)掃描
; K4........ 設(shè)置完成
JNB K4,$ ; 等K4鍵放開
SETB ALB ; 設(shè)置控制標(biāo)志
CLR C_LED ; 控制指示燈亮
LCALL BZ ; 蜂鳴器發(fā)音三聲
LCALL BZ ;
LCALL BZ
RET
;============================
; 更新時(shí)間并檢查控制時(shí)間
;============================
TIME_PRO:
; UPDATE TIME...........
MOV A,SEC ; 加載當(dāng)前秒數(shù)
MOV B,SEC0 ; 載入舊秒數(shù)
CJNE A,B,TI1 ; 是否過了1 s ?
JMP TI2 ; 檢查是否啟動(dòng)控制器
TI1:LCALL CONV ; LCD顯示時(shí)間數(shù)據(jù)
MOV SEC0,SEC ; 記錄舊的秒數(shù)
TI2:
; 檢查是否啟動(dòng)控制器
JB ALB,TI3 ; 有啟動(dòng)標(biāo)志,則比較時(shí)間
JB CLOCK,TI4 ; 有啟動(dòng)標(biāo)志,則比較時(shí)間
RET
TI3:
; 檢查鬧鐘時(shí)間是否到了....
MOV A,HOUR ; 當(dāng)前小時(shí)時(shí)間
MOV B,HH ; 控制小時(shí)時(shí)間
CJNE A,B,BK ; 檢查控制小時(shí)時(shí)間
MOV A,MIN ; 當(dāng)前分鐘時(shí)間
MOV B,MM ; 控制分鐘時(shí)間
CJNE A,B,BK ; 檢查控制分鐘時(shí)間
; TIME MATCH.................
LCALL TIME_OUT ; 到點(diǎn)工作程序
SJMP BK
; 檢查是否為整點(diǎn)
TI4:
MOV A,SEC
CJNE A,#0,BK ; 秒是否為0?
MOV A,MIN ; 分是否為0?
CJNE A,#0,BK
MOV A,HOUR
TI40: LCALL BZ ; 多少時(shí)間就發(fā)音多少次
DEC A
MOV R5,#40
LCALL DELAY
CJNE A,#0,TI40
LCALL LED_BL ; W_LED閃爍
CPL CLOCK
CPL D_LED
BK:
RET
;****************************
; 到點(diǎn)工作程序
;****************************
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 ; 清除控制標(biāo)志
SETB C_LED ; 關(guān)閉控制標(biāo)志燈
RET
END
;-- 結(jié)束 --
;---------------------------
評(píng)論