本帖最后由 楊小強 于 2021-1-19 13:43 編輯
源碼分享:
用STC15F104W單片機芯片制作定時IC,適用于各種需延時通斷、循環通斷的控制場合
作者:楊小強,2021年1月
MCU:STC15F104W,內部R/C時鐘,頻率選擇:11.0592MHz
顯示:(TM1637)4位數碼管顯示模塊
調整定時時間、設置:EC11帶按鍵5腳旋轉編碼器。也可以用兩只按鍵代替編碼器
定時范圍:10毫秒~100小時
描述:
默認導通定時時間10小時,上電就導通,可通過旋轉編碼器實時調整當前定時時間,最大可調
到99小時59分59+1秒=100小時,最小為0;導通定時時間到0就斷開,停止運行,不循環,睡眠模式
為“始終顯示”,旋轉編碼器調整當前導通定時時間,又開始運行。
定時時間1小時以上顯示“時:分”,冒號閃爍;小于1小時自動切換為顯示“分:秒”,冒號不
閃爍;小于1分鐘自動切換為顯示“秒:毫秒”,冒號不閃爍。
用于固定定時時間的場合時,設置好各項參數,可取消數碼管顯示模塊、編碼器、按鍵,同時
把編碼器、按鍵I/O端口P3.1、P3.2、P3.3接到2腳VCC,避免萬一端口受到干擾而產生誤動作。
設置共有2種方式:
方式1(適合手頭上沒有TM1637數碼管顯示模塊的情況):把源程序中“設置各項默認值”處改
為需要的值,編譯為HEX文件,燒寫時把“本次將EEPROM區域全部填充為FF”選項勾上。
方式2:之1.長按KEY3秒,顯示“--:--”時釋放,進入“設置”狀態進行設置。
之2.轉動編碼器一點點停留在半格,也就是兩格之間,讓A或B、或者AB都為ON并保持
3秒,顯示“--:--”時轉完一格,進入“設置”狀態進行設置。當“主界面狀態下長按快速加減使
能的常數”設為081H(允許)時此方式無效。
按鍵、編碼器動作:
1.處于睡眠狀態時,按鍵、編碼器動作只喚醒睡眠,恢復數碼管顯示,不影響正常運行和數據。
2.處于始終導通狀態時,有按鍵、編碼器動作將退出始終導通狀態,切換到“導通時間”結束的斷
開狀態,如果設置的是循環定時,就從“斷開時間”繼續運行。
3.同時處于睡眠狀態和終導通狀態時,先喚醒睡眠,退出睡眠狀態2秒后,再次有按鍵、編碼器動
作才退出始終導通狀態。
4.短按KEY1次,暫停計時,如果當前是導通狀態將斷開,再按恢復導通并繼續計時。
5.處于“導通”或“斷開”工作狀態時,短按2次KEY,當前時間清零,運行下一項(如果設有)。
6.短按KEY3次:重新啟動,相當于重新上電。
7.間隔時間不超過0.5秒的2次或3次短按,為有效按鍵動作。
8.長按KEY3秒,顯示“--:--”時釋放,進入“設置”,如果保持按下達到10秒,將恢復默認設置。
9.長按KEY10秒,恢復默認設置,顯示88:88,然后按默認值從“導通”開始執行。
10.處于“上電延時導通”、“導通”、“斷開”工作狀態時,旋轉編碼器可進行實時調整,最
大99小時59分59+1秒=100小時,最小為0。
11.處于“上電延時導通”工作狀態,延時導通模式為2(延時時間到后從“斷開”繼續運行)時,上
電4.2分鐘后,按下KEY達到設置的時長,時間清零,之后不響應按鍵動作,繼續執行“斷開”、
“導通”,執行到“導通”狀態運行結束時,恢復按鍵全部功能。
12.轉動編碼器一點點停留在半格,也就是兩格之間,讓A或B、或者AB都為ON并保持3秒,這時顯示
“--:--”(如果仍然保持不動達到10秒,將恢復默認設置),然后轉完一格,進入“設置”。
當“定義主界面狀態下長按快速加減使能的常數”設為081H(允許)時此方式無效。
設置:
進入“設置”后,根據數碼管左邊顯示的內容進行相應設置,旋轉編碼器加或減,設置好一項,
閃爍5秒無操作或者短按KEY釋放0.5秒后,跳到下一項。任何時候都可以短按2次KEY保存并退出,
或在最后一項無操作自動保存退出。
按住KEY不放,旋轉編碼器可向上/下轉移到任意一項設置,釋放按鍵后旋轉編碼器加或減。
1、顯示“1A”設置導通時間(時),0~99小時,默認10小時
2、顯示“1b”設置導通時間(分),0~59分鐘
3、顯示“1C”設置導通時間(秒),0~59秒
4、顯示“1d”設置導通時間(×10毫秒),0~99
5、顯示“o-”設置循環定時,0=無限循環;1=不循環;2~99=循環導通次數。默認為1,不循環
6、顯示“C-”設置睡眠模式,0=始終顯示;1~59=無操作進入睡眠(分鐘)。默認為0,始終顯示
7、顯示“bC”設置實時調整時(步長),3小時以下定時調整時,編碼器每轉動一格的增(減)值:
1~30分鐘,默認1分鐘;3小時以上增(減)值30分鐘;10小時以上增(減)值1個小時;
20小時以上增(減)值2個小時。
8、顯示“Ld”設置數碼管亮度,1~8級。默認為3級
9、顯示“2A”設置斷開時間(時),0~99小時
10、顯示“2b”設置斷開時間(分),0~59分鐘
11、顯示“2C”設置斷開時間(秒),0~59秒
12、顯示“2d”設置斷開時間(×10毫秒),0~99
13、顯示“3A”設置上電延時導通(時),0~99小時,默認值為0
14、顯示“3b”設置上電延時導通(分),0~59分鐘,默認值為0
15、顯示“3C”設置上電延時導通(秒),0~59秒,默認值為0
16、顯示“d-”設置延時導通模式,0~2。默認為2(延時時間到后從“斷開”繼續運行)
17、顯示“E-”設置“持續時間”秒計數0~99,按下KEY持續0~99秒結束“上電延時導通”狀態
保存失敗將顯示5秒E1。
導通時間:1~99(×10)毫秒~100小時,如果“上電延時導通”時間設為0(關閉),則上電就執行本項。
如果設置為循環定時,本項時間結束就執行“斷開時間”。
循環定時:0=無限循環;1=不循環;2~99=導通次數;導通次數是指從上電到循環結束為止,總共導通
的次數。如果“斷開時間”設置的時間為0,循環無效,導通定時時間到后就斷開,停止。
睡眠模式:0=始終顯示;1~59=無操作1~59分鐘關閉顯示繼續運行;按鍵、編碼器有動作就喚醒睡眠
斷開時間:1~99(×10)毫秒~100小時,時間結束就運行“導通時間”。默認值為2小時。
上電延時導通:1秒~100小時。設置的時間全部為0=關閉;設置的時間不為0就啟用;
本項上電只執行一次,不參與循環定時。默認為0
啟用上電延時導通,延時導通模式為2時,上電4.2分鐘內不響應按鍵動作,編碼
器可以正常使用,4.2分鐘之后,當持續按下按鍵的時間達到設置的時長(0~99秒)就
清零,結束“上電延時導通”狀態,繼續不響應按鍵動作,執行到“導通”狀態運行
結束時,按鍵功能恢復正常。
延時導通模式:0=延時時間到后始終導通。旋轉編碼器或按下KEY就退出始終導通狀態,切換到
“導通時間”的結束狀態,如果設置的是循環定時,就從“斷開時間”繼續運行。
1=延時時間到后從“導通”繼續運行,如果“導通時間”設置的時間為0就結束
2=延時時間到后從“斷開”繼續運行,如果“斷開時間”設置的時間為0就轉到“導
通”繼續運行。
下面用電動車充電定時器等電路舉例其應用:
電動車充電器定時自動關機.jpg (246.95 KB, 下載次數: 56)
下載附件
2021-1-18 21:22 上傳
電動車充電器定時自動關機(檢測綠燈).jpg (307.22 KB, 下載次數: 60)
下載附件
2021-1-18 21:23 上傳
電動車充電器定時自動斷電(SCR).jpg (295.1 KB, 下載次數: 61)
下載附件
2021-1-18 21:23 上傳
電動車充電器定時自動斷電(SCR)(檢測綠燈).jpg (303.5 KB, 下載次數: 82)
下載附件
2021-1-18 21:23 上傳
電動車充電器定時自動斷電(繼電器).jpg (272.34 KB, 下載次數: 64)
下載附件
2021-1-18 21:23 上傳
電動車充電器定時自動斷電(繼電器)(檢測綠燈).jpg (303.85 KB, 下載次數: 77)
下載附件
2021-1-18 21:24 上傳
冰箱冰柜定時器.jpg (249.76 KB, 下載次數: 72)
下載附件
2021-1-19 09:17 上傳
可控硅控制.jpg (255.83 KB, 下載次數: 71)
下載附件
2021-1-18 21:24 上傳
繼電器控制.jpg (259.11 KB, 下載次數: 72)
下載附件
2021-1-18 21:24 上傳
10毫秒.jpg (330.6 KB, 下載次數: 71)
下載附件
2021-1-18 21:24 上傳
上面是“導通時間”和“斷開時間”設為最小值1(10毫秒),“循環定時”設為“無限循環”的情況,P3.0的輸出為50Hz方波。
下面是源程序:
- ;----------------------------- 端口定義 ------------------------------------
- MOC EQU P3.0 ;5腳,導通狀態輸出低電平;斷開狀態輸出高電平
- KEY EQU P3.1 ;6腳,按鍵KEY
- EC11A EQU P3.2 ;7腳,接編碼器的A引腳
- EC11B EQU P3.3 ;8腳,接編碼器的B引腳
- DIO EQU P3.4 ;1腳,接顯示模塊TM1637的DIO
- CLK EQU P3.5 ;3腳,接顯示模塊TM1637的CLK
- ;---------------------------- 位地址及RAM的使用 ----------------------------
- ;(20H)第0位:1=編碼器有旋轉動作;0=沒有旋轉動作
- ;(20H)第1位:1=編碼器順時針正轉;0=編碼器逆時針反轉
- ;(20H)第2位:1=暫停;0=正常運行
- ;(20H)第3位:1=禁止;0=允許。進行各項設置時使用,允許/禁止檢查剩余時間
- ;(20H)第4位:1=閃爍顯示;0=不閃爍。進行各項設置時用
- ;(20H)第5位:1=不顯示,0=顯示,數字及冒號閃爍時用,每0.5秒變化一次
- ;(20H)第6位:1=關閉時間顯示,3秒88:88或5秒E1顯示占用;0=正常顯示
- ;(20H)第7位:1=已進入“上電延時導通”的始終導通狀態;0=正常
- ;(21H)第8位:1=禁止響應按鍵動作;0=正常
- ;(21H)第9位:1=允許恢復響應按鍵動作;0=正常
- FWBZ1 EQU 022H ;復位判斷標志1,也作EEPROM數據判斷標志
- FWBZ2 EQU 023H ;復位判斷標志2,也作EEPROM數據判斷標志
- DTS EQU 024H ;導通時間(時),0~99
- DTF EQU 025H ;導通時間(分),0~59
- DTM EQU 026H ;導通時間(秒),0~59
- DTHM EQU 027H ;導通時間,100(0~99)×10毫秒
- XHDS EQU 028H ;循環定時,0=無限循環;1=不循環;2~99=循環次數
- SMMS EQU 029H ;睡眠模式,0=始終顯示;1~59=無操作進入睡眠(分鐘)
- BMQZJ EQU 02AH ;編碼器每轉動一小格的增/減值,1~30分鐘
- SMGLD EQU 02BH ;數碼管亮度,1~8級
- DKS EQU 02CH ;斷開時間(時),0~99
- DKF EQU 02DH ;斷開時間(分),0~59
- DKM EQU 02EH ;斷開時間(秒),0~59
- DKHM EQU 02FH ;斷開時間,100(0~99)×10毫秒
- SDYSS EQU 030H ;上電延時導通(時),0~99
- SDYSF EQU 031H ;上電延時導通(分),0~59
- SDYSM EQU 032H ;上電延時導通(秒),0~59
- YSMS EQU 033H ;延時導通模式,0~2
- YSJS EQU 034H ;在上電延時導通狀態時,按下KEY持續0~99秒結束該狀態
- YSXY EQU 035H ;延時響應,在上電延時導通狀態時,此處為0才響應按鍵動作
- DSSJS EQU 036H ;定時時間,時
- DSSJF EQU 037H ;定時時間,分
- DSSJM EQU 038H ;定時時間,秒
- DSSJHM EQU 039H ;定時時間,毫秒,100(0~99)×10毫秒=1秒
- SMJSF EQU 03AH ;睡眠計時(分)
- SMJSM EQU 03BH ;睡眠計時(秒)
- SMJS EQU 03CH ;睡眠處理計時用
- XHJS EQU 03DH ;循環定時用,導通次數計數
- SHMJS EQU 03EH ;(10)毫秒計數,每10毫秒減1,直到為0
- HMJS EQU 03FH ;(10)毫秒計數2,為0后自動重新放入99
- MJS EQU 040H ;秒計數,每秒減1,直到為0
- DQZT EQU 041H ;當前狀態,0=導通、1=斷開,2=上電延時導通
- XSHC1 EQU 042H ;緩存1,與上次不同就立即顯示,否則0.5秒顯示一次
- XSHC2 EQU 043H ;緩存2,與上次不同就立即顯示,否則0.5秒顯示一次
- XXSZ EQU 044H ;下限數值,進行各項設置時用
- SXSZ EQU 045H ;上限數值,進行各項設置時用
- ZXM1 EQU 046H ;顯示用,待發送到TM1637的字形碼1
- ZXM2 EQU 047H ;顯示用,待發送到TM1637的字形碼2
- ZXM3 EQU 048H ;顯示用,待發送到TM1637的字形碼3
- ZXM4 EQU 049H ;顯示用,待發送到TM1637的字形碼4
- DSZJ EQU 04AH ;加減定時時間使用
- DISPL EQU 04BH ;要顯示的項目
- ;
- ;定義主界面狀態下長按快速加減使能的常數:
- KSJJ EQU 080H ;禁止主界面狀態下長按快速加減
- ;KSJJ EQU 081H ;允許主界面狀態下長按快速加減
- ;當使用按鍵代替編碼器,需要“長按快速加減”功能時,把080H改為081H。
- ;
- ;--------------- 看門狗、EEPROM特殊功能寄存器地址 ---------------
- AUXR EQU 08EH ;輔助寄存器
- WDT_CONTR EQU 0C1H ;看門狗地址
- IAP_DATA EQU 0C2H ;數據寄存器,讀出、寫入的數據放在此處
- IAP_ADDRH EQU 0C3H ;地址寄存器高八位
- IAP_ADDRL EQU 0C4H ;地址寄存器低八位
- IAP_CMD EQU 0C5H ;命令寄存器,0=關閉,1=讀,2=寫,3=擦除
- IAP_TRIG EQU 0C6H ;命令觸發寄存器,每次操作先放入5A再放入A5,命令立即被觸發起動
- IAP_CONTR EQU 0C7H ;控制寄存器,Flash操作允許/禁止及等待時間
- ENABLE_IAP EQU 083H ;定義Flash操作等待時間及允許IAP/ISP/EEPROM操作的常數,時鐘<12MHz時為83H
- ;======================= 程序代碼開址 =======================
- ORG 0000H
- LJMP START
- ORG 000BH ;T0中斷入口
- LJMP T0INT ;T0中斷入口
- ORG 0030H ;程序代碼始址安排在30H
- ;--------------- 定時器0中斷(10毫秒產生一次中斷) ---------------
- T0INT:
- PUSH ACC
- PUSH PSW
- SETB RS1 ;RS1、RS0組合為11,選擇第3組工作寄存器,R0~R7地址為18H~1FH
- SETB RS0 ;退出中斷時恢復默認的工作寄存器(第0組:R0~R7地址為00H~07H)
- LCALL TIME ;處理各項時間、狀態切換
- LCALL DISPLAY ;顯示
- JB 02H,T0INT0 ;如果位地址02H為1(暫停)就轉移,斷開
- JB 07H,T0INT1 ;如果位地址07H為1(始終導通)就轉移,導通
- MOV A,DQZT ;裝入“當前狀態”
- JNZ T0INT0 ;不是0(導通時間)就轉移,斷開
- MOV A,DSSJHM ;是“導通時間”,裝入定時時間(毫秒)到寄存器A
- JNZ T0INT1 ;不是0就轉移,導通
- MOV A,DSSJM ;裝入定時時間(秒)到寄存器A
- JNZ T0INT1 ;不是0就轉移,導通
- MOV A,DSSJF ;裝入定時時間(分)到寄存器A
- JNZ T0INT1 ;不是0就轉移,導通
- MOV A,DSSJS ;裝入定時時間(時)到寄存器A
- JNZ T0INT1 ;不是0就轉移,導通
- T0INT0:
- SETB MOC ;定時時間為0,置MOC為高電平,斷開
- LJMP T0INT2
- T0INT1:
- CLR MOC ;置MOC為低電平,可控硅(或繼電器)導通,通電
- T0INT2:
- POP PSW
- POP ACC
- RETI
- ;--------------- 設置各項默認值(#號后面都為十進制數) ----------------
- SZMRZ:
- MOV DTS,#10 ;導通時長(時),0~99。默認10小時
- MOV DTF,#0 ;導通時長(分),0~59
- MOV DTM,#0 ;導通時長(秒),0~59
- MOV DTHM,#0 ;導通時長,0~99(×10毫秒)
- MOV XHDS,#1 ;循環定時,0=無限循環;1=不循環;2~99=導通次數
- MOV SMMS,#0 ;睡眠模式,0=始終顯示;1~59=無操作進入睡眠(分鐘)
- MOV BMQZJ,#1 ;實時調整時,編碼器每轉動一格的+、-值(分鐘)
- MOV SMGLD,#3 ;數碼管亮度,8級亮度最高
- MOV DKS,#2 ;斷開時長(時),0~99
- MOV DKF,#0 ;斷開時長(分),0~59
- MOV DKM,#0 ;斷開時長(秒),0~59
- MOV DKHM,#0 ;斷開時長,0~99(×10毫秒)
- MOV SDYSS,#0 ;上電延時導通時長(時),0~99
- MOV SDYSF,#0 ;上電延時導通時長(分),0~59
- MOV SDYSM,#0 ;上電延時導通時長(秒),0~59
- MOV YSMS,#0 ;延時導通模式,0~2;
- MOV YSJS,#99 ;結束“上電延時導通”的“按下持續時間”秒計數,0~99
- RET
- ;--------------- 定時器T0設置(10毫秒產生一次中斷) ----------------
- SETINT: ;10毫秒@11.0592MHz
- ANL AUXR,#7FH ;定時器時鐘12T模式
- ANL TMOD,#0F0H ;設置定時器模式
- MOV TL0,#000H ;設置定時初值
- MOV TH0,#0DCH ;設置定時初值
- CLR TF0 ;清除TF0標志
- SETB TR0 ;定時器0開始計時
- SETB ET0 ;允許定時器0中斷
- SETB EA ;允許全局中斷
- RET
- ;---- 啟動看門狗及喂狗,11.0592MHz預分頻數=2(71.1毫秒),00111000B(38H) ----
- WG:
- MOV WDT_CONTR,#00111000B
- RET
- ;*********************************** 主程序開始 ***********************************
- START:
- MOV SP,#050H ;設置堆棧指針
- MOV A,FWBZ1 ;檢查復位判斷標志,不相同就是初次上電,從初始化開始運行
- CJNE A,#0C8H,START0 ;檢查復位判斷標志,不相同就是初次上電,從初始化開始運行
- MOV A,FWBZ2 ;檢查復位判斷標志,不相同就是初次上電,從初始化開始運行
- CJNE A,#0D9H,START0 ;檢查復位判斷標志,不相同就是初次上電,從初始化開始運行
- LCALL SETINT ;相同,定時器設置(10毫秒產生一次中斷)
- LJMP START2 ;相同,跳過初始化繼續運行
- START0:
- CLR A ;初始化,RAM從20H開始清零30H個字節
- MOV R0,#30H ;初始化,RAM從20H開始清零30H個字節
- MOV R1,#20H ;初始化,RAM從20H開始清零30H個字節
- START1:
- MOV @R1,A ;初始化,RAM從20H開始清零30H個字節
- INC R1 ;初始化,RAM從20H開始清零30H個字節
- DJNZ R0,START1 ;初始化,RAM從20H開始清零30H個字節
- MOV FWBZ1,#0C8H ;初始化,放入復位判斷標志1到RAM
- MOV FWBZ2,#0D9H ;初始化,放入復位判斷標志2到RAM
- MOV YSXY,#0FFH ;初始化,放入結束“上電延時導通”的延時響應時間,4.2分鐘
- LCALL SETINT ;初始化,定時器設置(10毫秒產生一次中斷)
- LCALL REEP ;初始化,讀EEPROM保存的各項設置,沒有就設為默認值并保存
- START2:
- CLR 06H ;位地址06H置為0,正常顯示
- MOV DISPL,#0 ;設置要顯示的目標,0=顯示定時時間
- LCALL SKEY ;掃描KEY
- JC START3 ;有按鍵動作(C=1)就轉移
- LCALL Scan1 ;掃描編碼器(有方向標志)
- JNB 00H,START2 ;如果位地址00H為0(編碼器沒有轉動)就轉移
- LCALL BMQCL ;調用編碼器動作處理子程序
- LJMP START2
- START3:
- LCALL AJDZCL ;調用按鍵動作處理子程序
- LJMP START2
- ;*********************************** 主程序結束 ***********************************
- ;
- ;----------------------------------------------------------------------------------------
- ;子程序:編碼器動作處理,實時調整定時時間
- ;如果是用按鍵代替編碼器,支持長按快速加減(需要把“長按快速加減使能常數”由080H改為081H)。
- ;----------------------------------------------------------------------------------------
- BMQCL:
- MOV A,#KSJJ ;裝入“長按快速加減使能常數”
- CJNE A,#081H,BMQCL5 ;如果不是“支持長按快速加減”就轉移
- MOV SHMJS,#50 ;設置有效長按所需時長,50×10毫秒=500毫秒
- BMQCL1:
- MOV A,SHMJS ;裝入(10)毫秒計數
- JZ BMQCL2 ;如果時長達到(為0)就轉移
- LCALL Scan2 ;掃描編碼器(無方向標志)
- JB 00H,BMQCL1 ;動作未結束就轉移
- LCALL DSSJZJ ;動作結束,根據方向加/減定時時間
- RET
- BMQCL2:
- LCALL DSSJZJ ;根據方向加/減定時時間
- MOV SHMJS,#13 ;加/減間隔時間,(×10)毫秒
- BMQCL3:
- MOV A,SHMJS ;裝入(10)毫秒計數
- JNZ BMQCL4 ;時間未到(不為0)就轉移
- LJMP BMQCL2 ;已達到設定的時長,轉移,根據方向加/減定時時間
- BMQCL4:
- LCALL DELAY10 ;延時10毫秒
- LCALL Scan2 ;掃描編碼器(無方向標志)
- JB 00H,BMQCL3 ;動作未結束就轉移
- LCALL DELAY10 ;延時10毫秒
- LCALL Scan2 ;第2次掃描編碼器(無方向標志)
- JB 00H,BMQCL3 ;動作未結束就轉移
- LCALL DELAY10 ;延時10毫秒
- LCALL Scan2 ;第3次掃描編碼器(無方向標志)
- JB 00H,BMQCL3 ;動作未結束就轉移
- RET ;動作結束,退出
- BMQCL5:
- MOV MJS,#10 ;設置等待時間(秒)
- BMQCL6:
- LCALL Scan2 ;掃描編碼器(無方向標志)
- JB 00H,BMQCL7 ;如果還沒轉到卡點位置就轉移
- LCALL DSSJZJ ;已經旋轉到卡點位置,根據旋轉方向增/減定時時間
- RET
- BMQCL7:
- MOV A,MJS ;裝入秒計數到寄存器A
- CJNE A,#7,BMQCL6 ;檢查剩余時間,如果不是7(10秒-3秒=7)就轉移,繼續掃描
- SETB 06H ;達到3秒了,把位地址06H設置為1,數碼管顯示“--:--”
- MOV ZXM1,#0C0H ;-
- MOV ZXM2,#0C0H ;-
- MOV ZXM3,#0C0H ;-
- MOV ZXM4,#0C0H ;-
- LCALL DISP ;顯示“--:--”
- BMQCL8:
- LCALL Scan2 ;掃描編碼器(無方向標志)
- MOV A,MJS ;裝入秒計數到寄存器A
- JZ BMQCL9 ;如果秒計數為0(達到10秒)就轉移
- JB 00H,BMQCL8 ;如果還沒轉到卡點位置就轉移,繼續掃描
- MOV SMJSF,#0FFH ;已經旋轉到卡點位置,先放入一個數值,等退出后才恢復睡眠計時
- LCALL TZGXSZ ;調用“調整各項設置”子程序
- MOV SMJSF,SMMS ;睡眠模式
- MOV SMJSM,#0
- RET
- BMQCL9:
- MOV ZXM1,#0FFH ;達到了10秒,顯示3秒88:88
- MOV ZXM2,#0FFH ;8
- MOV ZXM3,#0FFH ;8
- MOV ZXM4,#0FFH ;8
- LCALL DISP ;顯示
- MOV MJS,#3 ;顯示3秒
- BMQCL10:
- MOV A,MJS ;裝入秒計數到寄存器A
- LCALL WG ;喂狗
- JNZ BMQCL10 ;等待MJS變為0秒
- LCALL SZMRZ ;延時時間到,恢復各項默認設置
- LCALL WSET ;保存設置
- BMQCL11:
- LCALL Scan2 ;掃描編碼器(無方向標志)
- JB 00H,BMQCL11 ;如果還沒轉到卡點位置就繼續掃描
- LCALL REEPR ;把“導通時間”放入“定時時間”,從“導通”開始運行。
- CLR 02H ;位地址02H置為0(正常運行)
- MOV MJS,#2 ;延時2秒才退出
- BMQCL12:
- MOV A,MJS ;裝入秒計數到寄存器A
- LCALL WG ;喂狗
- JNZ BMQCL12
- RET
- ;-------------------------------------------------------------------------------------
- ;子程序:根據編碼器旋轉方向加減定時時間
- ;3小時及以下,按設置的值加減:1~30分鐘
- ;3小時以上每次增(減)30分鐘;10小時以上每次增(減)1個小時;20小時以上每次增(減)2個小時
- ;-------------------------------------------------------------------------------------
- DSSJZJ:
- MOV DSSJM,#0 ;放入0到定時時間(秒)
- MOV DSSJHM,#99
- CLR 05H
- MOV A,DSSJS ;裝入定時時間(時)
- CJNE A,#20,DSZJ1 ;當前“時”是否等于或大于20
- DSZJ1:
- JC DSZJ2 ;小于就轉移
- MOV DSZJ,#2 ;等于或大于20,加減2個小時
- LJMP DSZJ4
- DSZJ2:
- CJNE A,#10,DSZJ3 ;當前“時”是否等于或大于10
- DSZJ3:
- JC DSZJ8 ;小于就轉移
- MOV DSZJ,#1 ;等于或大于10,加減1個小時
- DSZJ4:
- JNB 01H,DSZJ6 ;如果位地址01H為0(逆時針反轉)就轉移
- ADD A,DSZJ ;是正轉,加
- CJNE A,#100,DSZJ5 ;加完后是否等于或大于100
- DSZJ5:
- JC DSZJ7 ;如果小于就轉移,把A放回到DSSJS
- MOV DSSJS,#99 ;已經大于99了,直接設置為99:59:59+DSSJHM(1秒),100小時
- MOV DSSJF,#59 ;已經大于99了,直接設置為99:59:59+DSSJHM(1秒),100小時
- MOV DSSJM,#59 ;已經大于99了,直接設置為99:59:59+DSSJHM(1秒),100小時
- RET
- DSZJ6:
- SUBB A,DSZJ ;是反轉,減
- DSZJ7:
- MOV DSSJS,A ;把計算結果放入DSSJS
- RET
- DSZJ8:
- MOV DSZJ,BMQZJ ;把設置的“增(減)值”放入DSZJ
- CJNE A,#3,DSZJ11 ;當前“時”不是3就轉移
- JB 01H,DSZJ12 ;是3,如果位地址01H為1(正轉)就轉移,把DSZJ處的“增(減)值”改為30(分鐘)
- MOV A,DSSJF ;是反轉,裝入定時時間(分)
- JZ DSZJ13 ;如果當前“分”為0(3:00)就轉移,按設置的增(減)值減
- CJNE A,#30,DSZJ9 ;“分”不為0,是否等于或大于30
- DSZJ9:
- JC DSZJ10 ;小于就轉移,把0放入定時時間(分),使時間變為3:00
- SUBB A,#30 ;等于或大于,減30分
- MOV DSSJF,A ;把計算結果放入定時時間(分)
- RET
- DSZJ10:
- MOV DSSJF,#0 ;小于30,把0放入定時時間(分),使時間變為3:00
- RET
- DSZJ11:
- JC DSZJ13 ;小于3就轉移
- DSZJ12:
- MOV DSZJ,#30 ;大于3:00,把DSZJ處的“增(減)值”改為30(分鐘)
- DSZJ13:
- MOV A,DSSJF ;裝入定時時間(分)
- JNB 01H,DSZJ17 ;如果位地址01H為0(逆時針反轉)就轉移
- ADD A,DSZJ ;是正轉,當前“分”直接加DSZJ處的“增(減)值”
- CJNE A,#60,DSZJ14 ;加完后“分”是否等于或大于60
- DSZJ14:
- JC DSZJ15 ;小于60就轉移,把A放入定時時間(分)
- SUBB A,#60 ;等于或大于60,就減60,然后小時加1
- MOV DSSJF,A ;把A放入定時時間(分)
- MOV A,DSSJS ;裝入“時”
- INC A ;小時加1
- MOV DSSJS,A
- CJNE A,#3,DSZJ16 ;加完后“時”不是3就轉移,退出
- CLR A ;加完后大于3:00了,把0放入定時時間(分),使時間變為3:00
- DSZJ15:
- MOV DSSJF,A
- DSZJ16: RET
- DSZJ17:
- CJNE A,DSZJ,DSZJ18 ;是逆時針反轉,當前“分”是否等于或大于DSZJ處的“增(減)值”
- DSZJ18:
- JC DSZJ19 ;小于就轉移
- SUBB A,DSZJ ;等于或大于,定時時間(分)減“增(減)值”
- MOV DSSJF,A ;把計算結果放入定時時間(分)
- RET
- DSZJ19:
- MOV A,DSZJ ;“分”小于“增(減)值”,裝入DSZJ處的“增(減)值”
- CLR C ;進位標志清0
- SUBB A,DSSJF ;“增(減)值”減“定時時間(分)”
- MOV DSSJF,A ;減完后的結果暫時放入DSSJF
- MOV A,#60
- SUBB A,DSSJF ;60減上面的計算結果,得出定時時間(分),然后小時減1
- MOV DSSJF,A ;得出的數放入定時時間(分)
- MOV A,DSSJS ;裝入定時時間(時)
- JZ DSSJQL ;如果“時”為0就轉移
- DEC DSSJS ;“時”不為0,減1
- RET
- DSSJQL:
- MOV DSSJF,#0 ;把“分”置為0
- MOV DSSJHM,#0
- RET
- ;-------------------------------------------------------------------------------------
- ;子程序:按鍵動作處理
- ;短按1次暫停計時;短按2次當前項時間(當次)清零;短按3次重新啟動,相當于重新上電。
- ;長按3秒顯示“--:--”時釋放,進入“設置”;長按10秒,恢復默認設置,顯示88:88。
- ;
- ;啟用“上電延時導通”,“延時導通模式”為2時,上電4.2分鐘內按鍵失效,4.2分鐘之后
- ;按鍵只有時間清零功能,持續按下按鍵的時間達到設置的時長(0~99秒)就清零,清零后
- ;繼續執行下一項,執行到“導通”狀態運行結束時,按鍵功能恢復正常。
- ;-------------------------------------------------------------------------------------
- AJDZCL:
- JB 08H,JSYSDT2 ;位地址08H為1就轉移,不響應按鍵動作。
- MOV A,DQZT ;裝入“當前狀態”,0=導通、1=斷開,2=上電延時導通
- CJNE A,#2,KEY0 ;不是“上電延時導通”狀態就轉移
- MOV A,YSMS ;裝入“延時導通模式”
- CJNE A,#2,KEY0 ;不是2(延時時間到后從“斷開”繼續運行)就轉移
- MOV A,YSXY ;裝入“延時響應”
- JNZ JSYSDT2 ;延時響應時間未到就轉移退出
- MOV MJS,YSJS ;把設置的“按下持續時間”秒計數放入MJS
- JSYSDT1:
- MOV A,MJS
- JNZ JSYSDT3 ;等待秒計數為0
- MOV DSSJS,A ;持續按下的時間到,定時時間(時)清零
- MOV DSSJF,A ;持續按下的時間到,定時時間(分)清零
- MOV DSSJM,A ;持續按下的時間到,定時時間(秒)清零
- MOV DSSJHM,A ;持續按下的時間到,定時時間(毫秒)清零
- LCALL KEYEX ;等待按鍵釋放
- SETB 08H ;位地址08H置為1,不響應按鍵動作。
- JSYSDT2:
- RET
- JSYSDT3:
- LCALL SKEY0
- JC JSYSDT1 ;如果C=1(按鍵還沒釋放),就繼續掃描等待
- RET
- KEY0:
- MOV MJS,#10 ;放入等待時間,10秒
- KEY1:
- MOV A,MJS ;裝入等待時間
- CJNE A,#7,KEY5 ;按下未達到3秒(10-3=7)就轉移
- SETB 06H ;到3秒了,把位地址06H設置為1,數碼管顯示“--:--”
- MOV ZXM1,#0C0H ;-
- MOV ZXM2,#0C0H ;-
- MOV ZXM3,#0C0H ;-
- MOV ZXM4,#0C0H ;-
- LCALL DISP ;顯示“--:--”
- KEY2:
- MOV A,MJS ;裝入等待時間
- JZ KEY3 ;如果為0(長按達到了10秒)就轉移
- LCALL SKEY ;掃描按鍵
- JC KEY2 ;如果C=1(按鍵還沒釋放),就繼續掃描
- MOV SMJSF,#0FFH ;先放入一個數值,等退出后才恢復睡眠計時
- LCALL TZGXSZ ;調用“調整各項設置”子程序
- MOV SMJSF,SMMS ;睡眠模式
- MOV SMJSM,#0 ;
- RET
- KEY3:
- MOV ZXM1,#0FFH ;達到了10秒,顯示3秒88:88
- MOV ZXM2,#0FFH ;8
- MOV ZXM3,#0FFH ;8
- MOV ZXM4,#0FFH ;8
- LCALL DISP ;顯示
- MOV MJS,#3 ;顯示3秒
- KEY4:
- MOV A,MJS ;顯示3秒
- LCALL WG ;喂狗
- JNZ KEY4 ;等待MJS為0秒
- LCALL SZMRZ ;延時時間到,恢復各項默認設置
- LCALL WSET ;保存設置
- LCALL KEYEX ;等待按鍵釋放
- LCALL REEPR ;把“導通時間”放入“定時時間”,從“導通”開始運行。
- CLR 02H ;位地址02H置為0(正常運行)
- RET
- KEY5:
- LCALL SKEY ;掃描按鍵
- JC KEY1 ;如果C=1(按鍵還沒釋放),就繼續掃描
- MOV A,DSSJHM ;裝入定時時間(毫秒)到寄存器A
- JNZ KEY6 ;不是0就轉移
- MOV A,DSSJM ;裝入定時時間(秒)到寄存器A
- JNZ KEY6 ;不是0就轉移
- MOV A,DSSJF ;裝入定時時間(分)到寄存器A
- JNZ KEY6 ;不是0就轉移
- MOV A,DSSJS ;裝入定時時間(時)到寄存器A
- JNZ KEY6 ;不是0就轉移
- CLR 02H ;定時時間為0,位地址02H置為0(正常)
- LJMP KEY7
- KEY6:
- CPL 02H ;位地址02H取反,暫停/正常切換
- KEY7:
- LCALL KEYA ;第1次按鍵釋放了,再次掃描按鍵500毫秒
- JZ KEY8 ;如果500毫秒內有按鍵動作就轉移
- RET
- KEY8:
- LCALL KEYEX ;有按鍵動作,等待第2次按鍵釋放
- LCALL KEYA ;按鍵釋放了,掃描按鍵500毫秒
- JZ KEY9 ;如果500毫秒內有按鍵動作就轉移
- MOV DSSJS,#0 ;沒有按鍵動作,按了2次,把當前時間清零
- MOV DSSJF,#0 ;把當前時間清零
- MOV DSSJM,#0 ;把當前時間清零
- MOV DSSJHM,#0 ;把當前時間清零
- CLR 02H ;位地址02H置為0(正常)
- RET
- KEY9:
- LCALL KEYEX ;等待第3次按鍵釋放
- CLR EA ;關閉全局中斷
- INC FWBZ1 ;加1,改變復位判斷標志1
- LJMP START ;跳轉到START,重新初始化
- ;------------------------------------------------------------------
- ;子程序:調整各項設置值
- ;短按2次KEY保存并退出,或在最后一項無操作自動保存退出。
- ;閃爍5秒無操作或者短按KEY釋放0.5秒后,跳到下一項設置。
- ;按住KEY不放,旋轉編碼器可向上/下跳到任意一項設置
- ;如果是用按鍵代替編碼器,支持長按快速加/減
- ;------------------------------------------------------------------
- TZGXSZ:
- CLR 06H ;位地址06H置為0,正常顯示
- MOV DISPL,#1 ;第一項,導通時間(時),0~99小時
- SZTZ:
- MOV MJS,#7 ;放入無操作等待時間(秒)到MJS
- CLR 03H ;位地址03H置為0,允許檢查剩余時間
- SZTZ1:
- LCALL SKEY0 ;掃描按鍵
- JNC SZTZ7 ;沒有按鍵動作(C=0)就轉移
- CLR 04H ;已經按下,把位地址04H置為0,不閃爍顯示
- SZTZ2:
- LCALL Scan10 ;掃描編碼器(有方向標志)
- JB 00H,SZTZ4 ;如果編碼器有旋轉動作(位地址00H為1)就轉移
- LCALL SKEY0 ;掃描按鍵
- JC SZTZ2 ;按鍵未釋放(C=1)就轉移
- LCALL KEYA ;釋放了,再次掃描按鍵500毫秒
- JNZ SZTZ3 ;沒有第2次按鍵動作就轉移
- LCALL WSET ;已經第2次按下,保存設置
- LCALL KEYEX ;等待按鍵釋放
- RET
- SZTZ3:
- SETB 01H ;把位地址01H置為1,順時針正轉(切換到下一項)
- LCALL QHXM ;根據位地址01H的方向,切換到上/下一項
- LJMP SZTZ
- SZTZ4:
- LCALL QHXM ;根據位地址01H的方向,切換到上/下一項
- SZTZ5:
- LCALL Scan20 ;掃描編碼器(無方向標志)
- JB 00H,SZTZ5 ;編碼器動作未結束就繼續掃描,等待
- SZTZ6:
- LCALL SKEY0 ;掃描按鍵
- JNC SZTZ ;按鍵釋放(C=0)就轉移
- LCALL Scan10 ;掃描編碼器(有方向標志)
- JB 00H,SZTZ4 ;編碼器有動作(位地址00H為1)就轉移,切換到上/下一項
- LJMP SZTZ6
- SZTZ7:
- LCALL Scan10 ;掃描編碼器(有方向標志)
- JB 00H,SZTZ9 ;如果編碼器有旋轉動作(位地址00H為1)就轉移
- MOV A,MJS ;沒有轉動,裝入秒計數到寄存器A
- JZ SZTZ8 ;如果秒計數為0(等待時間到)就轉移
- JB 03H,SZTZ1 ;不為0,如果位地址03H為1就轉移,不檢查剩余時間
- CJNE A,#5,SZTZ1 ;檢查剩余時間,不到就轉移,繼續掃描編碼器
- SETB 04H ;把位地址04H置為1,設置為閃爍顯示
- SETB 03H ;位地址03H置為1,禁止檢查剩余時間
- LJMP SZTZ1
- SZTZ8:
- CLR 04H ;等待時間到,把位地址04H置為0,不閃爍顯示
- MOV A,DISPL ;裝入當前目標項
- CJNE A,#17,SZTZ3 ;不是最后一項就轉移,跳到下一項
- LCALL WSET ;保存設置
- RET
- SZTZ9:
- CLR 04H ;編碼器已經轉動,把位地址04H置為0,不閃爍顯示
- MOV SHMJS,#50 ;設置有效長按所需時長,50×10毫秒=500毫秒
- SZTZ10:
- MOV A,SHMJS ;裝入(10)毫秒計數
- JZ SZTZ11 ;如果時長達到(為0)就轉移
- LCALL Scan20 ;掃描編碼器(無方向標志)
- JB 00H,SZTZ10 ;動作未結束就轉移,繼續掃描
- LCALL MBSZ ;動作結束了,調整DISPL指向的對象,加/減1
- LJMP SZTZ
- SZTZ11:
- LCALL MBSZ ;加/減1。已經為有效長按,下面進入長按快速加/減
- MOV SHMJS,#13 ;間隔加/減時間,(×10)毫秒
- SZTZ12:
- MOV A,SHMJS ;裝入(10)毫秒計數
- JNZ SZTZ13 ;時間未到(不為0)就轉移
- LJMP SZTZ11 ;已達到設定的間隔時長,轉移,加/減1
- SZTZ13:
- LCALL DELAY10 ;延時10毫秒
- LCALL Scan20 ;掃描編碼器(無方向標志)
- JB 00H,SZTZ12 ;動作未結束就轉移
- LCALL DELAY10 ;延時10毫秒
- LCALL Scan20 ;第2次掃描編碼器(無方向標志)
- JB 00H,SZTZ12 ;動作未結束就轉移
- LCALL DELAY10 ;延時10毫秒
- LCALL Scan20 ;第3次掃描編碼器(無方向標志)
- JB 00H,SZTZ12 ;動作未結束就轉移
- LJMP SZTZ ;動作結束
- MBSZ:
- MOV A,DISPL ;裝入要調整的目標項
- LCALL SXXFW ;設置上下限限值
- DEC A ;減1
- ADD A,#DTS ;加上各項設置的起始地址
- MOV R0,A ;把得出的目標項地址放入R0
- JB 01H,MBSZ2 ;如果位地址01H為1(順時針正轉)就轉移
- INC XXSZ ;是反轉,下限值先加1
- MOV A,@R0 ;裝入R0指向的目標數值
- CJNE A,XXSZ,MBSZ0 ;與加1后的下限值比較
- MBSZ0:
- JC MBSZ1 ;如果小于“下限值+1”(不夠減)就轉移
- DEC @R0 ;等于或大于下限值,目標數值減1
- DEC XXSZ ;減1,恢復下限值
- RET
- MBSZ1:
- DEC XXSZ ;減1,恢復下限值
- MOV @R0,XXSZ ;不夠減了,直接放入下限值
- RET
- MBSZ2:
- MOV A,@R0 ;是正轉,裝入R0指向的RAM地址的目標數值
- INC A ;加1
- CJNE A,SXSZ,MBSZ3 ;加完后與上限數值比較
- MBSZ3:
- JC MBSZ4 ;如果小于就轉移
- MOV @R0,SXSZ ;等于或大于上限值,直接放入上限值
- RET
- MBSZ4:
- MOV @R0,A ;小于上限值,把計算結果放回去
- RET
- ;-------------------------------------------------------------------------
- ;子程序:切換項目。根據位地址01H的方向標志,把當前設置項切換到上/下一項
- ;-------------------------------------------------------------------------
- QHXM:
- MOV A,DISPL ;裝入當前項目號
- JB 01H,QHXM2 ;如果位地址01H為1(正轉)就轉移,切換到下一項
- CJNE A,#1,QHXM1 ;是反轉,如果不是1就轉移
- MOV DISPL,#17 ;切換到上一項17
- RET
- QHXM1:
- DEC DISPL ;減1,切換到上一項
- RET
- QHXM2:
- CJNE A,#17,QHXM3 ;是正轉,如果不是17就轉移
- MOV DISPL,#1 ;切換到下一項1
- RET
- QHXM3:
- INC DISPL ;加1,切換到下一項
- RET
- ;-------------------------------------------------------------------------
- ;子程序:根據當前項目號設置加/減調整的上下限值。入口參數:A=項目號。
- ;-------------------------------------------------------------------------
- SXXFW:
- CJNE A,#1,SXXFW1 ;1=顯示“1A”設置導通時間(時),0~99小時
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#99 ;上限為99
- RET
- SXXFW1:
- CJNE A,#2,SXXFW2 ;2=顯示“1b”設置導通時間(分),0~59分鐘
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#59 ;上限為59
- RET
- SXXFW2:
- CJNE A,#3,SXXFW3 ;3=顯示“1C”設置導通時間(秒),0~59秒
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#59 ;上限為59
- RET
- SXXFW3:
- CJNE A,#4,SXXFW4 ;4=顯示“1d”設置導通時間(×10毫秒),0~99
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#99 ;上限為99
- RET
- SXXFW4:
- CJNE A,#5,SXXFW5 ;5=顯示“o-”設置循環定時,0~99
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#99 ;上限為99
- RET
- SXXFW5:
- CJNE A,#6,SXXFW6 ;6=顯示“C-”設置睡眠模式,0~59
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#59 ;上限為59
- RET
- SXXFW6:
- CJNE A,#7,SXXFW7 ;7=顯示“bC”設置實時調整時的增/減值(步長):1~30分鐘
- MOV XXSZ,#1 ;下限為1
- MOV SXSZ,#30 ;上限為30
- RET
- SXXFW7:
- CJNE A,#8,SXXFW8 ;8=顯示“Ld”設置數碼管亮度,1~8級。
- MOV XXSZ,#1 ;下限為1
- MOV SXSZ,#8 ;上限為8
- RET
- SXXFW8:
- CJNE A,#9,SXXFW9 ;9=顯示“2A”設置斷開時間(時),0~99小時
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#99 ;上限為99
- RET
- SXXFW9:
- CJNE A,#10,SXXFW10 ;10=顯示“2b”設置斷開時間(分),0~59分鐘
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#59 ;上限為59
- RET
- SXXFW10:
- CJNE A,#11,SXXFW11 ;11=顯示“2C”設置斷開時間(秒),0~59秒
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#59 ;上限為59
- RET
- SXXFW11:
- CJNE A,#12,SXXFW12 ;12=顯示“2d”設置斷開時間(×10毫秒),0~99
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#99 ;上限為99
- RET
- SXXFW12:
- CJNE A,#13,SXXFW13 ;13=顯示“3A”設置上電延時導通(時),0~99小時
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#99 ;上限為99
- RET
- SXXFW13:
- CJNE A,#14,SXXFW14 ;14=顯示“3b”設置上電延時導通(分),0~59分鐘
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#59 ;上限為59
- RET
- SXXFW14:
- CJNE A,#15,SXXFW15 ;15=顯示“3C”設置上電延時導通(秒),0~59秒
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#59 ;上限為59
- RET
- SXXFW15:
- CJNE A,#16,SXXFW16 ;16=顯示“d-”設置延時導通模式,0~2。默認為0
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#2 ;上限為2
- RET
- SXXFW16: ;17=顯示“E-”設置“持續按下時間”秒計數0~99
- MOV XXSZ,#0 ;下限為0
- MOV SXSZ,#99 ;上限為99
- RET
- ;----------------------------------------------------------------------------------------
- ;子程序:掃描編碼器是否有旋轉動作并設置好方向標志
- ;出口參數:位地址第00位=1已經轉動,=0沒有轉動;位地址第01位=1順時針正轉,=0逆時針反轉
- ;----------------------------------------------------------------------------------------
- Scan1:
- LCALL Scan10 ;掃描編碼器
- JNB 00H,Scan1E ;如果沒有旋轉動作就轉移退出
- LCALL SMCL ;有旋轉動作,調用睡眠處理子程序
- JZ Scan1E ;如果是0(從睡眠狀態喚醒)就轉移,下次才退出“始終導通”狀態
- LCALL TCSZDT ;退出上電延時導通的“始終導通”狀態
- Scan1E: RET
- Scan10:
- LCALL WG ;喂狗
- SETB EC11A ;拉高編碼器A引腳電平
- SETB EC11B ;拉高編碼器B引腳電平
- JNB EC11A,Scan11 ;如果為0(低電平)就轉移,編碼器有旋轉動作,順時針正轉
- JNB EC11B,Scan12 ;如果為0(低電平)就轉移,編碼器有旋轉動作,逆時針反轉
- CLR 00H ;沒有旋轉動作,把位地址00H置為0
- RET
- Scan11:
- SETB 01H ;順時針正轉,把位地址01H置為1
- SETB 00H ;有旋轉動作,把位地址00H置為1
- RET
- Scan12:
- CLR 01H ;逆時針反轉,把位地址01H置為0
- SETB 00H ;有旋轉動作,把位地址00H置為1
- Scan13: RET
- ;-----------------------------------------------------------
- ;子程序:掃描編碼器是否有旋轉動作,不設置方向標志
- ;出口參數:位地址第0位=1已經轉動,=0沒有轉動
- ;-----------------------------------------------------------
- Scan2:
- LCALL Scan20 ;掃描編碼器
- JNB 00H,Scan2E ;如果沒有旋轉動作就轉移退出
- LCALL SMCL ;有旋轉動作,調用睡眠處理子程序
- JZ Scan2E ;如果是0(從睡眠狀態喚醒)就轉移,下次才退出“始終導通”狀態
- LCALL TCSZDT ;退出上電延時導通的“始終導通”狀態
- Scan2E: RET
- Scan20:
- LCALL WG ;喂狗
- SETB EC11A ;拉高編碼器A引腳電平
- SETB EC11B ;拉高編碼器B引腳電平
- JNB EC11A,Scan21 ;如果為0(低電平)就轉移,編碼器有旋轉動作
- JNB EC11B,Scan21 ;如果為0(低電平)就轉移,編碼器有旋轉動作
- CLR 00H ;沒有旋轉動作,把位地址00H置為0
- RET
- Scan21:
- SETB 00H ;有旋轉動作,把位地址00H置為1
- Scan22: RET
- ;-----------------------------------------------------------
- ;子程序:掃描按鍵,未按C=0,已按下C=1
- ;-----------------------------------------------------------
- SKEY:
- LCALL SKEY0 ;掃描按鍵
- JNC SKEYE ;如果沒有按鍵動作(C為0)就轉移退出
- LCALL SMCL ;有按鍵動作,調用睡眠處理子程序
- JZ SKEYE ;如果是0(從睡眠狀態喚醒)就轉移,下次才退出“始終導通”狀態
- LCALL TCSZDT ;退出上電延時導通的“始終導通”狀態
- SKEYE: RET
- SKEY0:
- LCALL WG ;喂狗
- SETB KEY ;按鍵端口置為高電平
- JNB KEY,SKEY1 ;為0(低電平)就轉移,表示按鍵已經被按下
- CLR C ;C置為0,沒有按鍵動作
- RET
- SKEY1:
- LCALL DELAY10 ;延時10毫秒
- LCALL DELAY10 ;延時10毫秒
- SETB KEY ;延時結束后再次把按鍵端口置為高電平
- JNB KEY,SKEY2 ;為0(低電平,按鍵被有效按下)就轉移
- CLR C ;C置為0,沒有按鍵動作
- RET ;按鍵未被有效按下,退出
- SKEY2:
- SETB C ;C置為1,按鍵已有效按下
- RET
- ;------------------ 掃描按鍵500毫秒,有按鍵動作A=0,無按鍵動作A=1 ------------------
- KEYA:
- MOV SHMJS,#50 ;等待500毫秒
- KEYB:
- MOV A,SHMJS ;裝入(10)毫秒計數
- JZ KEYC ;為0(時間到)就轉移
- LCALL SKEY0 ;掃描按鍵
- JNC KEYB ;沒有按鍵動作(C=0)就轉移
- CLR A ;有按鍵動作A=0
- RET
- KEYC:
- MOV A,#1 ;等待時間已到,A=1沒有按鍵動作
- RET
- ;------------------ 等待按鍵釋放 ------------------
- KEYEX:
- LCALL SKEY0 ;掃描按鍵
- JC KEYEX ;如果C=1(按鍵還沒釋放)就繼續掃描
- RET
- ;------------------ 延時10毫秒 ------------------
- DELAY10: ;@11.0592MHz
- NOP
- NOP
- NOP
- PUSH 16H
- PUSH 17H
- MOV 16H,#87
- MOV 17H,#10
- NEXT:
- DJNZ 17H,NEXT
- DJNZ 16H,NEXT
- POP 17H
- POP 16H
- RET
- ;-----------------------------------------------------------------------------------
- ;子程序:睡眠模式處理,如果當前處于睡眠狀態就重新放入睡眠倒計時,恢復顯示,等待
- ;編碼器或按鍵動作結束并延時2秒才退出;如果不是睡眠狀態,重新放入睡眠計時,返回
- ;出口參數:A=0從睡眠狀態喚醒
- ;-----------------------------------------------------------------------------------
- SMCL:
- MOV A,SMMS ;裝入睡眠模式設置值
- JNZ SMCL1 ;不為0就轉移
- INC A ;為0,加1,使返回時A不為0
- RET ;當前睡眠模式為“始終顯示”,返回
- SMCL1:
- MOV A,SMJSF ;裝入睡眠計時(分)
- JNZ SMCL2 ;不為0就轉移
- MOV A,SMJSM ;裝入睡眠計時(秒)
- JZ SMCL3 ;是0就轉移
- SMCL2:
- MOV SMJSF,SMMS ;不為0,還沒進入睡眠狀態,重新放入倒計時
- MOV SMJSM,#0 ;不為0,還沒進入睡眠狀態,重新放入倒計時
- RET
- SMCL3:
- MOV SMJSF,SMMS ;已進入睡眠狀態,重新放入倒計時,喚醒睡眠,恢復顯示
- MOV SMJSM,#0 ;已進入睡眠狀態,重新放入倒計時,喚醒睡眠,恢復顯示
- INC XSHC1 ;改變XSHC1數據,觸發“立即顯示”
- SMCL4:
- MOV SMJS,#2 ;放入秒計時
- SMCL5:
- LCALL WG ;喂狗
- SETB KEY ;按鍵端口置為高電平
- SETB EC11A ;編碼器A引腳置為高電平
- SETB EC11B ;編碼器B引腳置為高電平
- JNB KEY,SMCL4 ;為0(低電平)未釋放就轉移
- JNB EC11A,SMCL4 ;為0(低電平)未釋放就轉移
- JNB EC11B,SMCL4 ;為0(低電平)未釋放就轉移
- MOV A,SMJS ;裝入計時
- JNZ SMCL5 ;不為0就轉移繼續掃描按鍵和編碼器
- CLR C ;C置為0,沒有按鍵動作
- CLR 00H ;把位地址00H置為0,沒有旋轉動作
- RET
- ;-------------------------------------------------------------------------------------
- ;子程序:退出始終導通狀態處理。當進入“延時時間到后始終導通”狀態時,按鍵、編碼器有
- ;動作就退出始終導通狀態,切換到“導通時間”的結束(斷開)狀態,如設置為循環定時,就轉
- ;換到“斷開時間”繼續運行。
- ;-------------------------------------------------------------------------------------
- TCSZDT:
- JB 07H,TC1 ;如果為1(已進入“上電延時導通”的始終導通狀態)就轉移
- RET
- TC1:
- MOV A,XHDS ;裝入“循環定時”設置
- CJNE A,#1,TC2 ;不是1(不循環)就轉移
- MOV DQZT,#0 ;把當前狀態切換到“導通”
- CLR 07H ;位地址07H置為0(正常)
- LCALL SMCL4 ;等待編碼器或按鍵動作結束后延時2秒才退出
- RET
- TC2:
- MOV DQZT,#1 ;把當前狀態設為1,從“斷開時間”繼續運行
- MOV DSSJS,DKS ;裝入“斷開時間”
- MOV DSSJF,DKF ;裝入“斷開時間”
- MOV DSSJM,DKM ;裝入“斷開時間”
- MOV DSSJHM,DKHM ;裝入“斷開時間”
- CLR 07H ;位地址07H置為0(正常)
- LCALL SMCL4 ;等待編碼器或按鍵動作結束后延時2秒才退出
- RET
- ;------------------------------------------------------------------------
- ;子程序:T0中斷調用,時間計數及倒計時處理、狀態切換
- ;------------------------------------------------------------------------
- TIME:
- LCALL TIME6 ;部分時間計數及倒計時處理
- JB 02H,TIME1 ;如果位地址02H為1(暫停)就轉移退出,停止計時
- MOV A,DSSJHM ;裝入定時時間(10)毫秒計數
- JZ TIME2 ;如果是0就轉移
- DEC A ;DSSJHM不是0,減1
- MOV DSSJHM,A ;DSSJHM不是0,減1
- JNZ TIME1 ;減1后不為0就轉移退出
- MOV A,DSSJM ;裝入定時時間(秒)到寄存器A
- JNZ TIME1 ;如果(秒)不是0就轉移退出
- MOV A,DSSJF ;裝入定時時間(分)到寄存器A
- JNZ TIME1 ;如果(分)不是0就轉移退出
- MOV A,DSSJS ;裝入定時時間(時)到寄存器A
- JNZ TIME1 ;如果(時)不是0就轉移退出
- LCALL ZTQH ;時、分、秒都是0了,狀態切換
- TIME1: RET
- TIME2:
- MOV A,DSSJM ;裝入定時時間(秒)到寄存器A
- JZ TIME3 ;如果是0就轉移
- DEC DSSJM ;不是0,減1秒
- MOV DSSJHM,#99 ;重新放入(10)毫秒計數值
- MOV HMJS,#99 ;重新放入(10)毫秒計數值,使DSSJHM與HMJS同步
- RET
- TIME3:
- MOV A,DSSJF ;裝入定時時間(分)到寄存器A
- JZ TIME4 ;如果是0就轉移
- DEC DSSJF ;不是0,減1分
- MOV DSSJM,#59 ;把59放入定時時間(秒)
- MOV DSSJHM,#99 ;重新放入(10)毫秒計數值
- MOV HMJS,#99 ;重新放入(10)毫秒計數值
- RET
- TIME4:
- MOV A,DSSJS ;裝入定時時間(時)到寄存器A
- JNZ TIME5 ;不是0就轉移
- LCALL ZTQH ;狀態切換
- RET
- TIME5:
- DEC DSSJS ;不是0,小時減1
- MOV DSSJM,#59 ;把59放入定時時間(秒)
- MOV DSSJF,#59 ;把59放入定時時間(分)
- MOV DSSJHM,#99 ;重新放入(10)毫秒計數值
- MOV HMJS,#99 ;重新放入(10)毫秒計數值
- RET
- TIME6:
- MOV A,SHMJS ;裝入(10)毫秒計數
- JZ TIME7 ;如果是0就轉移
- DEC SHMJS ;每10毫秒減1,直到為0
- TIME7:
- MOV A,HMJS ;裝入(10)毫秒計數2
- JZ TIME9 ;如果是0就轉移
- DEC HMJS ;不是0,減1
- CJNE A,#50,TIME8 ;如果不是50就轉移退出
- SETB 05H ;位地址第05位置為1,數字及冒號閃爍時用,每0.5秒變化一次
- TIME8: RET
- TIME9:
- CLR 05H ;位地址第05位置為0,數字及冒號閃爍時用,每0.5秒變化一次
- MOV HMJS,#99 ;重新放入計數值(1秒)
- MOV A,MJS ;裝入秒計數
- JZ TIME10 ;如果是0就轉移
- DEC MJS ;每秒減1,直到為0
- TIME10:
- MOV A,YSXY ;裝入“延時響應”秒計數
- JZ TIME11 ;如果是0就轉移
- DEC YSXY ;每秒減1,直到為0
- TIME11:
- JNB 09H,TIME12 ;位地址09H不為1(允許恢復響應按鍵動作)就轉移
- JNB 08H,TIME12 ;位地址08H不為1(禁止響應按鍵動作)就轉移
- SETB KEY ;按鍵端口置為高電平
- JNB KEY,TIME12 ;為0(低電平,按鍵為按下狀態)就轉移
- CLR 08H ;位地址08H置為0(恢復響應按鍵動作)
- CLR 09H ;位地址09H置為0(正常)
- TIME12:
- MOV A,SMJS ;裝入睡眠模式處理計時
- JZ TIME13 ;如果是0就轉移
- DEC SMJS ;不是0,減1秒
- TIME13:
- MOV A,SMJSM ;裝入睡眠倒計時(秒)
- JZ TIME14 ;如果是0就轉移
- DEC SMJSM ;(秒)減1
- RET
- TIME14:
- MOV A,SMJSF ;裝入睡眠倒計時(分)
- JNZ TIME15 ;如果不是0就轉移
- RET
- TIME15:
- DEC SMJSF ;(分)減1
- MOV SMJSM,#59 ;放入59(秒)
- RET
- ZTQH:
- MOV A,DQZT ;裝入“當前狀態”,0=導通、1=斷開,2=上電延時導通
- CJNE A,#2,ZTQH2 ;不是“上電延時導通”狀態就轉移
- MOV A,YSMS ;裝入延時導通模式
- JNZ ZTQH0 ;如果不是0(延時時間到后始終導通)就轉移
- SETB 07H ;位地址07H置為1,始終導通
- RET
- ZTQH0:
- CJNE A,#1,ZTQH6 ;不是1(從“導通時間”繼續運行)就轉移,從“斷開時間”繼續運行
- ZTQH1:
- MOV DQZT,#0 ;切換到“導通時間”狀態
- MOV DSSJS,DTS ;把“導通時間”放入“定時時間”
- MOV DSSJF,DTF ;把“導通時間”放入“定時時間”
- MOV DSSJM,DTM ;把“導通時間”放入“定時時間”
- MOV DSSJHM,DTHM ;把“導通時間”放入“定時時間”
- RET
- ZTQH2:
- CLR 07H ;位地址07H置為0(正常)
- JNZ ZTQH1 ;是1(斷開時間)狀態就轉移,切換到“導通時間”狀態
- MOV A,XHDS ;是“導通時間”狀態,裝入循環模式
- SETB 09H ;位地址09H置為1(允許恢復響應按鍵動作)
- CJNE A,#1,ZTQH3 ;不是1(不循環)就轉移,0=無限循環;1=不循環;2~99=導通次數
- RET ;是不循環,退出
- ZTQH3:
- JZ ZTQH5 ;是0(無限循環)就轉移
- MOV A,XHJS ;裝入導通次數計數
- DEC A ;檢查導通次數是否已到,不到就轉移
- JNZ ZTQH4 ;檢查導通次數是否已到,不到就轉移
- RET
- ZTQH4:
- DEC XHJS ;導通次數減1
- ZTQH5:
- MOV A,DKS ;
- JNZ ZTQH7 ;檢查“斷開時間”不為0才切換到“斷開時間”
- MOV A,DKF ;
- JNZ ZTQH7 ;檢查“斷開時間”不為0才切換到“斷開時間”
- MOV A,DKM ;
- JNZ ZTQH7 ;檢查“斷開時間”不為0才切換到“斷開時間”
- MOV A,DKHM ;
- JNZ ZTQH7 ;檢查“斷開時間”不為0才切換到“斷開時間”
- RET
- ZTQH6:
- SETB 08H ;位地址08H置為1,不響應按鍵動作。
- ZTQH7:
- MOV DQZT,#1 ;切換到“斷開時間”狀態
- MOV DSSJS,DKS ;把“斷開時間”放入“定時時間”
- MOV DSSJF,DKF ;把“斷開時間”放入“定時時間”
- MOV DSSJM,DKM ;把“斷開時間”放入“定時時間”
- MOV DSSJHM,DKHM ;把“斷開時間”放入“定時時間”
- RET
- ;-----------------------------------------------------------------------
- ;子程序:T0中斷調用,顯示定時時間及各項設置的內容
- ;-----------------------------------------------------------------------
- DISPLAY:
- JB 06H,DPYSZ1 ;如果位地址06H為1就轉移退出,主程序顯示88:88或E1
- MOV A,DISPL ;裝入要顯示的目標(項目號)
- JZ DISPL0 ;如果是0(顯示定時時間)就轉移
- MOV B,#2
- MUL AB ;項目號乘2
- DEC A
- DEC A ;把計算結果減2
- PUSH ACC ;寄存器A的內容壓入堆棧
- MOV DPTR,#SEGTAB2 ;字形碼首址
- MOVC A,@A+DPTR ;查表獲取字形碼
- MOV ZXM1,A ;項目字形碼放到待發送TM1637區1
- POP ACC ;彈出上面壓入堆棧的內容到寄存器A
- INC A ;地址加1
- MOVC A,@A+DPTR ;查表獲取字形碼
- MOV ZXM2,A ;項目字形碼放到待發送TM1637區2
- MOV A,DISPL ;裝入項目號
- DEC A ;減1
- ADD A,#DTS ;加各項設置值始址,得出設置項目的實際地址
- MOV R1,A ;地址放入R1
- MOV A,@R1 ;裝入設置值
- MOV B,A ;放進寄存器B
- CJNE A,XSHC1,DPYSZ3 ;當前設置值與顯示緩存1不相同就轉移,立即顯示
- MOV A,HMJS ;相同,裝入(10)毫秒計數2
- CJNE A,#99,DPYSZ2 ;不是99就轉移,每0.5秒顯示一次
- LJMP DPYSZ3 ;是,顯示
- DPYSZ1: RET
- DPYSZ2:
- CJNE A,#49,DPYSZ1 ;不是49就轉移退出,每0.5秒顯示一次
- DPYSZ3:
- MOV XSHC1,B ;當前設置值放入顯示緩存1
- MOV A,B ;當前設置值放入A寄存器
- MOV R0,#ZXM3 ;待發送TM1637區3地址
- LCALL BCD ;轉換并獲取字形碼放到待發送TM1637區3和4
- JNB 04H,DPYSZ4 ;如果位地址04H為0(不閃爍)就轉移
- JNB 05H,DPYSZ4 ;為1,閃爍顯示,如果位地址05H為0(顯示)就轉移
- MOV ZXM3,#0 ;處于閃爍顯示中的“不顯示”狀態,放入消隱碼
- MOV ZXM4,#0 ;處于閃爍顯示中的“不顯示”狀態,放入消隱碼
- DPYSZ4:
- LCALL disp ;發送4個字節數據到TM1637顯示
- RET
- DISPL0:
- MOV R1,#DSSJS ;把定時時間“時”的地址放入R1
- MOV A,@R1 ;裝入“時”
- JZ DISPL1 ;如果“時”為0就轉移
- LJMP DISPL3
- DISPL1:
- CLR 05H ;“時”為0,把位地址05H置為0,始終顯示冒號
- INC R1 ;地址加1,指向“分”
- MOV A,@R1 ;裝入“分”
- JZ DISPL2 ;如果“分”為0就轉移
- LJMP DISPL3
- DISPL2:
- INC R1 ;地址加1,指向“秒”
- MOV A,@R1 ;裝入“秒”
- DISPL3:
- CJNE A,XSHC1,DISPL6 ;寄存器A的數據與顯示緩存1不相同就轉移,立即顯示
- INC R1 ;地址加1
- MOV A,@R1 ;裝入
- DEC R1 ;地址減1
- CJNE A,XSHC2,DISPL6 ;寄存器A的數據與顯示緩存2不相同就轉移,立即顯示
- MOV A,HMJS ;都相同,裝入(10)毫秒時間計數2
- CJNE A,#99,DISPL5 ;不是99就轉移
- LJMP DISPL6 ;是,顯示(每0.5秒顯示一次)
- DISPL4: RET
- DISPL5:
- CJNE A,#49,DISPL4 ;不是49就轉移退出,每0.5秒顯示一次
- DISPL6:
- INC R1 ;地址加1
- MOV A,@R1 ;裝入后面一位時間
- MOV XSHC2,A ;放入緩存2
- DEC R1 ;地址減1
- MOV A,@R1 ;裝入前面一位時間
- MOV XSHC1,A ;放入緩存1
- MOV R0,#ZXM1 ;待發送TM1637區1地址
- LCALL BCD ;轉換并獲取字形碼放到待發送TM1637區1、2
- INC R1 ;地址加1
- MOV R0,#ZXM3 ;待發送TM1637區3地址
- MOV A,@R1 ;裝入后面一位時間
- LCALL BCD ;轉換并獲取字形碼放到待發送TM1637區3、4
- JB 02H,DISPL7 ;如果02H為1(暫停)就轉移,始終顯示冒號
- JB 05H,DISPL8 ;如果05H為1就轉移,不顯示冒號
- DISPL7:
- ORL ZXM2,#10000000B ;把最高位置為1(最高位為1就顯示冒號)
- DISPL8:
- LCALL disp ;發送4個字節數據到TM1637顯示
- RET
- BCD:
- MOV B,#10 ;轉換為BCD碼
- DIV AB ;轉換為BCD碼
- MOV DPTR,#SEGTAB ;查表獲取字形碼
- MOVC A,@A+DPTR ;查表獲取字形碼
- MOV @R0,A ;字形碼放入待發送TM1637區
- XCH A,B ;A、B寄存器內容交換
- MOVC A,@A+DPTR ;查表獲取字形碼
- INC R0 ;地址加1
- MOV @R0,A ;字形碼放入待發送TM1637區
- RET
- ;------------------ 發送4個字節數據到TM1637顯示,地址自動加1 ------------------
- disp:
- MOV A,SMMS ;裝入設置的睡眠模式
- JZ disp0 ;如果為0(始終顯示)就轉移
- MOV A,SMJSF ;裝入睡眠計時(分)
- JNZ disp0 ;不為0(未進入睡眠狀態)就轉移
- MOV A,SMJSM ;裝入睡眠計時(秒)
- JNZ disp0 ;不為0(未進入睡眠狀態)就轉移
- CLR A ;已進入睡眠狀態,放入消隱碼(0)
- MOV ZXM1,A ;放入消隱碼
- MOV ZXM2,A ;放入消隱碼
- MOV ZXM3,A ;放入消隱碼
- MOV ZXM4,A ;放入消隱碼
- disp0:
- LCALL Srt
- MOV A,#040H ;數據命令設置40H:地址自動加1,寫數據到顯示寄存器
- LCALL Writebyte ;發送一個字節
- LCALL Stop
- NOP
- LCALL Srt
- MOV A,#0C0H ;地址命令設置C0H:初始地址為00H
- LCALL Writebyte ;發送一個字節
- MOV R6,#4 ;發送4個字節數據
- MOV R1,#ZXM1 ;等待發送的字形碼始址
- disp1:
- MOV A,@R1 ;裝入要發送的字形碼
- LCALL Writebyte ;發送一個字節
- INC R1 ;地址加1
- DJNZ R6,disp1 ;如果還未發送完就繼續
- LCALL Stop
- LCALL Srt
- MOV A,SMGLD ;裝入設置的數碼管亮度(1~8)
- ADD A,#087H ;加上87H后即為對應的亮度控制命令88H~8FH
- LCALL Writebyte ;按設置的亮度開顯示
- LCALL Stop
- RET
- ;------------------ 發送8bit(一個字節)數據到TM1637,A=要發送的數據,從低位開始 ------------------
- Writebyte:
- MOV R7,#8 ;發送8位數據
- WBY1:
- CLR CLK ;拉低CLK
- JNB ACC.0,WBY2 ;A寄存器的低位(0位)如果為0就轉移
- SETB DIO ;為1,拉高DIO
- SJMP WBY3
- WBY2:
- CLR DIO ;為0,拉低DIO
- WBY3:
- MOV R4,#13 ;延時
- WBY4:
- DJNZ R4,WBY4 ;延時
- SETB CLK ;拉高CLK
- CLR C ;進位標志清0
- RRC A ;A寄存器內容帶進位循環右移
- DJNZ R7,WBY1 ;如果還未發送完8bit數據就繼續
- CLR CLK ;8位數據發送完了
- MOV R7,#20 ;設置等待應答信號延時計數
- WBY5:
- JNB DIO,WBY6 ;判斷TM1637發過來的ACK應答信號,應答就轉移(0,低電平)
- DJNZ R7,WBY5 ;
- WBY6:
- MOV R4,#13 ;延時
- WBY7:
- DJNZ R4,WBY7 ;延時
- SETB CLK
- MOV R4,#13 ;延時
- WBY8:
- DJNZ R4,WBY8 ;延時
- RET
- ;------------------ Start子程序 ------------------
- Srt:
- SETB DIO ;拉高DIO
- SETB CLK ;拉高CLK
- MOV R4,#13 ;延時
- SrtY1:
- DJNZ R4,SrtY1 ;延時
- SETB DIO ;拉高DIO
- MOV R4,#13 ;延時
- SrtY2:
- DJNZ R4,SrtY2 ;延時
- CLR DIO ;拉低DIO
- MOV R4,#13 ;延時
- SrtY3:
- DJNZ R4,SrtY3 ;延時
- CLR CLK ;拉低CLK
- RET
- ;------------------ Stop子程序 ------------------
- Stop:
- CLR CLK
- MOV R4,#30
- StopY1:
- DJNZ R4,StopY1
- CLR DIO
- MOV R4,#30
- StopY2:
- DJNZ R4,StopY2
- SETB CLK
- MOV R4,#40
- StopY3:
- DJNZ R4,StopY3
- SETB DIO
- MOV R4,#30
- StopY4:
- DJNZ R4,StopY4
- CLR CLK
- CLR DIO
- RET
- ;********************** 以下為EEPROM操作子程序 **********************
- ;STC15F104W有1K字節的EEPROM,共2個扇區,第1扇區:0000H~01FFH;第2扇區:0200H~03FFH
- ;-------------------------------------------
- ;讀一字節,A=讀出的數據
- Byte_Read:
- MOV IAP_CONTR,#ENABLE_IAP ;打開IAP功能,設置Flash操作等待時間(83H)
- MOV IAP_CMD,#01 ;設置為IAP/ISP/EEPROM字節讀模式命令(1)
- MOV IAP_TRIG,#05AH ;先送5AH
- MOV IAP_TRIG,#0A5H ;再送A5H,ISP/IAP命令立即被觸發起動
- NOP
- MOV A,IAP_DATA ;讀出的數據在IAP_DATA單元中,送入累加器A
- RET
- ;-------------------------------------------
- ;字節編程,A=需寫入的數據
- Byte_Program:
- MOV IAP_CONTR,#ENABLE_IAP ;打開IAP功能,設置Flash操作等待時間(83H)
- MOV IAP_CMD,#02 ;設置為IAP/ISP/EEPROM字節編程模式命令(2)
- MOV IAP_DATA,A ;要編程的數據先送進IAP_DATA寄存器
- MOV IAP_TRIG,#05AH ;先送5AH
- MOV IAP_TRIG,#0A5H ;再送A5H,ISP/IAP命令立即被觸發起動
- RET
- ;-------------------------------------------
- ;擦除扇區
- Sector_Erase:
- MOV IAP_CONTR,#ENABLE_IAP ;打開IAP功能,設置Flash操作等待時間(83H)
- MOV IAP_CMD,#03 ;設置為IAP/ISP/EEPROM扇區擦除模式命令(3)
- MOV IAP_TRIG,#05AH ;先送5AH
- MOV IAP_TRIG,#0A5H ;再送A5H,ISP/IAP命令立即被觸發起動
- NOP
- RET
- ;---------- 讀EEPROM保存的各項設置,如果沒有就設置為默認值并保存 ------------
- REEP:
- LCALL RE00 ;讀EEPROM保存的各項設置
- MOV XHJS,XHDS ;循環定時
- MOV SMJSF,SMMS ;睡眠模式
- MOV A,SDYSS ;裝入上電延時導通(時)
- JNZ REYS ;不是0就轉移
- MOV A,SDYSF ;裝入上電延時導通(分)
- JNZ REYS ;不是0就轉移
- MOV A,SDYSM ;裝入上電延時導通(秒)
- JZ REEPR ;都為0就轉移
- REYS:
- MOV DSSJS,SDYSS ;把“上電延時導通”時間放入“定時時間”
- MOV DSSJF,SDYSF ;把“上電延時導通”時間放入“定時時間”
- MOV DSSJM,SDYSM ;把“上電延時導通”時間放入“定時時間”
- MOV DSSJHM,#0
- MOV DQZT,#2 ;設置當前狀態,0=導通、1=斷開,2=上電延時導通
- RET
- REEPR:
- MOV DSSJS,DTS ;把“導通時間”放入“定時時間”
- MOV DSSJF,DTF ;把“導通時間”放入“定時時間”
- MOV DSSJM,DTM ;把“導通時間”放入“定時時間”
- MOV DSSJHM,DTHM ;把“導通時間”放入“定時時間”
- MOV DQZT,#0 ;設置當前狀態,0=導通、1=斷開,2=上電延時導通
- RET
- RE00:
- MOV IAP_ADDRH,#00H ;從第一個扇區開始搜索,地址的高8位
- RE01:
- MOV IAP_ADDRL,#00H ;從第一個扇區開始搜索,地址的低8位
- LCALL Byte_Read ;讀第一個字節,返回:A=讀出的數據
- CJNE A,FWBZ1,RE03 ;是否保存在當前扇區,不是就轉移到RE03
- INC IAP_ADDRL ;EEPROM字節地址增1
- LCALL Byte_Read ;讀第二個字節
- CJNE A,FWBZ2,RE03 ;第二個字節是否相符
- MOV R1,#FWBZ2 ;相符,從FWBZ2+1處開始放置讀出的設置值
- MOV R2,#17 ;再讀出17個字節
- RE02:
- INC R1 ;RAM地址增1
- INC IAP_ADDRL ;EEPROM字節地址增1
- LCALL Byte_Read ;讀一個字節,返回:A=讀出的數據
- MOV @R1,A ;放到R1指向的RAM地址
- DJNZ R2,RE02 ;未讀完就繼續
- RET ;讀完了,退出
- RE03:
- MOV A,IAP_ADDRH ;裝入扇區地址的高8位
- ADD A,#2 ;扇區增1
- MOV IAP_ADDRH,A ;放入IAP_ADDRH
- CJNE A,#04H,RE01 ;如果未搜索完最后一個扇區+2(02H+2=04H)就轉移,繼續搜索
- LCALL SZMRZ ;已經搜索全部扇區,未找到保存的內容,設置為默認值
- MOV R0,#2 ;總扇區數量,共2個扇區
- LJMP WSET3 ;跳轉到WSET3保存設置
- ;------------------ 保存設置,不固定保存到某個扇區,各扇區輪流使用 ------------------
- WSET:
- MOV R0,#2 ;扇區總數量,共2個扇區
- MOV IAP_ADDRH,#00H ;從第一個扇區開始搜索上次保存的設置
- WSET1:
- MOV IAP_ADDRL,#00H ;地址低位指向第一個字節
- LCALL Byte_Read ;讀第一個字節,返回:A=讀出的數據
- CJNE A,FWBZ1,WSET7 ;如果與EEPROM數據判斷標志1不相同就轉移
- INC IAP_ADDRL ;第一個字節相同,EEPROM字節地址增1
- LCALL Byte_Read ;讀第二個字節
- CJNE A,FWBZ2,WSET7 ;如果與EEPROM數據判斷標志2不相同就轉移
- MOV IAP_ADDRL,#0 ;是在當前扇區,地址指向扇區第一個字節
- LCALL Sector_Erase ;擦除當前扇區,另換一個扇區保存
- WSET2:
- MOV A,IAP_ADDRH ;裝入扇區地址高位到寄存器A
- CJNE A,#00H,WSET3 ;當前扇區地址高位如果不是00H(第一個扇區)就轉移
- MOV IAP_ADDRH,#04H ;是00H,把IAP_ADDRH設置為最后一個扇區+2(02H+2=04H)
- WSET3:
- DEC IAP_ADDRH ;減1
- DEC IAP_ADDRH ;再減1,指向上一個扇區首址
- MOV IAP_ADDRL,#0 ;低8位指向扇區第一個字節
- LCALL Sector_Erase ;擦除整個扇區
- MOV R1,#FWBZ1 ;要保存的內容始址
- MOV R2,#19 ;共19個字節
- WSET4:
- MOV A,@R1 ;裝入R1指向的RAM地址的內容到A
- LCALL Byte_Program ;字節編程(寫入EEPROM)
- INC IAP_ADDRL ;EEPROM地址加1
- INC R1 ;RAM地址增1
- DJNZ R2,WSET4 ;未保存完就繼續
- MOV IAP_ADDRL,#0 ;保存完了,扇區地址低位指向0(當前扇區首址)
- LCALL Byte_Read ;讀出來檢查看是否寫入成功
- CJNE A,FWBZ1,WSET5 ;如果與EEPROM數據判斷標志1不相同就轉移
- INC IAP_ADDRL ;EEPROM地址加1
- LCALL Byte_Read ;讀第二個字節
- CJNE A,FWBZ2,WSET5 ;如果與EEPROM數據判斷標志2不相同就轉移
- RET ;成功了,退出
- WSET5:
- DJNZ R0,WSET2 ;如果未試完全部扇區就轉移到WSET2繼續往前一個扇區寫
- SETB 06H ;已經試完全部扇區,都失敗了,位地址06H置為1
- MOV MJS,#5 ;顯示5秒E1
- MOV ZXM1,#0 ;消隱碼
- MOV ZXM2,#079H ;E
- MOV ZXM3,#006H ;1
- MOV ZXM4,#0 ;消隱碼
- LCALL DISP ;顯示
- WSET6:
- MOV A,MJS
- LCALL WG ;喂狗
- JNZ WSET6 ;等待MJS為0秒
- CLR 06H ;顯示結束,位地址06H置為0
- RET
- WSET7:
- MOV A,IAP_ADDRH ;裝入扇區地址高位
- ADD A,#2 ;加2,指向下一個扇區首址
- MOV IAP_ADDRH,A ;放回IAP_ADDRH
- CJNE A,#04H,WSET1 ;如果未到最后一個扇區地址高位+2(02H+2=04H)就轉移到WSET1繼續搜索
- LJMP WSET3 ;已經搜索完所有扇區,未找到上次保存的數據,跳轉到WSET3保存當前設置
- ;**************************** 以上為EEPROM操作子程序 ****************************
- ;------------------ 字形表 ------------------
- SEGTAB:
- DB 00111111B ;0(3FH)
- DB 00000110B ;1(06H)
- DB 01011011B ;2(5BH)
- DB 01001111B ;3(4FH)
- DB 01100110B ;4(66H)
- DB 01101101B ;5(6DH)
- DB 01111101B ;6(7DH)
- DB 00000111B ;7(07H)
- DB 01111111B ;8(7FH)
- DB 01101111B ;9(6FH)
- SEGTAB2:
- DB 00000110B,01110111B ;1A(06H,77H)
- DB 00000110B,01111100B ;1b(06H,7CH)
- DB 00000110B,00111001B ;1C(06H,39H)
- DB 00000110B,01011110B ;1d(06H,5EH)
- DB 01011100B,01000000B ;o-(5CH,40H)
- DB 00111001B,01000000B ;C-(39H,40H)
- DB 01111100B,00111001B ;bC(7CH,39H)
- DB 00111000B,01011110B ;Ld(38H,5EH)
- DB 01011011B,01110111B ;2A(5BH,77H)
- DB 01011011B,01111100B ;2b(5BH,7CH)
- DB 01011011B,00111001B ;2C(5BH,39H)
- DB 01011011B,01011110B ;2d(5BH,5EH)
- DB 01001111B,01110111B ;3A(4FH,77H)
- DB 01001111B,01111100B ;3b(4FH,7CH)
- DB 01001111B,00111001B ;3C(4FH,39H)
- DB 01011110B,01000000B ;d-(5EH,40H)
- DB 01111001B,01000000B ;E-(79H,40H)
- ;------------------------------------------------------------------------------------------
- END
復制代碼 壓縮文件的內容:
壓縮文件的內容.png (11.16 KB, 下載次數: 65)
下載附件
2021-1-18 23:05 上傳
全部資料51hei下載地址:
用STC15F104W制作定時IC.rar
(4.65 MB, 下載次數: 141)
2021-1-18 23:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|