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