找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8128|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

用STC15F104W單片機(jī)制作定時(shí)IC源碼,適用于各種需延時(shí)通斷、循環(huán)通斷的控制場(chǎng)合

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 楊小強(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ǎo)通時(shí)間”和“斷開(kāi)時(shí)間”設(shè)為最小值1(10毫秒),“循環(huán)定時(shí)”設(shè)為“無(wú)限循環(huán)”的情況,P3.0的輸出為50Hz方波。

下面是源程序:
  1.     ;----------------------------- 端口定義 ------------------------------------
  2.             MOC      EQU  P3.0   ;5腳,導(dǎo)通狀態(tài)輸出低電平;斷開(kāi)狀態(tài)輸出高電平
  3.             KEY      EQU  P3.1   ;6腳,按鍵KEY
  4.             EC11A    EQU  P3.2   ;7腳,接編碼器的A引腳
  5.             EC11B    EQU  P3.3   ;8腳,接編碼器的B引腳
  6.             DIO      EQU  P3.4   ;1腳,接顯示模塊TM1637的DIO
  7.             CLK      EQU  P3.5   ;3腳,接顯示模塊TM1637的CLK

  8.     ;---------------------------- 位地址及RAM的使用 ----------------------------
  9.     ;(20H)第0位:1=編碼器有旋轉(zhuǎn)動(dòng)作;0=沒(méi)有旋轉(zhuǎn)動(dòng)作
  10.     ;(20H)第1位:1=編碼器順時(shí)針正轉(zhuǎn);0=編碼器逆時(shí)針?lè)崔D(zhuǎn)
  11.     ;(20H)第2位:1=暫停;0=正常運(yùn)行
  12.     ;(20H)第3位:1=禁止;0=允許。進(jìn)行各項(xiàng)設(shè)置時(shí)使用,允許/禁止檢查剩余時(shí)間
  13.     ;(20H)第4位:1=閃爍顯示;0=不閃爍。進(jìn)行各項(xiàng)設(shè)置時(shí)用
  14.     ;(20H)第5位:1=不顯示,0=顯示,數(shù)字及冒號(hào)閃爍時(shí)用,每0.5秒變化一次
  15.     ;(20H)第6位:1=關(guān)閉時(shí)間顯示,3秒88:88或5秒E1顯示占用;0=正常顯示
  16.     ;(20H)第7位:1=已進(jìn)入“上電延時(shí)導(dǎo)通”的始終導(dǎo)通狀態(tài);0=正常
  17.     ;(21H)第8位:1=禁止響應(yīng)按鍵動(dòng)作;0=正常
  18.     ;(21H)第9位:1=允許恢復(fù)響應(yīng)按鍵動(dòng)作;0=正常

  19.     FWBZ1    EQU   022H     ;復(fù)位判斷標(biāo)志1,也作EEPROM數(shù)據(jù)判斷標(biāo)志
  20.     FWBZ2    EQU   023H     ;復(fù)位判斷標(biāo)志2,也作EEPROM數(shù)據(jù)判斷標(biāo)志
  21.     DTS      EQU   024H     ;導(dǎo)通時(shí)間(時(shí)),0~99
  22.     DTF      EQU   025H     ;導(dǎo)通時(shí)間(分),0~59
  23.     DTM      EQU   026H     ;導(dǎo)通時(shí)間(秒),0~59
  24.     DTHM     EQU   027H     ;導(dǎo)通時(shí)間,100(0~99)×10毫秒
  25.     XHDS     EQU   028H     ;循環(huán)定時(shí),0=無(wú)限循環(huán);1=不循環(huán);2~99=循環(huán)次數(shù)
  26.     SMMS     EQU   029H     ;睡眠模式,0=始終顯示;1~59=無(wú)操作進(jìn)入睡眠(分鐘)
  27.     BMQZJ    EQU   02AH     ;編碼器每轉(zhuǎn)動(dòng)一小格的增/減值,1~30分鐘
  28.     SMGLD    EQU   02BH     ;數(shù)碼管亮度,1~8級(jí)
  29.     DKS      EQU   02CH     ;斷開(kāi)時(shí)間(時(shí)),0~99
  30.     DKF      EQU   02DH     ;斷開(kāi)時(shí)間(分),0~59
  31.     DKM      EQU   02EH     ;斷開(kāi)時(shí)間(秒),0~59
  32.     DKHM     EQU   02FH     ;斷開(kāi)時(shí)間,100(0~99)×10毫秒
  33.     SDYSS    EQU   030H     ;上電延時(shí)導(dǎo)通(時(shí)),0~99
  34.     SDYSF    EQU   031H     ;上電延時(shí)導(dǎo)通(分),0~59
  35.     SDYSM    EQU   032H     ;上電延時(shí)導(dǎo)通(秒),0~59
  36.     YSMS     EQU   033H     ;延時(shí)導(dǎo)通模式,0~2
  37.     YSJS     EQU   034H     ;在上電延時(shí)導(dǎo)通狀態(tài)時(shí),按下KEY持續(xù)0~99秒結(jié)束該狀態(tài)
  38.     YSXY     EQU   035H     ;延時(shí)響應(yīng),在上電延時(shí)導(dǎo)通狀態(tài)時(shí),此處為0才響應(yīng)按鍵動(dòng)作
  39.     DSSJS    EQU   036H     ;定時(shí)時(shí)間,時(shí)
  40.     DSSJF    EQU   037H     ;定時(shí)時(shí)間,分
  41.     DSSJM    EQU   038H     ;定時(shí)時(shí)間,秒
  42.     DSSJHM   EQU   039H     ;定時(shí)時(shí)間,毫秒,100(0~99)×10毫秒=1秒
  43.     SMJSF    EQU   03AH     ;睡眠計(jì)時(shí)(分)
  44.     SMJSM    EQU   03BH     ;睡眠計(jì)時(shí)(秒)
  45.     SMJS     EQU   03CH     ;睡眠處理計(jì)時(shí)用
  46.     XHJS     EQU   03DH     ;循環(huán)定時(shí)用,導(dǎo)通次數(shù)計(jì)數(shù)
  47.     SHMJS    EQU   03EH     ;(10)毫秒計(jì)數(shù),每10毫秒減1,直到為0
  48.     HMJS     EQU   03FH     ;(10)毫秒計(jì)數(shù)2,為0后自動(dòng)重新放入99
  49.     MJS      EQU   040H     ;秒計(jì)數(shù),每秒減1,直到為0
  50.     DQZT     EQU   041H     ;當(dāng)前狀態(tài),0=導(dǎo)通、1=斷開(kāi),2=上電延時(shí)導(dǎo)通
  51.     XSHC1    EQU   042H     ;緩存1,與上次不同就立即顯示,否則0.5秒顯示一次
  52.     XSHC2    EQU   043H     ;緩存2,與上次不同就立即顯示,否則0.5秒顯示一次
  53.     XXSZ     EQU   044H     ;下限數(shù)值,進(jìn)行各項(xiàng)設(shè)置時(shí)用
  54.     SXSZ     EQU   045H     ;上限數(shù)值,進(jìn)行各項(xiàng)設(shè)置時(shí)用
  55.     ZXM1     EQU   046H     ;顯示用,待發(fā)送到TM1637的字形碼1
  56.     ZXM2     EQU   047H     ;顯示用,待發(fā)送到TM1637的字形碼2
  57.     ZXM3     EQU   048H     ;顯示用,待發(fā)送到TM1637的字形碼3
  58.     ZXM4     EQU   049H     ;顯示用,待發(fā)送到TM1637的字形碼4
  59.     DSZJ     EQU   04AH     ;加減定時(shí)時(shí)間使用
  60.     DISPL    EQU   04BH     ;要顯示的項(xiàng)目
  61.     ;
  62.     ;定義主界面狀態(tài)下長(zhǎng)按快速加減使能的常數(shù):
  63.     KSJJ        EQU        080H     ;禁止主界面狀態(tài)下長(zhǎng)按快速加減
  64.     ;KSJJ        EQU        081H    ;允許主界面狀態(tài)下長(zhǎng)按快速加減
  65.     ;當(dāng)使用按鍵代替編碼器,需要“長(zhǎng)按快速加減”功能時(shí),把080H改為081H。
  66.     ;
  67.     ;--------------- 看門(mén)狗、EEPROM特殊功能寄存器地址 ---------------
  68.     AUXR          EQU   08EH   ;輔助寄存器
  69.     WDT_CONTR     EQU   0C1H   ;看門(mén)狗地址
  70.     IAP_DATA      EQU   0C2H   ;數(shù)據(jù)寄存器,讀出、寫(xiě)入的數(shù)據(jù)放在此處
  71.     IAP_ADDRH     EQU   0C3H   ;地址寄存器高八位
  72.     IAP_ADDRL     EQU   0C4H   ;地址寄存器低八位
  73.     IAP_CMD       EQU   0C5H   ;命令寄存器,0=關(guān)閉,1=讀,2=寫(xiě),3=擦除
  74.     IAP_TRIG      EQU   0C6H   ;命令觸發(fā)寄存器,每次操作先放入5A再放入A5,命令立即被觸發(fā)起動(dòng)
  75.     IAP_CONTR     EQU   0C7H   ;控制寄存器,F(xiàn)lash操作允許/禁止及等待時(shí)間
  76.     ENABLE_IAP    EQU   083H   ;定義Flash操作等待時(shí)間及允許IAP/ISP/EEPROM操作的常數(shù),時(shí)鐘<12MHz時(shí)為83H

  77.     ;======================= 程序代碼開(kāi)址 =======================
  78.             ORG    0000H
  79.             LJMP   START

  80.             ORG    000BH         ;T0中斷入口
  81.             LJMP   T0INT         ;T0中斷入口

  82.             ORG    0030H         ;程序代碼始址安排在30H

  83.     ;--------------- 定時(shí)器0中斷(10毫秒產(chǎn)生一次中斷) ---------------
  84.     T0INT:
  85.             PUSH  ACC
  86.             PUSH  PSW
  87.             SETB  RS1          ;RS1、RS0組合為11,選擇第3組工作寄存器,R0~R7地址為18H~1FH
  88.             SETB  RS0          ;退出中斷時(shí)恢復(fù)默認(rèn)的工作寄存器(第0組:R0~R7地址為00H~07H)
  89.             LCALL TIME         ;處理各項(xiàng)時(shí)間、狀態(tài)切換
  90.             LCALL DISPLAY      ;顯示
  91.             JB    02H,T0INT0   ;如果位地址02H為1(暫停)就轉(zhuǎn)移,斷開(kāi)
  92.             JB    07H,T0INT1   ;如果位地址07H為1(始終導(dǎo)通)就轉(zhuǎn)移,導(dǎo)通
  93.             MOV   A,DQZT       ;裝入“當(dāng)前狀態(tài)”
  94.             JNZ   T0INT0       ;不是0(導(dǎo)通時(shí)間)就轉(zhuǎn)移,斷開(kāi)
  95.             MOV   A,DSSJHM     ;是“導(dǎo)通時(shí)間”,裝入定時(shí)時(shí)間(毫秒)到寄存器A
  96.             JNZ   T0INT1       ;不是0就轉(zhuǎn)移,導(dǎo)通
  97.             MOV   A,DSSJM      ;裝入定時(shí)時(shí)間(秒)到寄存器A
  98.             JNZ   T0INT1       ;不是0就轉(zhuǎn)移,導(dǎo)通
  99.             MOV   A,DSSJF      ;裝入定時(shí)時(shí)間(分)到寄存器A
  100.             JNZ   T0INT1       ;不是0就轉(zhuǎn)移,導(dǎo)通
  101.             MOV   A,DSSJS      ;裝入定時(shí)時(shí)間(時(shí))到寄存器A
  102.             JNZ   T0INT1       ;不是0就轉(zhuǎn)移,導(dǎo)通
  103.     T0INT0:
  104.             SETB  MOC          ;定時(shí)時(shí)間為0,置MOC為高電平,斷開(kāi)
  105.             LJMP  T0INT2
  106.     T0INT1:
  107.             CLR   MOC          ;置MOC為低電平,可控硅(或繼電器)導(dǎo)通,通電
  108.     T0INT2:
  109.             POP   PSW
  110.             POP   ACC
  111.             RETI

  112.     ;--------------- 設(shè)置各項(xiàng)默認(rèn)值(#號(hào)后面都為十進(jìn)制數(shù)) ----------------
  113.     SZMRZ:
  114.             MOV        DTS,#10    ;導(dǎo)通時(shí)長(zhǎng)(時(shí)),0~99。默認(rèn)10小時(shí)
  115.             MOV        DTF,#0     ;導(dǎo)通時(shí)長(zhǎng)(分),0~59
  116.             MOV        DTM,#0     ;導(dǎo)通時(shí)長(zhǎng)(秒),0~59
  117.             MOV        DTHM,#0    ;導(dǎo)通時(shí)長(zhǎng),0~99(×10毫秒)
  118.             MOV        XHDS,#1    ;循環(huán)定時(shí),0=無(wú)限循環(huán);1=不循環(huán);2~99=導(dǎo)通次數(shù)
  119.             MOV        SMMS,#0    ;睡眠模式,0=始終顯示;1~59=無(wú)操作進(jìn)入睡眠(分鐘)
  120.             MOV        BMQZJ,#1   ;實(shí)時(shí)調(diào)整時(shí),編碼器每轉(zhuǎn)動(dòng)一格的+、-值(分鐘)
  121.             MOV        SMGLD,#3   ;數(shù)碼管亮度,8級(jí)亮度最高
  122.             MOV        DKS,#2     ;斷開(kāi)時(shí)長(zhǎng)(時(shí)),0~99
  123.             MOV        DKF,#0     ;斷開(kāi)時(shí)長(zhǎng)(分),0~59
  124.             MOV        DKM,#0     ;斷開(kāi)時(shí)長(zhǎng)(秒),0~59
  125.             MOV        DKHM,#0    ;斷開(kāi)時(shí)長(zhǎng),0~99(×10毫秒)
  126.             MOV        SDYSS,#0   ;上電延時(shí)導(dǎo)通時(shí)長(zhǎng)(時(shí)),0~99
  127.             MOV        SDYSF,#0   ;上電延時(shí)導(dǎo)通時(shí)長(zhǎng)(分),0~59
  128.             MOV        SDYSM,#0   ;上電延時(shí)導(dǎo)通時(shí)長(zhǎng)(秒),0~59
  129.             MOV        YSMS,#0    ;延時(shí)導(dǎo)通模式,0~2;
  130.             MOV        YSJS,#99   ;結(jié)束“上電延時(shí)導(dǎo)通”的“按下持續(xù)時(shí)間”秒計(jì)數(shù),0~99
  131.             RET

  132.     ;--------------- 定時(shí)器T0設(shè)置(10毫秒產(chǎn)生一次中斷) ----------------
  133.     SETINT:                                ;10毫秒@11.0592MHz
  134.             ANL  AUXR,#7FH   ;定時(shí)器時(shí)鐘12T模式
  135.             ANL  TMOD,#0F0H  ;設(shè)置定時(shí)器模式
  136.             MOV  TL0,#000H   ;設(shè)置定時(shí)初值
  137.             MOV  TH0,#0DCH   ;設(shè)置定時(shí)初值
  138.             CLR  TF0         ;清除TF0標(biāo)志
  139.             SETB TR0         ;定時(shí)器0開(kāi)始計(jì)時(shí)
  140.             SETB ET0         ;允許定時(shí)器0中斷
  141.             SETB EA          ;允許全局中斷
  142.             RET

  143.     ;---- 啟動(dòng)看門(mén)狗及喂狗,11.0592MHz預(yù)分頻數(shù)=2(71.1毫秒),00111000B(38H) ----
  144.     WG:        
  145.             MOV   WDT_CONTR,#00111000B
  146.             RET

  147.     ;*********************************** 主程序開(kāi)始 ***********************************
  148.     START:
  149.             MOV    SP,#050H        ;設(shè)置堆棧指針
  150.             MOV    A,FWBZ1         ;檢查復(fù)位判斷標(biāo)志,不相同就是初次上電,從初始化開(kāi)始運(yùn)行
  151.             CJNE   A,#0C8H,START0  ;檢查復(fù)位判斷標(biāo)志,不相同就是初次上電,從初始化開(kāi)始運(yùn)行
  152.             MOV    A,FWBZ2         ;檢查復(fù)位判斷標(biāo)志,不相同就是初次上電,從初始化開(kāi)始運(yùn)行
  153.             CJNE   A,#0D9H,START0  ;檢查復(fù)位判斷標(biāo)志,不相同就是初次上電,從初始化開(kāi)始運(yùn)行
  154.             LCALL  SETINT          ;相同,定時(shí)器設(shè)置(10毫秒產(chǎn)生一次中斷)
  155.             LJMP   START2          ;相同,跳過(guò)初始化繼續(xù)運(yùn)行
  156.     START0:
  157.             CLR    A               ;初始化,RAM從20H開(kāi)始清零30H個(gè)字節(jié)
  158.             MOV    R0,#30H         ;初始化,RAM從20H開(kāi)始清零30H個(gè)字節(jié)
  159.             MOV    R1,#20H         ;初始化,RAM從20H開(kāi)始清零30H個(gè)字節(jié)
  160.     START1:
  161.             MOV    @R1,A           ;初始化,RAM從20H開(kāi)始清零30H個(gè)字節(jié)
  162.             INC    R1              ;初始化,RAM從20H開(kāi)始清零30H個(gè)字節(jié)
  163.             DJNZ   R0,START1       ;初始化,RAM從20H開(kāi)始清零30H個(gè)字節(jié)
  164.             MOV    FWBZ1,#0C8H     ;初始化,放入復(fù)位判斷標(biāo)志1到RAM
  165.             MOV    FWBZ2,#0D9H     ;初始化,放入復(fù)位判斷標(biāo)志2到RAM
  166.             MOV    YSXY,#0FFH      ;初始化,放入結(jié)束“上電延時(shí)導(dǎo)通”的延時(shí)響應(yīng)時(shí)間,4.2分鐘
  167.             LCALL  SETINT          ;初始化,定時(shí)器設(shè)置(10毫秒產(chǎn)生一次中斷)
  168.             LCALL  REEP            ;初始化,讀EEPROM保存的各項(xiàng)設(shè)置,沒(méi)有就設(shè)為默認(rèn)值并保存
  169.     START2:
  170.             CLR    06H             ;位地址06H置為0,正常顯示
  171.             MOV    DISPL,#0        ;設(shè)置要顯示的目標(biāo),0=顯示定時(shí)時(shí)間
  172.             LCALL  SKEY            ;掃描KEY
  173.             JC     START3          ;有按鍵動(dòng)作(C=1)就轉(zhuǎn)移
  174.             LCALL  Scan1           ;掃描編碼器(有方向標(biāo)志)
  175.             JNB    00H,START2      ;如果位地址00H為0(編碼器沒(méi)有轉(zhuǎn)動(dòng))就轉(zhuǎn)移
  176.             LCALL  BMQCL           ;調(diào)用編碼器動(dòng)作處理子程序
  177.             LJMP   START2
  178.     START3:
  179.             LCALL  AJDZCL          ;調(diào)用按鍵動(dòng)作處理子程序
  180.             LJMP   START2
  181.     ;*********************************** 主程序結(jié)束 ***********************************
  182.     ;
  183.     ;----------------------------------------------------------------------------------------
  184.     ;子程序:編碼器動(dòng)作處理,實(shí)時(shí)調(diào)整定時(shí)時(shí)間
  185.     ;如果是用按鍵代替編碼器,支持長(zhǎng)按快速加減(需要把“長(zhǎng)按快速加減使能常數(shù)”由080H改為081H)。
  186.     ;----------------------------------------------------------------------------------------
  187.     BMQCL:
  188.             MOV    A,#KSJJ        ;裝入“長(zhǎng)按快速加減使能常數(shù)”
  189.             CJNE   A,#081H,BMQCL5 ;如果不是“支持長(zhǎng)按快速加減”就轉(zhuǎn)移
  190.             MOV    SHMJS,#50      ;設(shè)置有效長(zhǎng)按所需時(shí)長(zhǎng),50×10毫秒=500毫秒
  191.     BMQCL1:
  192.             MOV    A,SHMJS        ;裝入(10)毫秒計(jì)數(shù)
  193.             JZ     BMQCL2         ;如果時(shí)長(zhǎng)達(dá)到(為0)就轉(zhuǎn)移
  194.             LCALL  Scan2          ;掃描編碼器(無(wú)方向標(biāo)志)
  195.             JB     00H,BMQCL1     ;動(dòng)作未結(jié)束就轉(zhuǎn)移
  196.             LCALL  DSSJZJ         ;動(dòng)作結(jié)束,根據(jù)方向加/減定時(shí)時(shí)間
  197.             RET
  198.     BMQCL2:
  199.             LCALL  DSSJZJ       ;根據(jù)方向加/減定時(shí)時(shí)間
  200.             MOV    SHMJS,#13    ;加/減間隔時(shí)間,(×10)毫秒
  201.     BMQCL3:
  202.             MOV    A,SHMJS      ;裝入(10)毫秒計(jì)數(shù)
  203.             JNZ    BMQCL4       ;時(shí)間未到(不為0)就轉(zhuǎn)移
  204.             LJMP   BMQCL2       ;已達(dá)到設(shè)定的時(shí)長(zhǎng),轉(zhuǎn)移,根據(jù)方向加/減定時(shí)時(shí)間
  205.     BMQCL4:
  206.             LCALL  DELAY10      ;延時(shí)10毫秒
  207.             LCALL  Scan2        ;掃描編碼器(無(wú)方向標(biāo)志)
  208.             JB     00H,BMQCL3   ;動(dòng)作未結(jié)束就轉(zhuǎn)移
  209.             LCALL  DELAY10      ;延時(shí)10毫秒
  210.             LCALL  Scan2        ;第2次掃描編碼器(無(wú)方向標(biāo)志)
  211.             JB     00H,BMQCL3   ;動(dòng)作未結(jié)束就轉(zhuǎn)移
  212.             LCALL  DELAY10      ;延時(shí)10毫秒
  213.             LCALL  Scan2        ;第3次掃描編碼器(無(wú)方向標(biāo)志)
  214.             JB     00H,BMQCL3   ;動(dòng)作未結(jié)束就轉(zhuǎn)移
  215.             RET                 ;動(dòng)作結(jié)束,退出
  216.     BMQCL5:
  217.             MOV    MJS,#10      ;設(shè)置等待時(shí)間(秒)
  218.     BMQCL6:
  219.             LCALL  Scan2        ;掃描編碼器(無(wú)方向標(biāo)志)
  220.             JB     00H,BMQCL7   ;如果還沒(méi)轉(zhuǎn)到卡點(diǎn)位置就轉(zhuǎn)移
  221.             LCALL  DSSJZJ       ;已經(jīng)旋轉(zhuǎn)到卡點(diǎn)位置,根據(jù)旋轉(zhuǎn)方向增/減定時(shí)時(shí)間
  222.             RET
  223.     BMQCL7:
  224.             MOV    A,MJS        ;裝入秒計(jì)數(shù)到寄存器A
  225.             CJNE   A,#7,BMQCL6  ;檢查剩余時(shí)間,如果不是7(10秒-3秒=7)就轉(zhuǎn)移,繼續(xù)掃描
  226.             SETB   06H          ;達(dá)到3秒了,把位地址06H設(shè)置為1,數(shù)碼管顯示“--:--”
  227.             MOV    ZXM1,#0C0H   ;-
  228.             MOV    ZXM2,#0C0H   ;-
  229.             MOV    ZXM3,#0C0H   ;-
  230.             MOV    ZXM4,#0C0H   ;-
  231.             LCALL  DISP         ;顯示“--:--”
  232.     BMQCL8:
  233.             LCALL  Scan2        ;掃描編碼器(無(wú)方向標(biāo)志)
  234.             MOV    A,MJS        ;裝入秒計(jì)數(shù)到寄存器A
  235.             JZ     BMQCL9       ;如果秒計(jì)數(shù)為0(達(dá)到10秒)就轉(zhuǎn)移
  236.             JB     00H,BMQCL8   ;如果還沒(méi)轉(zhuǎn)到卡點(diǎn)位置就轉(zhuǎn)移,繼續(xù)掃描
  237.             MOV    SMJSF,#0FFH  ;已經(jīng)旋轉(zhuǎn)到卡點(diǎn)位置,先放入一個(gè)數(shù)值,等退出后才恢復(fù)睡眠計(jì)時(shí)
  238.             LCALL  TZGXSZ       ;調(diào)用“調(diào)整各項(xiàng)設(shè)置”子程序
  239.             MOV    SMJSF,SMMS   ;睡眠模式
  240.             MOV    SMJSM,#0
  241.             RET
  242.     BMQCL9:
  243.             MOV    ZXM1,#0FFH   ;達(dá)到了10秒,顯示3秒88:88
  244.             MOV    ZXM2,#0FFH   ;8
  245.             MOV    ZXM3,#0FFH   ;8
  246.             MOV    ZXM4,#0FFH   ;8
  247.             LCALL  DISP         ;顯示
  248.             MOV    MJS,#3       ;顯示3秒
  249.     BMQCL10:
  250.             MOV    A,MJS        ;裝入秒計(jì)數(shù)到寄存器A
  251.             LCALL  WG           ;喂狗
  252.             JNZ    BMQCL10      ;等待MJS變?yōu)?秒
  253.             LCALL  SZMRZ        ;延時(shí)時(shí)間到,恢復(fù)各項(xiàng)默認(rèn)設(shè)置
  254.             LCALL  WSET         ;保存設(shè)置
  255.     BMQCL11:
  256.             LCALL  Scan2        ;掃描編碼器(無(wú)方向標(biāo)志)
  257.             JB     00H,BMQCL11  ;如果還沒(méi)轉(zhuǎn)到卡點(diǎn)位置就繼續(xù)掃描
  258.             LCALL  REEPR        ;把“導(dǎo)通時(shí)間”放入“定時(shí)時(shí)間”,從“導(dǎo)通”開(kāi)始運(yùn)行。
  259.             CLR    02H          ;位地址02H置為0(正常運(yùn)行)
  260.             MOV    MJS,#2       ;延時(shí)2秒才退出
  261.     BMQCL12:
  262.             MOV    A,MJS        ;裝入秒計(jì)數(shù)到寄存器A
  263.             LCALL  WG           ;喂狗
  264.             JNZ    BMQCL12
  265.             RET

  266.     ;-------------------------------------------------------------------------------------
  267.     ;子程序:根據(jù)編碼器旋轉(zhuǎn)方向加減定時(shí)時(shí)間
  268.     ;3小時(shí)及以下,按設(shè)置的值加減:1~30分鐘
  269.     ;3小時(shí)以上每次增(減)30分鐘;10小時(shí)以上每次增(減)1個(gè)小時(shí);20小時(shí)以上每次增(減)2個(gè)小時(shí)
  270.     ;-------------------------------------------------------------------------------------
  271.     DSSJZJ:
  272.             MOV   DSSJM,#0       ;放入0到定時(shí)時(shí)間(秒)
  273.             MOV   DSSJHM,#99
  274.             CLR   05H
  275.             MOV   A,DSSJS        ;裝入定時(shí)時(shí)間(時(shí))
  276.             CJNE  A,#20,DSZJ1    ;當(dāng)前“時(shí)”是否等于或大于20
  277.     DSZJ1:
  278.             JC    DSZJ2          ;小于就轉(zhuǎn)移
  279.             MOV   DSZJ,#2        ;等于或大于20,加減2個(gè)小時(shí)
  280.             LJMP  DSZJ4
  281.     DSZJ2:
  282.             CJNE  A,#10,DSZJ3    ;當(dāng)前“時(shí)”是否等于或大于10
  283.     DSZJ3:
  284.             JC    DSZJ8          ;小于就轉(zhuǎn)移
  285.             MOV   DSZJ,#1        ;等于或大于10,加減1個(gè)小時(shí)
  286.     DSZJ4:
  287.             JNB   01H,DSZJ6      ;如果位地址01H為0(逆時(shí)針?lè)崔D(zhuǎn))就轉(zhuǎn)移
  288.             ADD   A,DSZJ         ;是正轉(zhuǎn),加
  289.             CJNE  A,#100,DSZJ5   ;加完后是否等于或大于100
  290.     DSZJ5:
  291.             JC    DSZJ7          ;如果小于就轉(zhuǎn)移,把A放回到DSSJS
  292.             MOV   DSSJS,#99      ;已經(jīng)大于99了,直接設(shè)置為99:59:59+DSSJHM(1秒),100小時(shí)
  293.             MOV   DSSJF,#59      ;已經(jīng)大于99了,直接設(shè)置為99:59:59+DSSJHM(1秒),100小時(shí)
  294.             MOV   DSSJM,#59      ;已經(jīng)大于99了,直接設(shè)置為99:59:59+DSSJHM(1秒),100小時(shí)
  295.             RET
  296.     DSZJ6:
  297.             SUBB  A,DSZJ         ;是反轉(zhuǎn),減
  298.     DSZJ7:
  299.             MOV   DSSJS,A        ;把計(jì)算結(jié)果放入DSSJS
  300.             RET
  301.     DSZJ8:
  302.             MOV   DSZJ,BMQZJ     ;把設(shè)置的“增(減)值”放入DSZJ
  303.             CJNE  A,#3,DSZJ11    ;當(dāng)前“時(shí)”不是3就轉(zhuǎn)移
  304.             JB    01H,DSZJ12     ;是3,如果位地址01H為1(正轉(zhuǎn))就轉(zhuǎn)移,把DSZJ處的“增(減)值”改為30(分鐘)
  305.             MOV   A,DSSJF        ;是反轉(zhuǎn),裝入定時(shí)時(shí)間(分)
  306.             JZ    DSZJ13         ;如果當(dāng)前“分”為0(3:00)就轉(zhuǎn)移,按設(shè)置的增(減)值減
  307.             CJNE  A,#30,DSZJ9    ;“分”不為0,是否等于或大于30
  308.     DSZJ9:
  309.             JC    DSZJ10         ;小于就轉(zhuǎn)移,把0放入定時(shí)時(shí)間(分),使時(shí)間變?yōu)?:00
  310.             SUBB  A,#30          ;等于或大于,減30分
  311.             MOV   DSSJF,A        ;把計(jì)算結(jié)果放入定時(shí)時(shí)間(分)
  312.             RET
  313.     DSZJ10:
  314.             MOV   DSSJF,#0       ;小于30,把0放入定時(shí)時(shí)間(分),使時(shí)間變?yōu)?:00
  315.             RET
  316.     DSZJ11:
  317.             JC    DSZJ13         ;小于3就轉(zhuǎn)移
  318.     DSZJ12:
  319.             MOV   DSZJ,#30       ;大于3:00,把DSZJ處的“增(減)值”改為30(分鐘)
  320.     DSZJ13:
  321.             MOV   A,DSSJF        ;裝入定時(shí)時(shí)間(分)
  322.             JNB   01H,DSZJ17     ;如果位地址01H為0(逆時(shí)針?lè)崔D(zhuǎn))就轉(zhuǎn)移
  323.             ADD   A,DSZJ         ;是正轉(zhuǎn),當(dāng)前“分”直接加DSZJ處的“增(減)值”
  324.             CJNE  A,#60,DSZJ14   ;加完后“分”是否等于或大于60
  325.     DSZJ14:
  326.             JC    DSZJ15         ;小于60就轉(zhuǎn)移,把A放入定時(shí)時(shí)間(分)
  327.             SUBB  A,#60          ;等于或大于60,就減60,然后小時(shí)加1
  328.             MOV   DSSJF,A        ;把A放入定時(shí)時(shí)間(分)
  329.             MOV   A,DSSJS        ;裝入“時(shí)”
  330.             INC   A              ;小時(shí)加1
  331.             MOV   DSSJS,A
  332.             CJNE  A,#3,DSZJ16    ;加完后“時(shí)”不是3就轉(zhuǎn)移,退出
  333.             CLR   A              ;加完后大于3:00了,把0放入定時(shí)時(shí)間(分),使時(shí)間變?yōu)?:00
  334.     DSZJ15:
  335.             MOV   DSSJF,A
  336.     DSZJ16: RET
  337.     DSZJ17:
  338.             CJNE  A,DSZJ,DSZJ18 ;是逆時(shí)針?lè)崔D(zhuǎn),當(dāng)前“分”是否等于或大于DSZJ處的“增(減)值”
  339.     DSZJ18:
  340.             JC    DSZJ19        ;小于就轉(zhuǎn)移
  341.             SUBB  A,DSZJ        ;等于或大于,定時(shí)時(shí)間(分)減“增(減)值”
  342.             MOV   DSSJF,A       ;把計(jì)算結(jié)果放入定時(shí)時(shí)間(分)
  343.             RET
  344.     DSZJ19:
  345.             MOV   A,DSZJ        ;“分”小于“增(減)值”,裝入DSZJ處的“增(減)值”
  346.             CLR   C             ;進(jìn)位標(biāo)志清0
  347.             SUBB  A,DSSJF       ;“增(減)值”減“定時(shí)時(shí)間(分)”
  348.             MOV   DSSJF,A       ;減完后的結(jié)果暫時(shí)放入DSSJF
  349.             MOV   A,#60
  350.             SUBB  A,DSSJF       ;60減上面的計(jì)算結(jié)果,得出定時(shí)時(shí)間(分),然后小時(shí)減1
  351.             MOV   DSSJF,A       ;得出的數(shù)放入定時(shí)時(shí)間(分)
  352.             MOV   A,DSSJS       ;裝入定時(shí)時(shí)間(時(shí))
  353.             JZ    DSSJQL        ;如果“時(shí)”為0就轉(zhuǎn)移
  354.             DEC   DSSJS         ;“時(shí)”不為0,減1
  355.             RET
  356.     DSSJQL:
  357.             MOV   DSSJF,#0      ;把“分”置為0
  358.             MOV   DSSJHM,#0
  359.             RET

  360.     ;-------------------------------------------------------------------------------------
  361.     ;子程序:按鍵動(dòng)作處理
  362.     ;短按1次暫停計(jì)時(shí);短按2次當(dāng)前項(xiàng)時(shí)間(當(dāng)次)清零;短按3次重新啟動(dòng),相當(dāng)于重新上電。
  363.     ;長(zhǎng)按3秒顯示“--:--”時(shí)釋放,進(jìn)入“設(shè)置”;長(zhǎng)按10秒,恢復(fù)默認(rèn)設(shè)置,顯示88:88。
  364.     ;
  365.     ;啟用“上電延時(shí)導(dǎo)通”,“延時(shí)導(dǎo)通模式”為2時(shí),上電4.2分鐘內(nèi)按鍵失效,4.2分鐘之后
  366.     ;按鍵只有時(shí)間清零功能,持續(xù)按下按鍵的時(shí)間達(dá)到設(shè)置的時(shí)長(zhǎng)(0~99秒)就清零,清零后
  367.     ;繼續(xù)執(zhí)行下一項(xiàng),執(zhí)行到“導(dǎo)通”狀態(tài)運(yùn)行結(jié)束時(shí),按鍵功能恢復(fù)正常。
  368.     ;-------------------------------------------------------------------------------------
  369.     AJDZCL:
  370.             JB     08H,JSYSDT2  ;位地址08H為1就轉(zhuǎn)移,不響應(yīng)按鍵動(dòng)作。
  371.             MOV    A,DQZT       ;裝入“當(dāng)前狀態(tài)”,0=導(dǎo)通、1=斷開(kāi),2=上電延時(shí)導(dǎo)通
  372.             CJNE   A,#2,KEY0    ;不是“上電延時(shí)導(dǎo)通”狀態(tài)就轉(zhuǎn)移
  373.             MOV    A,YSMS       ;裝入“延時(shí)導(dǎo)通模式”
  374.             CJNE   A,#2,KEY0    ;不是2(延時(shí)時(shí)間到后從“斷開(kāi)”繼續(xù)運(yùn)行)就轉(zhuǎn)移
  375.             MOV    A,YSXY       ;裝入“延時(shí)響應(yīng)”
  376.             JNZ    JSYSDT2      ;延時(shí)響應(yīng)時(shí)間未到就轉(zhuǎn)移退出
  377.             MOV    MJS,YSJS     ;把設(shè)置的“按下持續(xù)時(shí)間”秒計(jì)數(shù)放入MJS
  378.     JSYSDT1:
  379.             MOV    A,MJS
  380.             JNZ    JSYSDT3      ;等待秒計(jì)數(shù)為0
  381.             MOV    DSSJS,A      ;持續(xù)按下的時(shí)間到,定時(shí)時(shí)間(時(shí))清零
  382.             MOV    DSSJF,A      ;持續(xù)按下的時(shí)間到,定時(shí)時(shí)間(分)清零
  383.             MOV    DSSJM,A      ;持續(xù)按下的時(shí)間到,定時(shí)時(shí)間(秒)清零
  384.             MOV    DSSJHM,A     ;持續(xù)按下的時(shí)間到,定時(shí)時(shí)間(毫秒)清零
  385.             LCALL  KEYEX        ;等待按鍵釋放
  386.             SETB   08H          ;位地址08H置為1,不響應(yīng)按鍵動(dòng)作。
  387.     JSYSDT2:
  388.             RET
  389.     JSYSDT3:
  390.             LCALL  SKEY0
  391.             JC     JSYSDT1      ;如果C=1(按鍵還沒(méi)釋放),就繼續(xù)掃描等待
  392.             RET
  393.     KEY0:
  394.             MOV    MJS,#10      ;放入等待時(shí)間,10秒
  395.     KEY1:
  396.             MOV    A,MJS        ;裝入等待時(shí)間
  397.             CJNE   A,#7,KEY5    ;按下未達(dá)到3秒(10-3=7)就轉(zhuǎn)移
  398.             SETB   06H          ;到3秒了,把位地址06H設(shè)置為1,數(shù)碼管顯示“--:--”
  399.             MOV    ZXM1,#0C0H   ;-
  400.             MOV    ZXM2,#0C0H   ;-
  401.             MOV    ZXM3,#0C0H   ;-
  402.             MOV    ZXM4,#0C0H   ;-
  403.             LCALL  DISP         ;顯示“--:--”
  404.     KEY2:
  405.             MOV    A,MJS        ;裝入等待時(shí)間
  406.             JZ     KEY3         ;如果為0(長(zhǎng)按達(dá)到了10秒)就轉(zhuǎn)移
  407.             LCALL  SKEY         ;掃描按鍵
  408.             JC     KEY2         ;如果C=1(按鍵還沒(méi)釋放),就繼續(xù)掃描
  409.             MOV    SMJSF,#0FFH  ;先放入一個(gè)數(shù)值,等退出后才恢復(fù)睡眠計(jì)時(shí)
  410.             LCALL  TZGXSZ       ;調(diào)用“調(diào)整各項(xiàng)設(shè)置”子程序
  411.             MOV    SMJSF,SMMS   ;睡眠模式
  412.             MOV    SMJSM,#0     ;
  413.             RET
  414.     KEY3:
  415.             MOV    ZXM1,#0FFH  ;達(dá)到了10秒,顯示3秒88:88
  416.             MOV    ZXM2,#0FFH  ;8
  417.             MOV    ZXM3,#0FFH  ;8
  418.             MOV    ZXM4,#0FFH  ;8
  419.             LCALL  DISP        ;顯示
  420.             MOV    MJS,#3      ;顯示3秒
  421.     KEY4:
  422.             MOV    A,MJS       ;顯示3秒
  423.             LCALL  WG          ;喂狗
  424.             JNZ    KEY4        ;等待MJS為0秒
  425.             LCALL  SZMRZ       ;延時(shí)時(shí)間到,恢復(fù)各項(xiàng)默認(rèn)設(shè)置
  426.             LCALL  WSET        ;保存設(shè)置
  427.             LCALL  KEYEX       ;等待按鍵釋放
  428.             LCALL  REEPR       ;把“導(dǎo)通時(shí)間”放入“定時(shí)時(shí)間”,從“導(dǎo)通”開(kāi)始運(yùn)行。
  429.             CLR    02H         ;位地址02H置為0(正常運(yùn)行)
  430.             RET
  431.     KEY5:
  432.             LCALL  SKEY       ;掃描按鍵
  433.             JC     KEY1       ;如果C=1(按鍵還沒(méi)釋放),就繼續(xù)掃描
  434.             MOV    A,DSSJHM   ;裝入定時(shí)時(shí)間(毫秒)到寄存器A
  435.             JNZ    KEY6       ;不是0就轉(zhuǎn)移
  436.             MOV    A,DSSJM    ;裝入定時(shí)時(shí)間(秒)到寄存器A
  437.             JNZ    KEY6       ;不是0就轉(zhuǎn)移
  438.             MOV    A,DSSJF    ;裝入定時(shí)時(shí)間(分)到寄存器A
  439.             JNZ    KEY6       ;不是0就轉(zhuǎn)移
  440.             MOV    A,DSSJS    ;裝入定時(shí)時(shí)間(時(shí))到寄存器A
  441.             JNZ    KEY6       ;不是0就轉(zhuǎn)移
  442.             CLR    02H        ;定時(shí)時(shí)間為0,位地址02H置為0(正常)
  443.             LJMP   KEY7
  444.     KEY6:
  445.             CPL    02H        ;位地址02H取反,暫停/正常切換
  446.     KEY7:
  447.             LCALL  KEYA       ;第1次按鍵釋放了,再次掃描按鍵500毫秒
  448.             JZ     KEY8       ;如果500毫秒內(nèi)有按鍵動(dòng)作就轉(zhuǎn)移
  449.             RET
  450.     KEY8:
  451.             LCALL  KEYEX      ;有按鍵動(dòng)作,等待第2次按鍵釋放
  452.             LCALL  KEYA       ;按鍵釋放了,掃描按鍵500毫秒
  453.             JZ     KEY9       ;如果500毫秒內(nèi)有按鍵動(dòng)作就轉(zhuǎn)移
  454.             MOV    DSSJS,#0   ;沒(méi)有按鍵動(dòng)作,按了2次,把當(dāng)前時(shí)間清零
  455.             MOV    DSSJF,#0   ;把當(dāng)前時(shí)間清零
  456.             MOV    DSSJM,#0   ;把當(dāng)前時(shí)間清零
  457.             MOV    DSSJHM,#0  ;把當(dāng)前時(shí)間清零
  458.             CLR    02H        ;位地址02H置為0(正常)
  459.             RET
  460.     KEY9:
  461.             LCALL  KEYEX      ;等待第3次按鍵釋放
  462.             CLR    EA         ;關(guān)閉全局中斷
  463.             INC    FWBZ1      ;加1,改變復(fù)位判斷標(biāo)志1
  464.             LJMP   START      ;跳轉(zhuǎn)到START,重新初始化

  465.     ;------------------------------------------------------------------
  466.     ;子程序:調(diào)整各項(xiàng)設(shè)置值
  467.     ;短按2次KEY保存并退出,或在最后一項(xiàng)無(wú)操作自動(dòng)保存退出。
  468.     ;閃爍5秒無(wú)操作或者短按KEY釋放0.5秒后,跳到下一項(xiàng)設(shè)置。
  469.     ;按住KEY不放,旋轉(zhuǎn)編碼器可向上/下跳到任意一項(xiàng)設(shè)置
  470.     ;如果是用按鍵代替編碼器,支持長(zhǎng)按快速加/減
  471.     ;------------------------------------------------------------------
  472.     TZGXSZ:
  473.             CLR    06H            ;位地址06H置為0,正常顯示
  474.             MOV    DISPL,#1       ;第一項(xiàng),導(dǎo)通時(shí)間(時(shí)),0~99小時(shí)
  475.     SZTZ:
  476.             MOV    MJS,#7         ;放入無(wú)操作等待時(shí)間(秒)到MJS
  477.             CLR    03H            ;位地址03H置為0,允許檢查剩余時(shí)間
  478.     SZTZ1:
  479.             LCALL  SKEY0          ;掃描按鍵
  480.             JNC    SZTZ7          ;沒(méi)有按鍵動(dòng)作(C=0)就轉(zhuǎn)移
  481.             CLR    04H            ;已經(jīng)按下,把位地址04H置為0,不閃爍顯示
  482.     SZTZ2:        
  483.             LCALL  Scan10         ;掃描編碼器(有方向標(biāo)志)
  484.             JB     00H,SZTZ4      ;如果編碼器有旋轉(zhuǎn)動(dòng)作(位地址00H為1)就轉(zhuǎn)移
  485.             LCALL  SKEY0          ;掃描按鍵
  486.             JC     SZTZ2          ;按鍵未釋放(C=1)就轉(zhuǎn)移
  487.             LCALL  KEYA           ;釋放了,再次掃描按鍵500毫秒
  488.             JNZ    SZTZ3          ;沒(méi)有第2次按鍵動(dòng)作就轉(zhuǎn)移
  489.             LCALL  WSET           ;已經(jīng)第2次按下,保存設(shè)置
  490.             LCALL  KEYEX          ;等待按鍵釋放
  491.             RET
  492.     SZTZ3:
  493.             SETB   01H            ;把位地址01H置為1,順時(shí)針正轉(zhuǎn)(切換到下一項(xiàng))
  494.             LCALL  QHXM           ;根據(jù)位地址01H的方向,切換到上/下一項(xiàng)
  495.             LJMP   SZTZ
  496.     SZTZ4:
  497.             LCALL  QHXM           ;根據(jù)位地址01H的方向,切換到上/下一項(xiàng)
  498.     SZTZ5:
  499.             LCALL  Scan20         ;掃描編碼器(無(wú)方向標(biāo)志)
  500.             JB     00H,SZTZ5      ;編碼器動(dòng)作未結(jié)束就繼續(xù)掃描,等待
  501.     SZTZ6:
  502.             LCALL  SKEY0          ;掃描按鍵
  503.             JNC    SZTZ           ;按鍵釋放(C=0)就轉(zhuǎn)移
  504.             LCALL  Scan10         ;掃描編碼器(有方向標(biāo)志)
  505.             JB     00H,SZTZ4      ;編碼器有動(dòng)作(位地址00H為1)就轉(zhuǎn)移,切換到上/下一項(xiàng)
  506.             LJMP   SZTZ6
  507.     SZTZ7:
  508.             LCALL  Scan10         ;掃描編碼器(有方向標(biāo)志)
  509.             JB     00H,SZTZ9      ;如果編碼器有旋轉(zhuǎn)動(dòng)作(位地址00H為1)就轉(zhuǎn)移
  510.             MOV    A,MJS          ;沒(méi)有轉(zhuǎn)動(dòng),裝入秒計(jì)數(shù)到寄存器A
  511.             JZ     SZTZ8          ;如果秒計(jì)數(shù)為0(等待時(shí)間到)就轉(zhuǎn)移
  512.             JB     03H,SZTZ1      ;不為0,如果位地址03H為1就轉(zhuǎn)移,不檢查剩余時(shí)間
  513.             CJNE   A,#5,SZTZ1     ;檢查剩余時(shí)間,不到就轉(zhuǎn)移,繼續(xù)掃描編碼器
  514.             SETB   04H            ;把位地址04H置為1,設(shè)置為閃爍顯示
  515.             SETB   03H            ;位地址03H置為1,禁止檢查剩余時(shí)間
  516.             LJMP   SZTZ1
  517.     SZTZ8:
  518.             CLR    04H            ;等待時(shí)間到,把位地址04H置為0,不閃爍顯示
  519.             MOV    A,DISPL        ;裝入當(dāng)前目標(biāo)項(xiàng)
  520.             CJNE   A,#17,SZTZ3    ;不是最后一項(xiàng)就轉(zhuǎn)移,跳到下一項(xiàng)
  521.             LCALL  WSET           ;保存設(shè)置
  522.             RET
  523.     SZTZ9:
  524.             CLR    04H            ;編碼器已經(jīng)轉(zhuǎn)動(dòng),把位地址04H置為0,不閃爍顯示
  525.             MOV    SHMJS,#50      ;設(shè)置有效長(zhǎng)按所需時(shí)長(zhǎng),50×10毫秒=500毫秒
  526.     SZTZ10:
  527.             MOV    A,SHMJS        ;裝入(10)毫秒計(jì)數(shù)
  528.             JZ     SZTZ11         ;如果時(shí)長(zhǎng)達(dá)到(為0)就轉(zhuǎn)移
  529.             LCALL  Scan20         ;掃描編碼器(無(wú)方向標(biāo)志)
  530.             JB     00H,SZTZ10     ;動(dòng)作未結(jié)束就轉(zhuǎn)移,繼續(xù)掃描
  531.             LCALL  MBSZ           ;動(dòng)作結(jié)束了,調(diào)整DISPL指向的對(duì)象,加/減1
  532.             LJMP   SZTZ
  533.     SZTZ11:
  534.             LCALL  MBSZ           ;加/減1。已經(jīng)為有效長(zhǎng)按,下面進(jìn)入長(zhǎng)按快速加/減
  535.             MOV    SHMJS,#13      ;間隔加/減時(shí)間,(×10)毫秒
  536.     SZTZ12:
  537.             MOV    A,SHMJS        ;裝入(10)毫秒計(jì)數(shù)
  538.             JNZ    SZTZ13         ;時(shí)間未到(不為0)就轉(zhuǎn)移
  539.             LJMP   SZTZ11         ;已達(dá)到設(shè)定的間隔時(shí)長(zhǎng),轉(zhuǎn)移,加/減1
  540.     SZTZ13:
  541.             LCALL  DELAY10        ;延時(shí)10毫秒
  542.             LCALL  Scan20         ;掃描編碼器(無(wú)方向標(biāo)志)
  543.             JB     00H,SZTZ12     ;動(dòng)作未結(jié)束就轉(zhuǎn)移
  544.             LCALL  DELAY10        ;延時(shí)10毫秒
  545.             LCALL  Scan20         ;第2次掃描編碼器(無(wú)方向標(biāo)志)
  546.             JB     00H,SZTZ12     ;動(dòng)作未結(jié)束就轉(zhuǎn)移
  547.             LCALL  DELAY10        ;延時(shí)10毫秒
  548.             LCALL  Scan20         ;第3次掃描編碼器(無(wú)方向標(biāo)志)
  549.             JB     00H,SZTZ12     ;動(dòng)作未結(jié)束就轉(zhuǎn)移
  550.             LJMP   SZTZ           ;動(dòng)作結(jié)束
  551.     MBSZ:
  552.             MOV    A,DISPL        ;裝入要調(diào)整的目標(biāo)項(xiàng)
  553.             LCALL  SXXFW          ;設(shè)置上下限限值
  554.             DEC    A              ;減1
  555.             ADD    A,#DTS         ;加上各項(xiàng)設(shè)置的起始地址
  556.             MOV    R0,A           ;把得出的目標(biāo)項(xiàng)地址放入R0
  557.             JB     01H,MBSZ2      ;如果位地址01H為1(順時(shí)針正轉(zhuǎn))就轉(zhuǎn)移
  558.             INC    XXSZ           ;是反轉(zhuǎn),下限值先加1
  559.             MOV    A,@R0          ;裝入R0指向的目標(biāo)數(shù)值
  560.             CJNE   A,XXSZ,MBSZ0   ;與加1后的下限值比較
  561.     MBSZ0:
  562.             JC     MBSZ1          ;如果小于“下限值+1”(不夠減)就轉(zhuǎn)移
  563.             DEC    @R0            ;等于或大于下限值,目標(biāo)數(shù)值減1
  564.             DEC    XXSZ           ;減1,恢復(fù)下限值
  565.             RET
  566.     MBSZ1:
  567.             DEC    XXSZ           ;減1,恢復(fù)下限值
  568.             MOV    @R0,XXSZ       ;不夠減了,直接放入下限值
  569.             RET
  570.     MBSZ2:
  571.             MOV    A,@R0          ;是正轉(zhuǎn),裝入R0指向的RAM地址的目標(biāo)數(shù)值
  572.             INC    A              ;加1
  573.             CJNE   A,SXSZ,MBSZ3   ;加完后與上限數(shù)值比較
  574.     MBSZ3:
  575.             JC     MBSZ4          ;如果小于就轉(zhuǎn)移
  576.             MOV    @R0,SXSZ       ;等于或大于上限值,直接放入上限值
  577.             RET
  578.     MBSZ4:
  579.             MOV    @R0,A          ;小于上限值,把計(jì)算結(jié)果放回去
  580.             RET

  581.     ;-------------------------------------------------------------------------
  582.     ;子程序:切換項(xiàng)目。根據(jù)位地址01H的方向標(biāo)志,把當(dāng)前設(shè)置項(xiàng)切換到上/下一項(xiàng)
  583.     ;-------------------------------------------------------------------------
  584.     QHXM:
  585.             MOV   A,DISPL     ;裝入當(dāng)前項(xiàng)目號(hào)
  586.             JB    01H,QHXM2   ;如果位地址01H為1(正轉(zhuǎn))就轉(zhuǎn)移,切換到下一項(xiàng)
  587.             CJNE  A,#1,QHXM1  ;是反轉(zhuǎn),如果不是1就轉(zhuǎn)移
  588.             MOV   DISPL,#17   ;切換到上一項(xiàng)17
  589.             RET
  590.     QHXM1:
  591.             DEC   DISPL       ;減1,切換到上一項(xiàng)
  592.             RET
  593.     QHXM2:
  594.             CJNE  A,#17,QHXM3 ;是正轉(zhuǎn),如果不是17就轉(zhuǎn)移
  595.             MOV   DISPL,#1    ;切換到下一項(xiàng)1
  596.             RET
  597.     QHXM3:
  598.             INC   DISPL       ;加1,切換到下一項(xiàng)
  599.             RET

  600.     ;-------------------------------------------------------------------------
  601.     ;子程序:根據(jù)當(dāng)前項(xiàng)目號(hào)設(shè)置加/減調(diào)整的上下限值。入口參數(shù):A=項(xiàng)目號(hào)。
  602.     ;-------------------------------------------------------------------------
  603.     SXXFW:
  604.             CJNE  A,#1,SXXFW1    ;1=顯示“1A”設(shè)置導(dǎo)通時(shí)間(時(shí)),0~99小時(shí)
  605.             MOV   XXSZ,#0        ;下限為0
  606.             MOV   SXSZ,#99       ;上限為99
  607.             RET
  608.     SXXFW1:
  609.             CJNE  A,#2,SXXFW2    ;2=顯示“1b”設(shè)置導(dǎo)通時(shí)間(分),0~59分鐘
  610.             MOV   XXSZ,#0        ;下限為0
  611.             MOV   SXSZ,#59       ;上限為59
  612.             RET
  613.     SXXFW2:
  614.             CJNE  A,#3,SXXFW3    ;3=顯示“1C”設(shè)置導(dǎo)通時(shí)間(秒),0~59秒
  615.             MOV   XXSZ,#0        ;下限為0
  616.             MOV   SXSZ,#59       ;上限為59
  617.             RET
  618.     SXXFW3:
  619.             CJNE  A,#4,SXXFW4    ;4=顯示“1d”設(shè)置導(dǎo)通時(shí)間(×10毫秒),0~99
  620.             MOV   XXSZ,#0        ;下限為0
  621.             MOV   SXSZ,#99       ;上限為99
  622.             RET
  623.     SXXFW4:
  624.             CJNE  A,#5,SXXFW5    ;5=顯示“o-”設(shè)置循環(huán)定時(shí),0~99
  625.             MOV   XXSZ,#0        ;下限為0
  626.             MOV   SXSZ,#99       ;上限為99
  627.             RET
  628.     SXXFW5:
  629.             CJNE  A,#6,SXXFW6    ;6=顯示“C-”設(shè)置睡眠模式,0~59
  630.             MOV   XXSZ,#0        ;下限為0
  631.             MOV   SXSZ,#59       ;上限為59
  632.             RET
  633.     SXXFW6:
  634.             CJNE  A,#7,SXXFW7    ;7=顯示“bC”設(shè)置實(shí)時(shí)調(diào)整時(shí)的增/減值(步長(zhǎng)):1~30分鐘
  635.             MOV   XXSZ,#1        ;下限為1
  636.             MOV   SXSZ,#30       ;上限為30
  637.             RET
  638.     SXXFW7:
  639.             CJNE  A,#8,SXXFW8    ;8=顯示“Ld”設(shè)置數(shù)碼管亮度,1~8級(jí)。
  640.             MOV   XXSZ,#1        ;下限為1
  641.             MOV   SXSZ,#8        ;上限為8
  642.             RET
  643.     SXXFW8:
  644.             CJNE  A,#9,SXXFW9    ;9=顯示“2A”設(shè)置斷開(kāi)時(shí)間(時(shí)),0~99小時(shí)
  645.             MOV   XXSZ,#0        ;下限為0
  646.             MOV   SXSZ,#99       ;上限為99
  647.             RET
  648.     SXXFW9:
  649.             CJNE  A,#10,SXXFW10  ;10=顯示“2b”設(shè)置斷開(kāi)時(shí)間(分),0~59分鐘
  650.             MOV   XXSZ,#0        ;下限為0
  651.             MOV   SXSZ,#59       ;上限為59
  652.             RET
  653.     SXXFW10:
  654.             CJNE  A,#11,SXXFW11  ;11=顯示“2C”設(shè)置斷開(kāi)時(shí)間(秒),0~59秒
  655.             MOV   XXSZ,#0        ;下限為0
  656.             MOV   SXSZ,#59       ;上限為59
  657.             RET
  658.     SXXFW11:
  659.             CJNE  A,#12,SXXFW12  ;12=顯示“2d”設(shè)置斷開(kāi)時(shí)間(×10毫秒),0~99
  660.             MOV   XXSZ,#0        ;下限為0
  661.             MOV   SXSZ,#99       ;上限為99
  662.             RET
  663.     SXXFW12:
  664.             CJNE  A,#13,SXXFW13  ;13=顯示“3A”設(shè)置上電延時(shí)導(dǎo)通(時(shí)),0~99小時(shí)
  665.             MOV   XXSZ,#0        ;下限為0
  666.             MOV   SXSZ,#99       ;上限為99
  667.             RET
  668.     SXXFW13:
  669.             CJNE  A,#14,SXXFW14  ;14=顯示“3b”設(shè)置上電延時(shí)導(dǎo)通(分),0~59分鐘
  670.             MOV   XXSZ,#0        ;下限為0
  671.             MOV   SXSZ,#59       ;上限為59
  672.             RET
  673.     SXXFW14:
  674.             CJNE  A,#15,SXXFW15  ;15=顯示“3C”設(shè)置上電延時(shí)導(dǎo)通(秒),0~59秒
  675.             MOV   XXSZ,#0        ;下限為0
  676.             MOV   SXSZ,#59       ;上限為59
  677.             RET
  678.     SXXFW15:
  679.             CJNE  A,#16,SXXFW16  ;16=顯示“d-”設(shè)置延時(shí)導(dǎo)通模式,0~2。默認(rèn)為0
  680.             MOV   XXSZ,#0        ;下限為0
  681.             MOV   SXSZ,#2        ;上限為2
  682.             RET
  683.     SXXFW16:                     ;17=顯示“E-”設(shè)置“持續(xù)按下時(shí)間”秒計(jì)數(shù)0~99
  684.             MOV   XXSZ,#0        ;下限為0
  685.             MOV   SXSZ,#99       ;上限為99
  686.             RET

  687.     ;----------------------------------------------------------------------------------------
  688.     ;子程序:掃描編碼器是否有旋轉(zhuǎn)動(dòng)作并設(shè)置好方向標(biāo)志
  689.     ;出口參數(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)
  690.     ;----------------------------------------------------------------------------------------
  691.     Scan1:
  692.             LCALL  Scan10        ;掃描編碼器
  693.             JNB    00H,Scan1E    ;如果沒(méi)有旋轉(zhuǎn)動(dòng)作就轉(zhuǎn)移退出
  694.             LCALL  SMCL          ;有旋轉(zhuǎn)動(dòng)作,調(diào)用睡眠處理子程序
  695.             JZ     Scan1E        ;如果是0(從睡眠狀態(tài)喚醒)就轉(zhuǎn)移,下次才退出“始終導(dǎo)通”狀態(tài)
  696.             LCALL  TCSZDT        ;退出上電延時(shí)導(dǎo)通的“始終導(dǎo)通”狀態(tài)
  697.     Scan1E: RET
  698.     Scan10:
  699.             LCALL  WG            ;喂狗
  700.             SETB   EC11A         ;拉高編碼器A引腳電平
  701.             SETB   EC11B         ;拉高編碼器B引腳電平
  702.             JNB    EC11A,Scan11  ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動(dòng)作,順時(shí)針正轉(zhuǎn)
  703.             JNB    EC11B,Scan12  ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動(dòng)作,逆時(shí)針?lè)崔D(zhuǎn)
  704.             CLR    00H           ;沒(méi)有旋轉(zhuǎn)動(dòng)作,把位地址00H置為0
  705.             RET
  706.     Scan11:
  707.             SETB   01H           ;順時(shí)針正轉(zhuǎn),把位地址01H置為1
  708.             SETB   00H           ;有旋轉(zhuǎn)動(dòng)作,把位地址00H置為1
  709.             RET  
  710.     Scan12:
  711.             CLR    01H           ;逆時(shí)針?lè)崔D(zhuǎn),把位地址01H置為0
  712.             SETB   00H           ;有旋轉(zhuǎn)動(dòng)作,把位地址00H置為1
  713.     Scan13: RET

  714.     ;-----------------------------------------------------------
  715.     ;子程序:掃描編碼器是否有旋轉(zhuǎn)動(dòng)作,不設(shè)置方向標(biāo)志
  716.     ;出口參數(shù):位地址第0位=1已經(jīng)轉(zhuǎn)動(dòng),=0沒(méi)有轉(zhuǎn)動(dòng)
  717.     ;-----------------------------------------------------------
  718.     Scan2:
  719.             LCALL  Scan20        ;掃描編碼器
  720.             JNB    00H,Scan2E    ;如果沒(méi)有旋轉(zhuǎn)動(dòng)作就轉(zhuǎn)移退出
  721.             LCALL  SMCL          ;有旋轉(zhuǎn)動(dòng)作,調(diào)用睡眠處理子程序
  722.             JZ     Scan2E        ;如果是0(從睡眠狀態(tài)喚醒)就轉(zhuǎn)移,下次才退出“始終導(dǎo)通”狀態(tài)
  723.             LCALL  TCSZDT        ;退出上電延時(shí)導(dǎo)通的“始終導(dǎo)通”狀態(tài)
  724.     Scan2E: RET
  725.     Scan20:
  726.             LCALL  WG            ;喂狗
  727.             SETB   EC11A         ;拉高編碼器A引腳電平
  728.             SETB   EC11B         ;拉高編碼器B引腳電平
  729.             JNB    EC11A,Scan21  ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動(dòng)作
  730.             JNB    EC11B,Scan21  ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動(dòng)作
  731.             CLR    00H           ;沒(méi)有旋轉(zhuǎn)動(dòng)作,把位地址00H置為0
  732.             RET
  733.     Scan21:
  734.             SETB   00H           ;有旋轉(zhuǎn)動(dòng)作,把位地址00H置為1
  735.     Scan22: RET

  736.     ;-----------------------------------------------------------
  737.     ;子程序:掃描按鍵,未按C=0,已按下C=1
  738.     ;-----------------------------------------------------------
  739.     SKEY:
  740.             LCALL  SKEY0      ;掃描按鍵
  741.             JNC    SKEYE      ;如果沒(méi)有按鍵動(dòng)作(C為0)就轉(zhuǎn)移退出
  742.             LCALL  SMCL       ;有按鍵動(dòng)作,調(diào)用睡眠處理子程序
  743.             JZ     SKEYE      ;如果是0(從睡眠狀態(tài)喚醒)就轉(zhuǎn)移,下次才退出“始終導(dǎo)通”狀態(tài)
  744.             LCALL  TCSZDT     ;退出上電延時(shí)導(dǎo)通的“始終導(dǎo)通”狀態(tài)
  745.     SKEYE:  RET
  746.     SKEY0:
  747.             LCALL  WG         ;喂狗
  748.             SETB   KEY        ;按鍵端口置為高電平
  749.             JNB    KEY,SKEY1  ;為0(低電平)就轉(zhuǎn)移,表示按鍵已經(jīng)被按下
  750.             CLR    C          ;C置為0,沒(méi)有按鍵動(dòng)作
  751.             RET
  752.     SKEY1:
  753.             LCALL  DELAY10    ;延時(shí)10毫秒
  754.             LCALL  DELAY10    ;延時(shí)10毫秒
  755.             SETB   KEY        ;延時(shí)結(jié)束后再次把按鍵端口置為高電平
  756.             JNB    KEY,SKEY2  ;為0(低電平,按鍵被有效按下)就轉(zhuǎn)移
  757.             CLR    C          ;C置為0,沒(méi)有按鍵動(dòng)作
  758.             RET               ;按鍵未被有效按下,退出
  759.     SKEY2:
  760.             SETB   C          ;C置為1,按鍵已有效按下
  761.             RET

  762.     ;------------------ 掃描按鍵500毫秒,有按鍵動(dòng)作A=0,無(wú)按鍵動(dòng)作A=1 ------------------
  763.     KEYA:
  764.             MOV    SHMJS,#50  ;等待500毫秒
  765.     KEYB:
  766.             MOV    A,SHMJS    ;裝入(10)毫秒計(jì)數(shù)
  767.             JZ     KEYC       ;為0(時(shí)間到)就轉(zhuǎn)移
  768.             LCALL  SKEY0      ;掃描按鍵
  769.             JNC    KEYB       ;沒(méi)有按鍵動(dòng)作(C=0)就轉(zhuǎn)移
  770.             CLR    A          ;有按鍵動(dòng)作A=0
  771.             RET
  772.     KEYC:
  773.             MOV    A,#1       ;等待時(shí)間已到,A=1沒(méi)有按鍵動(dòng)作
  774.             RET

  775.     ;------------------ 等待按鍵釋放 ------------------
  776.     KEYEX:        
  777.             LCALL  SKEY0      ;掃描按鍵
  778.             JC     KEYEX      ;如果C=1(按鍵還沒(méi)釋放)就繼續(xù)掃描
  779.             RET

  780.     ;------------------ 延時(shí)10毫秒 ------------------
  781.     DELAY10:   ;@11.0592MHz
  782.             NOP
  783.             NOP
  784.             NOP
  785.             PUSH   16H
  786.             PUSH   17H
  787.             MOV    16H,#87
  788.             MOV    17H,#10
  789.     NEXT:
  790.             DJNZ   17H,NEXT
  791.             DJNZ   16H,NEXT
  792.             POP    17H
  793.             POP    16H
  794.             RET

  795.     ;-----------------------------------------------------------------------------------
  796.     ;子程序:睡眠模式處理,如果當(dāng)前處于睡眠狀態(tài)就重新放入睡眠倒計(jì)時(shí),恢復(fù)顯示,等待
  797.     ;編碼器或按鍵動(dòng)作結(jié)束并延時(shí)2秒才退出;如果不是睡眠狀態(tài),重新放入睡眠計(jì)時(shí),返回
  798.     ;出口參數(shù):A=0從睡眠狀態(tài)喚醒
  799.     ;-----------------------------------------------------------------------------------
  800.     SMCL:
  801.             MOV    A,SMMS       ;裝入睡眠模式設(shè)置值
  802.             JNZ    SMCL1        ;不為0就轉(zhuǎn)移
  803.             INC    A            ;為0,加1,使返回時(shí)A不為0
  804.             RET                 ;當(dāng)前睡眠模式為“始終顯示”,返回
  805.     SMCL1:
  806.             MOV    A,SMJSF      ;裝入睡眠計(jì)時(shí)(分)
  807.             JNZ    SMCL2        ;不為0就轉(zhuǎn)移
  808.             MOV    A,SMJSM      ;裝入睡眠計(jì)時(shí)(秒)
  809.             JZ     SMCL3        ;是0就轉(zhuǎn)移
  810.     SMCL2:
  811.             MOV    SMJSF,SMMS   ;不為0,還沒(méi)進(jìn)入睡眠狀態(tài),重新放入倒計(jì)時(shí)
  812.             MOV    SMJSM,#0     ;不為0,還沒(méi)進(jìn)入睡眠狀態(tài),重新放入倒計(jì)時(shí)
  813.             RET
  814.     SMCL3:
  815.             MOV    SMJSF,SMMS   ;已進(jìn)入睡眠狀態(tài),重新放入倒計(jì)時(shí),喚醒睡眠,恢復(fù)顯示
  816.             MOV    SMJSM,#0     ;已進(jìn)入睡眠狀態(tài),重新放入倒計(jì)時(shí),喚醒睡眠,恢復(fù)顯示
  817.             INC    XSHC1        ;改變XSHC1數(shù)據(jù),觸發(fā)“立即顯示”
  818.     SMCL4:
  819.             MOV    SMJS,#2      ;放入秒計(jì)時(shí)
  820.     SMCL5:
  821.             LCALL  WG           ;喂狗
  822.             SETB   KEY          ;按鍵端口置為高電平
  823.             SETB   EC11A        ;編碼器A引腳置為高電平
  824.             SETB   EC11B        ;編碼器B引腳置為高電平
  825.             JNB    KEY,SMCL4    ;為0(低電平)未釋放就轉(zhuǎn)移
  826.             JNB    EC11A,SMCL4  ;為0(低電平)未釋放就轉(zhuǎn)移
  827.             JNB    EC11B,SMCL4  ;為0(低電平)未釋放就轉(zhuǎn)移
  828.             MOV    A,SMJS       ;裝入計(jì)時(shí)
  829.             JNZ    SMCL5        ;不為0就轉(zhuǎn)移繼續(xù)掃描按鍵和編碼器
  830.             CLR    C            ;C置為0,沒(méi)有按鍵動(dòng)作
  831.             CLR    00H          ;把位地址00H置為0,沒(méi)有旋轉(zhuǎn)動(dòng)作
  832.             RET

  833.     ;-------------------------------------------------------------------------------------
  834.     ;子程序:退出始終導(dǎo)通狀態(tài)處理。當(dāng)進(jìn)入“延時(shí)時(shí)間到后始終導(dǎo)通”狀態(tài)時(shí),按鍵、編碼器有
  835.     ;動(dòng)作就退出始終導(dǎo)通狀態(tài),切換到“導(dǎo)通時(shí)間”的結(jié)束(斷開(kāi))狀態(tài),如設(shè)置為循環(huán)定時(shí),就轉(zhuǎn)
  836.     ;換到“斷開(kāi)時(shí)間”繼續(xù)運(yùn)行。
  837.     ;-------------------------------------------------------------------------------------
  838.     TCSZDT:
  839.             JB     07H,TC1   ;如果為1(已進(jìn)入“上電延時(shí)導(dǎo)通”的始終導(dǎo)通狀態(tài))就轉(zhuǎn)移
  840.             RET
  841.     TC1:
  842.             MOV    A,XHDS    ;裝入“循環(huán)定時(shí)”設(shè)置
  843.             CJNE   A,#1,TC2  ;不是1(不循環(huán))就轉(zhuǎn)移
  844.             MOV    DQZT,#0   ;把當(dāng)前狀態(tài)切換到“導(dǎo)通”
  845.             CLR    07H       ;位地址07H置為0(正常)
  846.             LCALL  SMCL4     ;等待編碼器或按鍵動(dòng)作結(jié)束后延時(shí)2秒才退出
  847.             RET
  848.     TC2:
  849.             MOV    DQZT,#1      ;把當(dāng)前狀態(tài)設(shè)為1,從“斷開(kāi)時(shí)間”繼續(xù)運(yùn)行
  850.             MOV    DSSJS,DKS    ;裝入“斷開(kāi)時(shí)間”
  851.             MOV    DSSJF,DKF    ;裝入“斷開(kāi)時(shí)間”
  852.             MOV    DSSJM,DKM    ;裝入“斷開(kāi)時(shí)間”
  853.             MOV    DSSJHM,DKHM  ;裝入“斷開(kāi)時(shí)間”
  854.             CLR    07H          ;位地址07H置為0(正常)
  855.             LCALL  SMCL4        ;等待編碼器或按鍵動(dòng)作結(jié)束后延時(shí)2秒才退出
  856.             RET

  857.     ;------------------------------------------------------------------------
  858.     ;子程序:T0中斷調(diào)用,時(shí)間計(jì)數(shù)及倒計(jì)時(shí)處理、狀態(tài)切換
  859.     ;------------------------------------------------------------------------
  860.     TIME:
  861.             LCALL  TIME6          ;部分時(shí)間計(jì)數(shù)及倒計(jì)時(shí)處理
  862.             JB     02H,TIME1      ;如果位地址02H為1(暫停)就轉(zhuǎn)移退出,停止計(jì)時(shí)
  863.             MOV    A,DSSJHM       ;裝入定時(shí)時(shí)間(10)毫秒計(jì)數(shù)
  864.             JZ     TIME2          ;如果是0就轉(zhuǎn)移
  865.             DEC    A              ;DSSJHM不是0,減1
  866.             MOV    DSSJHM,A       ;DSSJHM不是0,減1
  867.             JNZ    TIME1          ;減1后不為0就轉(zhuǎn)移退出
  868.             MOV    A,DSSJM        ;裝入定時(shí)時(shí)間(秒)到寄存器A
  869.             JNZ    TIME1          ;如果(秒)不是0就轉(zhuǎn)移退出
  870.             MOV    A,DSSJF        ;裝入定時(shí)時(shí)間(分)到寄存器A
  871.             JNZ    TIME1          ;如果(分)不是0就轉(zhuǎn)移退出
  872.             MOV    A,DSSJS        ;裝入定時(shí)時(shí)間(時(shí))到寄存器A
  873.             JNZ    TIME1          ;如果(時(shí))不是0就轉(zhuǎn)移退出
  874.             LCALL  ZTQH           ;時(shí)、分、秒都是0了,狀態(tài)切換
  875.     TIME1:  RET
  876.     TIME2:
  877.             MOV    A,DSSJM        ;裝入定時(shí)時(shí)間(秒)到寄存器A
  878.             JZ     TIME3          ;如果是0就轉(zhuǎn)移
  879.             DEC    DSSJM          ;不是0,減1秒
  880.             MOV    DSSJHM,#99     ;重新放入(10)毫秒計(jì)數(shù)值
  881.             MOV    HMJS,#99       ;重新放入(10)毫秒計(jì)數(shù)值,使DSSJHM與HMJS同步
  882.             RET
  883.     TIME3:
  884.             MOV    A,DSSJF        ;裝入定時(shí)時(shí)間(分)到寄存器A
  885.             JZ     TIME4          ;如果是0就轉(zhuǎn)移
  886.             DEC    DSSJF          ;不是0,減1分
  887.             MOV    DSSJM,#59      ;把59放入定時(shí)時(shí)間(秒)
  888.             MOV    DSSJHM,#99     ;重新放入(10)毫秒計(jì)數(shù)值
  889.             MOV    HMJS,#99       ;重新放入(10)毫秒計(jì)數(shù)值
  890.             RET
  891.     TIME4:
  892.             MOV    A,DSSJS        ;裝入定時(shí)時(shí)間(時(shí))到寄存器A
  893.             JNZ    TIME5          ;不是0就轉(zhuǎn)移
  894.             LCALL  ZTQH           ;狀態(tài)切換
  895.             RET
  896.     TIME5:        
  897.             DEC    DSSJS          ;不是0,小時(shí)減1
  898.             MOV    DSSJM,#59      ;把59放入定時(shí)時(shí)間(秒)
  899.             MOV    DSSJF,#59      ;把59放入定時(shí)時(shí)間(分)
  900.             MOV    DSSJHM,#99     ;重新放入(10)毫秒計(jì)數(shù)值
  901.             MOV    HMJS,#99       ;重新放入(10)毫秒計(jì)數(shù)值
  902.             RET
  903.     TIME6:
  904.             MOV    A,SHMJS        ;裝入(10)毫秒計(jì)數(shù)
  905.             JZ     TIME7          ;如果是0就轉(zhuǎn)移
  906.             DEC    SHMJS          ;每10毫秒減1,直到為0
  907.     TIME7:
  908.             MOV    A,HMJS         ;裝入(10)毫秒計(jì)數(shù)2
  909.             JZ     TIME9          ;如果是0就轉(zhuǎn)移
  910.             DEC    HMJS           ;不是0,減1
  911.             CJNE   A,#50,TIME8    ;如果不是50就轉(zhuǎn)移退出
  912.             SETB   05H            ;位地址第05位置為1,數(shù)字及冒號(hào)閃爍時(shí)用,每0.5秒變化一次
  913.     TIME8:  RET
  914.     TIME9:
  915.             CLR    05H            ;位地址第05位置為0,數(shù)字及冒號(hào)閃爍時(shí)用,每0.5秒變化一次
  916.             MOV    HMJS,#99       ;重新放入計(jì)數(shù)值(1秒)
  917.             MOV    A,MJS          ;裝入秒計(jì)數(shù)
  918.             JZ     TIME10         ;如果是0就轉(zhuǎn)移
  919.             DEC    MJS            ;每秒減1,直到為0
  920.     TIME10:
  921.             MOV    A,YSXY         ;裝入“延時(shí)響應(yīng)”秒計(jì)數(shù)
  922.             JZ     TIME11         ;如果是0就轉(zhuǎn)移
  923.             DEC    YSXY           ;每秒減1,直到為0
  924.     TIME11:
  925.             JNB     09H,TIME12    ;位地址09H不為1(允許恢復(fù)響應(yīng)按鍵動(dòng)作)就轉(zhuǎn)移
  926.             JNB     08H,TIME12    ;位地址08H不為1(禁止響應(yīng)按鍵動(dòng)作)就轉(zhuǎn)移
  927.             SETB    KEY           ;按鍵端口置為高電平
  928.             JNB     KEY,TIME12    ;為0(低電平,按鍵為按下?tīng)顟B(tài))就轉(zhuǎn)移
  929.             CLR     08H           ;位地址08H置為0(恢復(fù)響應(yīng)按鍵動(dòng)作)
  930.             CLR     09H           ;位地址09H置為0(正常)
  931.     TIME12:
  932.             MOV     A,SMJS        ;裝入睡眠模式處理計(jì)時(shí)
  933.             JZ      TIME13        ;如果是0就轉(zhuǎn)移
  934.             DEC     SMJS          ;不是0,減1秒
  935.     TIME13:        
  936.             MOV     A,SMJSM       ;裝入睡眠倒計(jì)時(shí)(秒)
  937.             JZ      TIME14        ;如果是0就轉(zhuǎn)移
  938.             DEC     SMJSM         ;(秒)減1
  939.             RET
  940.     TIME14:
  941.             MOV     A,SMJSF       ;裝入睡眠倒計(jì)時(shí)(分)
  942.             JNZ     TIME15        ;如果不是0就轉(zhuǎn)移
  943.             RET
  944.     TIME15:        
  945.             DEC     SMJSF         ;(分)減1
  946.             MOV     SMJSM,#59     ;放入59(秒)
  947.             RET
  948.     ZTQH:
  949.             MOV     A,DQZT        ;裝入“當(dāng)前狀態(tài)”,0=導(dǎo)通、1=斷開(kāi),2=上電延時(shí)導(dǎo)通
  950.             CJNE    A,#2,ZTQH2    ;不是“上電延時(shí)導(dǎo)通”狀態(tài)就轉(zhuǎn)移
  951.             MOV     A,YSMS        ;裝入延時(shí)導(dǎo)通模式
  952.             JNZ     ZTQH0         ;如果不是0(延時(shí)時(shí)間到后始終導(dǎo)通)就轉(zhuǎn)移
  953.             SETB    07H           ;位地址07H置為1,始終導(dǎo)通
  954.             RET
  955.     ZTQH0:
  956.             CJNE    A,#1,ZTQH6    ;不是1(從“導(dǎo)通時(shí)間”繼續(xù)運(yùn)行)就轉(zhuǎn)移,從“斷開(kāi)時(shí)間”繼續(xù)運(yùn)行
  957.     ZTQH1:
  958.             MOV     DQZT,#0       ;切換到“導(dǎo)通時(shí)間”狀態(tài)
  959.             MOV     DSSJS,DTS     ;把“導(dǎo)通時(shí)間”放入“定時(shí)時(shí)間”
  960.             MOV     DSSJF,DTF     ;把“導(dǎo)通時(shí)間”放入“定時(shí)時(shí)間”
  961.             MOV     DSSJM,DTM     ;把“導(dǎo)通時(shí)間”放入“定時(shí)時(shí)間”
  962.             MOV     DSSJHM,DTHM   ;把“導(dǎo)通時(shí)間”放入“定時(shí)時(shí)間”
  963.             RET
  964.     ZTQH2:
  965.             CLR     07H          ;位地址07H置為0(正常)
  966.             JNZ     ZTQH1        ;是1(斷開(kāi)時(shí)間)狀態(tài)就轉(zhuǎn)移,切換到“導(dǎo)通時(shí)間”狀態(tài)
  967.             MOV     A,XHDS       ;是“導(dǎo)通時(shí)間”狀態(tài),裝入循環(huán)模式
  968.             SETB    09H          ;位地址09H置為1(允許恢復(fù)響應(yīng)按鍵動(dòng)作)
  969.             CJNE    A,#1,ZTQH3   ;不是1(不循環(huán))就轉(zhuǎn)移,0=無(wú)限循環(huán);1=不循環(huán);2~99=導(dǎo)通次數(shù)
  970.             RET                  ;是不循環(huán),退出
  971.     ZTQH3:
  972.             JZ      ZTQH5        ;是0(無(wú)限循環(huán))就轉(zhuǎn)移
  973.             MOV     A,XHJS       ;裝入導(dǎo)通次數(shù)計(jì)數(shù)
  974.             DEC     A            ;檢查導(dǎo)通次數(shù)是否已到,不到就轉(zhuǎn)移
  975.             JNZ     ZTQH4        ;檢查導(dǎo)通次數(shù)是否已到,不到就轉(zhuǎn)移
  976.             RET
  977.     ZTQH4:
  978.             DEC     XHJS         ;導(dǎo)通次數(shù)減1
  979.     ZTQH5:
  980.             MOV     A,DKS        ;
  981.             JNZ     ZTQH7        ;檢查“斷開(kāi)時(shí)間”不為0才切換到“斷開(kāi)時(shí)間”
  982.             MOV     A,DKF        ;
  983.             JNZ     ZTQH7        ;檢查“斷開(kāi)時(shí)間”不為0才切換到“斷開(kāi)時(shí)間”
  984.             MOV     A,DKM        ;
  985.             JNZ     ZTQH7        ;檢查“斷開(kāi)時(shí)間”不為0才切換到“斷開(kāi)時(shí)間”
  986.             MOV     A,DKHM       ;
  987.             JNZ     ZTQH7        ;檢查“斷開(kāi)時(shí)間”不為0才切換到“斷開(kāi)時(shí)間”
  988.             RET
  989.     ZTQH6:
  990.             SETB    08H          ;位地址08H置為1,不響應(yīng)按鍵動(dòng)作。
  991.     ZTQH7:
  992.             MOV     DQZT,#1      ;切換到“斷開(kāi)時(shí)間”狀態(tài)
  993.             MOV     DSSJS,DKS    ;把“斷開(kāi)時(shí)間”放入“定時(shí)時(shí)間”
  994.             MOV     DSSJF,DKF    ;把“斷開(kāi)時(shí)間”放入“定時(shí)時(shí)間”
  995.             MOV     DSSJM,DKM    ;把“斷開(kāi)時(shí)間”放入“定時(shí)時(shí)間”
  996.             MOV     DSSJHM,DKHM  ;把“斷開(kāi)時(shí)間”放入“定時(shí)時(shí)間”
  997.             RET

  998.     ;-----------------------------------------------------------------------
  999.     ;子程序:T0中斷調(diào)用,顯示定時(shí)時(shí)間及各項(xiàng)設(shè)置的內(nèi)容
  1000.     ;-----------------------------------------------------------------------
  1001.     DISPLAY:
  1002.             JB    06H,DPYSZ1     ;如果位地址06H為1就轉(zhuǎn)移退出,主程序顯示88:88或E1
  1003.             MOV   A,DISPL        ;裝入要顯示的目標(biāo)(項(xiàng)目號(hào))
  1004.             JZ    DISPL0         ;如果是0(顯示定時(shí)時(shí)間)就轉(zhuǎn)移
  1005.             MOV   B,#2
  1006.             MUL   AB             ;項(xiàng)目號(hào)乘2
  1007.             DEC   A
  1008.             DEC   A              ;把計(jì)算結(jié)果減2
  1009.             PUSH  ACC            ;寄存器A的內(nèi)容壓入堆棧
  1010.             MOV   DPTR,#SEGTAB2  ;字形碼首址
  1011.             MOVC  A,@A+DPTR      ;查表獲取字形碼
  1012.             MOV   ZXM1,A         ;項(xiàng)目字形碼放到待發(fā)送TM1637區(qū)1
  1013.             POP   ACC            ;彈出上面壓入堆棧的內(nèi)容到寄存器A
  1014.             INC   A              ;地址加1
  1015.             MOVC  A,@A+DPTR      ;查表獲取字形碼
  1016.             MOV   ZXM2,A         ;項(xiàng)目字形碼放到待發(fā)送TM1637區(qū)2
  1017.             MOV   A,DISPL        ;裝入項(xiàng)目號(hào)
  1018.             DEC   A              ;減1
  1019.             ADD   A,#DTS         ;加各項(xiàng)設(shè)置值始址,得出設(shè)置項(xiàng)目的實(shí)際地址
  1020.             MOV   R1,A           ;地址放入R1
  1021.             MOV   A,@R1          ;裝入設(shè)置值
  1022.             MOV   B,A            ;放進(jìn)寄存器B
  1023.             CJNE  A,XSHC1,DPYSZ3 ;當(dāng)前設(shè)置值與顯示緩存1不相同就轉(zhuǎn)移,立即顯示
  1024.             MOV   A,HMJS         ;相同,裝入(10)毫秒計(jì)數(shù)2
  1025.             CJNE  A,#99,DPYSZ2   ;不是99就轉(zhuǎn)移,每0.5秒顯示一次
  1026.             LJMP  DPYSZ3         ;是,顯示
  1027.     DPYSZ1: RET
  1028.     DPYSZ2:
  1029.             CJNE   A,#49,DPYSZ1 ;不是49就轉(zhuǎn)移退出,每0.5秒顯示一次
  1030.     DPYSZ3:
  1031.             MOV    XSHC1,B      ;當(dāng)前設(shè)置值放入顯示緩存1
  1032.             MOV    A,B          ;當(dāng)前設(shè)置值放入A寄存器
  1033.             MOV    R0,#ZXM3     ;待發(fā)送TM1637區(qū)3地址
  1034.             LCALL  BCD          ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)3和4
  1035.             JNB    04H,DPYSZ4   ;如果位地址04H為0(不閃爍)就轉(zhuǎn)移
  1036.             JNB    05H,DPYSZ4   ;為1,閃爍顯示,如果位地址05H為0(顯示)就轉(zhuǎn)移
  1037.             MOV    ZXM3,#0      ;處于閃爍顯示中的“不顯示”狀態(tài),放入消隱碼
  1038.             MOV    ZXM4,#0      ;處于閃爍顯示中的“不顯示”狀態(tài),放入消隱碼
  1039.     DPYSZ4:
  1040.             LCALL  disp         ;發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示
  1041.             RET
  1042.     DISPL0:
  1043.             MOV    R1,#DSSJS    ;把定時(shí)時(shí)間“時(shí)”的地址放入R1
  1044.             MOV    A,@R1        ;裝入“時(shí)”
  1045.             JZ     DISPL1       ;如果“時(shí)”為0就轉(zhuǎn)移
  1046.             LJMP   DISPL3
  1047.     DISPL1:
  1048.             CLR    05H          ;“時(shí)”為0,把位地址05H置為0,始終顯示冒號(hào)
  1049.             INC    R1           ;地址加1,指向“分”
  1050.             MOV    A,@R1        ;裝入“分”
  1051.             JZ     DISPL2       ;如果“分”為0就轉(zhuǎn)移
  1052.             LJMP   DISPL3
  1053.     DISPL2:
  1054.             INC    R1           ;地址加1,指向“秒”
  1055.             MOV    A,@R1        ;裝入“秒”
  1056.     DISPL3:
  1057.             CJNE   A,XSHC1,DISPL6  ;寄存器A的數(shù)據(jù)與顯示緩存1不相同就轉(zhuǎn)移,立即顯示
  1058.             INC    R1              ;地址加1
  1059.             MOV    A,@R1           ;裝入
  1060.             DEC    R1              ;地址減1
  1061.             CJNE   A,XSHC2,DISPL6  ;寄存器A的數(shù)據(jù)與顯示緩存2不相同就轉(zhuǎn)移,立即顯示
  1062.             MOV    A,HMJS          ;都相同,裝入(10)毫秒時(shí)間計(jì)數(shù)2
  1063.             CJNE   A,#99,DISPL5    ;不是99就轉(zhuǎn)移
  1064.             LJMP   DISPL6          ;是,顯示(每0.5秒顯示一次)
  1065.     DISPL4: RET
  1066.     DISPL5:
  1067.             CJNE   A,#49,DISPL4    ;不是49就轉(zhuǎn)移退出,每0.5秒顯示一次
  1068.     DISPL6:
  1069.             INC    R1          ;地址加1
  1070.             MOV    A,@R1       ;裝入后面一位時(shí)間
  1071.             MOV    XSHC2,A     ;放入緩存2
  1072.             DEC    R1          ;地址減1
  1073.             MOV    A,@R1       ;裝入前面一位時(shí)間
  1074.             MOV    XSHC1,A     ;放入緩存1
  1075.             MOV    R0,#ZXM1    ;待發(fā)送TM1637區(qū)1地址
  1076.             LCALL  BCD         ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)1、2
  1077.             INC    R1          ;地址加1
  1078.             MOV    R0,#ZXM3    ;待發(fā)送TM1637區(qū)3地址
  1079.             MOV    A,@R1       ;裝入后面一位時(shí)間
  1080.             LCALL  BCD         ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)3、4
  1081.             JB     02H,DISPL7  ;如果02H為1(暫停)就轉(zhuǎn)移,始終顯示冒號(hào)
  1082.             JB     05H,DISPL8  ;如果05H為1就轉(zhuǎn)移,不顯示冒號(hào)
  1083.     DISPL7:
  1084.             ORL    ZXM2,#10000000B   ;把最高位置為1(最高位為1就顯示冒號(hào))
  1085.     DISPL8:
  1086.             LCALL  disp        ;發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示
  1087.             RET
  1088.     BCD:
  1089.             MOV    B,#10       ;轉(zhuǎn)換為BCD碼
  1090.             DIV    AB          ;轉(zhuǎn)換為BCD碼
  1091.             MOV    DPTR,#SEGTAB   ;查表獲取字形碼
  1092.             MOVC   A,@A+DPTR   ;查表獲取字形碼
  1093.             MOV    @R0,A       ;字形碼放入待發(fā)送TM1637區(qū)
  1094.             XCH    A,B         ;A、B寄存器內(nèi)容交換
  1095.             MOVC   A,@A+DPTR   ;查表獲取字形碼
  1096.             INC    R0          ;地址加1
  1097.             MOV    @R0,A       ;字形碼放入待發(fā)送TM1637區(qū)
  1098.             RET

  1099.     ;------------------ 發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示,地址自動(dòng)加1 ------------------
  1100.     disp:
  1101.             MOV    A,SMMS     ;裝入設(shè)置的睡眠模式
  1102.             JZ     disp0      ;如果為0(始終顯示)就轉(zhuǎn)移
  1103.             MOV    A,SMJSF    ;裝入睡眠計(jì)時(shí)(分)
  1104.             JNZ    disp0      ;不為0(未進(jìn)入睡眠狀態(tài))就轉(zhuǎn)移
  1105.             MOV    A,SMJSM    ;裝入睡眠計(jì)時(shí)(秒)
  1106.             JNZ    disp0      ;不為0(未進(jìn)入睡眠狀態(tài))就轉(zhuǎn)移
  1107.             CLR    A          ;已進(jìn)入睡眠狀態(tài),放入消隱碼(0)
  1108.             MOV    ZXM1,A     ;放入消隱碼
  1109.             MOV    ZXM2,A     ;放入消隱碼
  1110.             MOV    ZXM3,A     ;放入消隱碼
  1111.             MOV    ZXM4,A     ;放入消隱碼
  1112.     disp0:
  1113.             LCALL  Srt
  1114.             MOV    A,#040H    ;數(shù)據(jù)命令設(shè)置40H:地址自動(dòng)加1,寫(xiě)數(shù)據(jù)到顯示寄存器
  1115.             LCALL  Writebyte  ;發(fā)送一個(gè)字節(jié)
  1116.             LCALL  Stop
  1117.             NOP
  1118.             LCALL  Srt
  1119.             MOV    A,#0C0H    ;地址命令設(shè)置C0H:初始地址為00H
  1120.             LCALL  Writebyte  ;發(fā)送一個(gè)字節(jié)
  1121.             MOV    R6,#4      ;發(fā)送4個(gè)字節(jié)數(shù)據(jù)
  1122.             MOV    R1,#ZXM1   ;等待發(fā)送的字形碼始址
  1123.     disp1:
  1124.             MOV    A,@R1      ;裝入要發(fā)送的字形碼
  1125.             LCALL  Writebyte  ;發(fā)送一個(gè)字節(jié)
  1126.             INC    R1         ;地址加1
  1127.             DJNZ   R6,disp1   ;如果還未發(fā)送完就繼續(xù)
  1128.             LCALL  Stop
  1129.             LCALL  Srt
  1130.             MOV    A,SMGLD    ;裝入設(shè)置的數(shù)碼管亮度(1~8)
  1131.             ADD    A,#087H    ;加上87H后即為對(duì)應(yīng)的亮度控制命令88H~8FH
  1132.             LCALL  Writebyte  ;按設(shè)置的亮度開(kāi)顯示
  1133.             LCALL  Stop
  1134.             RET

  1135.     ;------------------ 發(fā)送8bit(一個(gè)字節(jié))數(shù)據(jù)到TM1637,A=要發(fā)送的數(shù)據(jù),從低位開(kāi)始 ------------------
  1136.     Writebyte:
  1137.             MOV   R7,#8       ;發(fā)送8位數(shù)據(jù)
  1138.     WBY1:
  1139.             CLR   CLK         ;拉低CLK
  1140.             JNB   ACC.0,WBY2  ;A寄存器的低位(0位)如果為0就轉(zhuǎn)移
  1141.             SETB  DIO         ;為1,拉高DIO
  1142.             SJMP  WBY3
  1143.     WBY2:
  1144.             CLR   DIO       ;為0,拉低DIO
  1145.     WBY3:
  1146.             MOV   R4,#13    ;延時(shí)
  1147.     WBY4:
  1148.             DJNZ  R4,WBY4   ;延時(shí)
  1149.             SETB  CLK       ;拉高CLK
  1150.             CLR   C         ;進(jìn)位標(biāo)志清0
  1151.             RRC   A         ;A寄存器內(nèi)容帶進(jìn)位循環(huán)右移
  1152.             DJNZ  R7,WBY1   ;如果還未發(fā)送完8bit數(shù)據(jù)就繼續(xù)
  1153.             CLR   CLK       ;8位數(shù)據(jù)發(fā)送完了
  1154.             MOV   R7,#20    ;設(shè)置等待應(yīng)答信號(hào)延時(shí)計(jì)數(shù)
  1155.     WBY5:
  1156.             JNB   DIO,WBY6  ;判斷TM1637發(fā)過(guò)來(lái)的ACK應(yīng)答信號(hào),應(yīng)答就轉(zhuǎn)移(0,低電平)
  1157.             DJNZ  R7,WBY5   ;
  1158.     WBY6:
  1159.             MOV   R4,#13    ;延時(shí)
  1160.     WBY7:
  1161.             DJNZ  R4,WBY7   ;延時(shí)
  1162.             SETB  CLK
  1163.             MOV   R4,#13    ;延時(shí)
  1164.     WBY8:
  1165.             DJNZ  R4,WBY8   ;延時(shí)
  1166.             RET         

  1167.     ;------------------ Start子程序 ------------------
  1168.     Srt:
  1169.             SETB   DIO       ;拉高DIO
  1170.             SETB   CLK       ;拉高CLK
  1171.             MOV    R4,#13    ;延時(shí)
  1172.     SrtY1:
  1173.             DJNZ   R4,SrtY1  ;延時(shí)
  1174.             SETB   DIO       ;拉高DIO
  1175.             MOV    R4,#13    ;延時(shí)
  1176.     SrtY2:
  1177.             DJNZ   R4,SrtY2  ;延時(shí)
  1178.             CLR    DIO       ;拉低DIO
  1179.             MOV    R4,#13    ;延時(shí)
  1180.     SrtY3:
  1181.             DJNZ   R4,SrtY3  ;延時(shí)
  1182.             CLR   CLK        ;拉低CLK
  1183.             RET         

  1184.     ;------------------ Stop子程序 ------------------
  1185.     Stop:
  1186.             CLR   CLK
  1187.             MOV   R4,#30
  1188.     StopY1:
  1189.             DJNZ  R4,StopY1
  1190.             CLR   DIO
  1191.             MOV   R4,#30
  1192.     StopY2:
  1193.             DJNZ  R4,StopY2
  1194.             SETB  CLK
  1195.             MOV   R4,#40
  1196.     StopY3:
  1197.             DJNZ  R4,StopY3
  1198.             SETB  DIO
  1199.             MOV   R4,#30
  1200.     StopY4:
  1201.             DJNZ  R4,StopY4
  1202.             CLR   CLK
  1203.             CLR   DIO
  1204.             RET         

  1205.     ;********************** 以下為EEPROM操作子程序 **********************
  1206.     ;STC15F104W有1K字節(jié)的EEPROM,共2個(gè)扇區(qū),第1扇區(qū):0000H~01FFH;第2扇區(qū):0200H~03FFH
  1207.     ;-------------------------------------------
  1208.     ;讀一字節(jié),A=讀出的數(shù)據(jù)
  1209.     Byte_Read:
  1210.             MOV  IAP_CONTR,#ENABLE_IAP  ;打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間(83H)
  1211.             MOV  IAP_CMD,#01            ;設(shè)置為IAP/ISP/EEPROM字節(jié)讀模式命令(1)
  1212.             MOV  IAP_TRIG,#05AH         ;先送5AH
  1213.             MOV  IAP_TRIG,#0A5H         ;再送A5H,ISP/IAP命令立即被觸發(fā)起動(dòng)
  1214.             NOP
  1215.             MOV  A,IAP_DATA             ;讀出的數(shù)據(jù)在IAP_DATA單元中,送入累加器A
  1216.             RET
  1217.     ;-------------------------------------------
  1218.     ;字節(jié)編程,A=需寫(xiě)入的數(shù)據(jù)
  1219.     Byte_Program:
  1220.             MOV  IAP_CONTR,#ENABLE_IAP  ;打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間(83H)
  1221.             MOV  IAP_CMD,#02            ;設(shè)置為IAP/ISP/EEPROM字節(jié)編程模式命令(2)
  1222.             MOV  IAP_DATA,A             ;要編程的數(shù)據(jù)先送進(jìn)IAP_DATA寄存器
  1223.             MOV  IAP_TRIG,#05AH         ;先送5AH
  1224.             MOV  IAP_TRIG,#0A5H         ;再送A5H,ISP/IAP命令立即被觸發(fā)起動(dòng)
  1225.             RET
  1226.     ;-------------------------------------------
  1227.     ;擦除扇區(qū)
  1228.     Sector_Erase:
  1229.             MOV  IAP_CONTR,#ENABLE_IAP  ;打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間(83H)
  1230.             MOV  IAP_CMD,#03            ;設(shè)置為IAP/ISP/EEPROM扇區(qū)擦除模式命令(3)
  1231.             MOV  IAP_TRIG,#05AH         ;先送5AH
  1232.             MOV  IAP_TRIG,#0A5H         ;再送A5H,ISP/IAP命令立即被觸發(fā)起動(dòng)
  1233.             NOP
  1234.             RET

  1235.     ;---------- 讀EEPROM保存的各項(xiàng)設(shè)置,如果沒(méi)有就設(shè)置為默認(rèn)值并保存 ------------
  1236.     REEP:
  1237.             LCALL  RE00          ;讀EEPROM保存的各項(xiàng)設(shè)置
  1238.             MOV    XHJS,XHDS     ;循環(huán)定時(shí)
  1239.             MOV    SMJSF,SMMS    ;睡眠模式
  1240.             MOV    A,SDYSS       ;裝入上電延時(shí)導(dǎo)通(時(shí))
  1241.             JNZ    REYS          ;不是0就轉(zhuǎn)移
  1242.             MOV    A,SDYSF       ;裝入上電延時(shí)導(dǎo)通(分)
  1243.             JNZ    REYS          ;不是0就轉(zhuǎn)移
  1244.             MOV    A,SDYSM       ;裝入上電延時(shí)導(dǎo)通(秒)
  1245.             JZ     REEPR         ;都為0就轉(zhuǎn)移
  1246.     REYS:
  1247.             MOV    DSSJS,SDYSS   ;把“上電延時(shí)導(dǎo)通”時(shí)間放入“定時(shí)時(shí)間”
  1248.             MOV    DSSJF,SDYSF   ;把“上電延時(shí)導(dǎo)通”時(shí)間放入“定時(shí)時(shí)間”
  1249.             MOV    DSSJM,SDYSM   ;把“上電延時(shí)導(dǎo)通”時(shí)間放入“定時(shí)時(shí)間”
  1250.             MOV    DSSJHM,#0  
  1251.             MOV    DQZT,#2       ;設(shè)置當(dāng)前狀態(tài),0=導(dǎo)通、1=斷開(kāi),2=上電延時(shí)導(dǎo)通
  1252.             RET
  1253.     REEPR:
  1254.             MOV    DSSJS,DTS     ;把“導(dǎo)通時(shí)間”放入“定時(shí)時(shí)間”
  1255.             MOV    DSSJF,DTF     ;把“導(dǎo)通時(shí)間”放入“定時(shí)時(shí)間”
  1256.             MOV    DSSJM,DTM     ;把“導(dǎo)通時(shí)間”放入“定時(shí)時(shí)間”
  1257.             MOV    DSSJHM,DTHM   ;把“導(dǎo)通時(shí)間”放入“定時(shí)時(shí)間”
  1258.             MOV    DQZT,#0       ;設(shè)置當(dāng)前狀態(tài),0=導(dǎo)通、1=斷開(kāi),2=上電延時(shí)導(dǎo)通
  1259.             RET
  1260.     RE00:
  1261.             MOV    IAP_ADDRH,#00H  ;從第一個(gè)扇區(qū)開(kāi)始搜索,地址的高8位
  1262.     RE01:
  1263.             MOV    IAP_ADDRL,#00H  ;從第一個(gè)扇區(qū)開(kāi)始搜索,地址的低8位
  1264.             LCALL  Byte_Read     ;讀第一個(gè)字節(jié),返回:A=讀出的數(shù)據(jù)
  1265.             CJNE   A,FWBZ1,RE03  ;是否保存在當(dāng)前扇區(qū),不是就轉(zhuǎn)移到RE03
  1266.             INC    IAP_ADDRL     ;EEPROM字節(jié)地址增1
  1267.             LCALL  Byte_Read     ;讀第二個(gè)字節(jié)
  1268.             CJNE   A,FWBZ2,RE03  ;第二個(gè)字節(jié)是否相符
  1269.             MOV    R1,#FWBZ2     ;相符,從FWBZ2+1處開(kāi)始放置讀出的設(shè)置值
  1270.             MOV    R2,#17        ;再讀出17個(gè)字節(jié)
  1271.     RE02:
  1272.             INC    R1            ;RAM地址增1
  1273.             INC    IAP_ADDRL     ;EEPROM字節(jié)地址增1
  1274.             LCALL  Byte_Read     ;讀一個(gè)字節(jié),返回:A=讀出的數(shù)據(jù)
  1275.             MOV    @R1,A         ;放到R1指向的RAM地址
  1276.             DJNZ   R2,RE02       ;未讀完就繼續(xù)
  1277.             RET                  ;讀完了,退出
  1278.     RE03:
  1279.             MOV    A,IAP_ADDRH  ;裝入扇區(qū)地址的高8位
  1280.             ADD    A,#2         ;扇區(qū)增1
  1281.             MOV    IAP_ADDRH,A  ;放入IAP_ADDRH
  1282.             CJNE   A,#04H,RE01  ;如果未搜索完最后一個(gè)扇區(qū)+2(02H+2=04H)就轉(zhuǎn)移,繼續(xù)搜索
  1283.             LCALL  SZMRZ        ;已經(jīng)搜索全部扇區(qū),未找到保存的內(nèi)容,設(shè)置為默認(rèn)值
  1284.             MOV    R0,#2        ;總扇區(qū)數(shù)量,共2個(gè)扇區(qū)
  1285.             LJMP   WSET3        ;跳轉(zhuǎn)到WSET3保存設(shè)置

  1286.     ;------------------ 保存設(shè)置,不固定保存到某個(gè)扇區(qū),各扇區(qū)輪流使用 ------------------
  1287.     WSET:
  1288.             MOV    R0,#2           ;扇區(qū)總數(shù)量,共2個(gè)扇區(qū)
  1289.             MOV    IAP_ADDRH,#00H  ;從第一個(gè)扇區(qū)開(kāi)始搜索上次保存的設(shè)置
  1290.     WSET1:
  1291.             MOV    IAP_ADDRL,#00H  ;地址低位指向第一個(gè)字節(jié)
  1292.             LCALL  Byte_Read       ;讀第一個(gè)字節(jié),返回:A=讀出的數(shù)據(jù)
  1293.             CJNE   A,FWBZ1,WSET7   ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志1不相同就轉(zhuǎn)移
  1294.             INC    IAP_ADDRL       ;第一個(gè)字節(jié)相同,EEPROM字節(jié)地址增1
  1295.             LCALL  Byte_Read       ;讀第二個(gè)字節(jié)
  1296.             CJNE   A,FWBZ2,WSET7   ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志2不相同就轉(zhuǎn)移
  1297.             MOV    IAP_ADDRL,#0    ;是在當(dāng)前扇區(qū),地址指向扇區(qū)第一個(gè)字節(jié)
  1298.             LCALL  Sector_Erase    ;擦除當(dāng)前扇區(qū),另?yè)Q一個(gè)扇區(qū)保存
  1299.     WSET2:
  1300.             MOV    A,IAP_ADDRH     ;裝入扇區(qū)地址高位到寄存器A
  1301.             CJNE   A,#00H,WSET3    ;當(dāng)前扇區(qū)地址高位如果不是00H(第一個(gè)扇區(qū))就轉(zhuǎn)移
  1302.             MOV    IAP_ADDRH,#04H  ;是00H,把IAP_ADDRH設(shè)置為最后一個(gè)扇區(qū)+2(02H+2=04H)
  1303.     WSET3:
  1304.             DEC    IAP_ADDRH      ;減1
  1305.             DEC    IAP_ADDRH      ;再減1,指向上一個(gè)扇區(qū)首址
  1306.             MOV    IAP_ADDRL,#0   ;低8位指向扇區(qū)第一個(gè)字節(jié)
  1307.             LCALL  Sector_Erase   ;擦除整個(gè)扇區(qū)
  1308.             MOV    R1,#FWBZ1      ;要保存的內(nèi)容始址
  1309.             MOV    R2,#19         ;共19個(gè)字節(jié)
  1310.     WSET4:
  1311.             MOV    A,@R1          ;裝入R1指向的RAM地址的內(nèi)容到A
  1312.             LCALL  Byte_Program   ;字節(jié)編程(寫(xiě)入EEPROM)
  1313.             INC    IAP_ADDRL      ;EEPROM地址加1
  1314.             INC    R1             ;RAM地址增1
  1315.             DJNZ   R2,WSET4       ;未保存完就繼續(xù)
  1316.             MOV    IAP_ADDRL,#0   ;保存完了,扇區(qū)地址低位指向0(當(dāng)前扇區(qū)首址)
  1317.             LCALL  Byte_Read      ;讀出來(lái)檢查看是否寫(xiě)入成功
  1318.             CJNE   A,FWBZ1,WSET5  ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志1不相同就轉(zhuǎn)移
  1319.             INC    IAP_ADDRL      ;EEPROM地址加1
  1320.             LCALL  Byte_Read      ;讀第二個(gè)字節(jié)
  1321.             CJNE   A,FWBZ2,WSET5  ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志2不相同就轉(zhuǎn)移
  1322.             RET                   ;成功了,退出
  1323.     WSET5:
  1324.             DJNZ   R0,WSET2      ;如果未試完全部扇區(qū)就轉(zhuǎn)移到WSET2繼續(xù)往前一個(gè)扇區(qū)寫(xiě)
  1325.             SETB   06H           ;已經(jīng)試完全部扇區(qū),都失敗了,位地址06H置為1
  1326.             MOV    MJS,#5        ;顯示5秒E1
  1327.             MOV    ZXM1,#0       ;消隱碼
  1328.             MOV    ZXM2,#079H    ;E
  1329.             MOV    ZXM3,#006H    ;1
  1330.             MOV    ZXM4,#0       ;消隱碼
  1331.             LCALL  DISP          ;顯示
  1332.     WSET6:
  1333.             MOV    A,MJS
  1334.             LCALL  WG            ;喂狗
  1335.             JNZ    WSET6         ;等待MJS為0秒
  1336.             CLR    06H           ;顯示結(jié)束,位地址06H置為0
  1337.             RET
  1338.     WSET7:
  1339.             MOV    A,IAP_ADDRH   ;裝入扇區(qū)地址高位
  1340.             ADD    A,#2          ;加2,指向下一個(gè)扇區(qū)首址
  1341.             MOV    IAP_ADDRH,A   ;放回IAP_ADDRH
  1342.             CJNE   A,#04H,WSET1  ;如果未到最后一個(gè)扇區(qū)地址高位+2(02H+2=04H)就轉(zhuǎn)移到WSET1繼續(xù)搜索
  1343.             LJMP   WSET3         ;已經(jīng)搜索完所有扇區(qū),未找到上次保存的數(shù)據(jù),跳轉(zhuǎn)到WSET3保存當(dāng)前設(shè)置

  1344.     ;**************************** 以上為EEPROM操作子程序 ****************************

  1345.     ;------------------ 字形表 ------------------
  1346.     SEGTAB:
  1347.             DB  00111111B  ;0(3FH)
  1348.             DB  00000110B  ;1(06H)
  1349.             DB  01011011B  ;2(5BH)
  1350.             DB  01001111B  ;3(4FH)
  1351.             DB  01100110B  ;4(66H)
  1352.             DB  01101101B  ;5(6DH)
  1353.             DB  01111101B  ;6(7DH)
  1354.             DB  00000111B  ;7(07H)
  1355.             DB  01111111B  ;8(7FH)
  1356.             DB  01101111B  ;9(6FH)
  1357.     SEGTAB2:
  1358.             DB  00000110B,01110111B  ;1A(06H,77H)
  1359.             DB  00000110B,01111100B  ;1b(06H,7CH)
  1360.             DB  00000110B,00111001B  ;1C(06H,39H)
  1361.             DB  00000110B,01011110B  ;1d(06H,5EH)
  1362.             DB  01011100B,01000000B  ;o-(5CH,40H)
  1363.             DB  00111001B,01000000B  ;C-(39H,40H)
  1364.             DB  01111100B,00111001B  ;bC(7CH,39H)
  1365.             DB  00111000B,01011110B  ;Ld(38H,5EH)
  1366.             DB  01011011B,01110111B  ;2A(5BH,77H)
  1367.             DB  01011011B,01111100B  ;2b(5BH,7CH)
  1368.             DB  01011011B,00111001B  ;2C(5BH,39H)
  1369.             DB  01011011B,01011110B  ;2d(5BH,5EH)
  1370.             DB  01001111B,01110111B  ;3A(4FH,77H)
  1371.             DB  01001111B,01111100B  ;3b(4FH,7CH)
  1372.             DB  01001111B,00111001B  ;3C(4FH,39H)
  1373.             DB  01011110B,01000000B  ;d-(5EH,40H)
  1374.             DB  01111001B,01000000B  ;E-(79H,40H)

  1375.     ;------------------------------------------------------------------------------------------

  1376.             END
復(fù)制代碼
壓縮文件的內(nèi)容:


全部資料51hei下載地址:
用STC15F104W制作定時(shí)IC.rar (4.65 MB, 下載次數(shù): 141)




評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏21 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:689120 發(fā)表于 2021-1-19 16:16 | 只看該作者
樓主您好,您辛苦了。謝謝分享!本人有個(gè)設(shè)想:就是此定時(shí)器的顯示器能不能用LCD12864的,這樣可更方便定時(shí)器的設(shè)置。
回復(fù)

使用道具 舉報(bào)

板凳
ID:396309 發(fā)表于 2021-1-20 13:58 | 只看該作者
獨(dú)行者stc 發(fā)表于 2021-1-19 16:16
樓主您好,您辛苦了。謝謝分享!本人有個(gè)設(shè)想:就是此定時(shí)器的顯示器能不能用LCD12864的,這樣可更方便定時(shí) ...

需要修改程序才能用LCD12864,我手頭上也有很多LCD12864,實(shí)際使用時(shí),定時(shí)器的設(shè)置操作不經(jīng)常用到,體積越小越簡(jiǎn)潔越好,所以就設(shè)計(jì)為用數(shù)碼管的
回復(fù)

使用道具 舉報(bào)

地板
ID:396309 發(fā)表于 2021-1-30 20:48 | 只看該作者
補(bǔ)充一張圖


回復(fù)

使用道具 舉報(bào)

5#
ID:71233 發(fā)表于 2021-2-7 09:55 | 只看該作者
STC15F104W只有8個(gè)引腳,兩個(gè)接電源,其他引腳都是IO口,體積小,外部不用晶振,用來(lái)制作定時(shí)精度不用太高的定時(shí)器(如生活普通定時(shí)器)是最好不過(guò)的,我也經(jīng)常用這款單片機(jī)來(lái)制作定時(shí)器。
回復(fù)

使用道具 舉報(bào)

6#
ID:36172 發(fā)表于 2023-3-30 16:42 | 只看該作者
匯編的,樓主歷害
回復(fù)

使用道具 舉報(bào)

7#
ID:292518 發(fā)表于 2023-4-3 14:01 | 只看該作者
大神,能不能用STC8G1K08A代替STC15F104W?
回復(fù)

使用道具 舉報(bào)

8#
ID:292518 發(fā)表于 2023-4-7 10:00 | 只看該作者
大神,能不能用STC8G1K08A代替STC15F104W?
回復(fù)

使用道具 舉報(bào)

9#
ID:1094329 發(fā)表于 2023-9-23 16:12 | 只看該作者
long2018 發(fā)表于 2023-4-7 10:00
大神,能不能用STC8G1K08A代替STC15F104W?

回復(fù)可以,加改頭文件等
回復(fù)

使用道具 舉報(bào)

10#
ID:72088 發(fā)表于 2023-9-24 12:01 | 只看該作者
好貼,好匯編語(yǔ)言
回復(fù)

使用道具 舉報(bào)

11#
ID:292518 發(fā)表于 2023-9-26 10:13 | 只看該作者

能不能幫忙改一下,生成固件,謝謝,@錯(cuò)人了
回復(fù)

使用道具 舉報(bào)

12#
ID:292518 發(fā)表于 2023-9-26 10:17 | 只看該作者
mwxpk 發(fā)表于 2023-9-23 16:12
回復(fù)可以,加改頭文件等

不懂匯編,能不能幫忙改一下,生成固件,謝謝
回復(fù)

使用道具 舉報(bào)

13#
ID:1094329 發(fā)表于 2023-9-28 12:32 | 只看該作者
long2018 發(fā)表于 2023-9-26 10:17
不懂匯編,能不能幫忙改一下,生成固件,謝謝

你需要什么? 主貼程序可以修改,也可用C編寫(xiě)。不同的老師講的字多小也不同,目標(biāo)一樣。
回復(fù)

使用道具 舉報(bào)

14#
ID:156094 發(fā)表于 2024-3-22 22:24 | 只看該作者
感謝大神分享!!新手一個(gè),照著電路圖做了一個(gè),下載程序后,數(shù)碼管顯示正常,編碼器正常,按照說(shuō)明設(shè)置,設(shè)置的10秒通10秒斷,循環(huán)模式,但是在循環(huán)過(guò)程中,驅(qū)動(dòng)不了繼電器。檢測(cè)P3.0引腳的電平變化是0v----0.6v----0v-----0.6v,請(qǐng)問(wèn)正常嗎?
回復(fù)

使用道具 舉報(bào)

15#
ID:437129 發(fā)表于 2024-10-24 11:18 | 只看該作者
感謝大神分享,有空做一個(gè)試試。
回復(fù)

使用道具 舉報(bào)

16#
ID:1067504 發(fā)表于 2024-10-25 17:25 來(lái)自手機(jī) | 只看該作者
技術(shù)大牛!現(xiàn)在會(huì)匯編的人越來(lái)越少了,要是C就好了,匯編實(shí)在看不懂
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表