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

QQ登錄

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

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

單片機(jī)+TM1637顯示模塊,EC11編碼器,電風(fēng)扇長(zhǎng)定時(shí)+自然風(fēng)匯編程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
電風(fēng)扇定時(shí)時(shí)間60分鐘覺(jué)得短了些,如果一直開(kāi)的話(huà),吹到天亮人也難受,能定時(shí)個(gè)三四小時(shí)比較合適,手頭上有若干閑置了十余年的STC89C51RC,所以就用它來(lái)制作個(gè)長(zhǎng)定時(shí)器,使用EC11帶開(kāi)關(guān)旋轉(zhuǎn)編碼器調(diào)時(shí)間,很便宜,一塊多錢(qián)一只還包郵,也可以用按鍵代替編碼器,只是調(diào)時(shí)間的時(shí)候不如編碼器那么方便快捷,顯示用TM1637四位數(shù)碼管顯示模塊,3塊錢(qián)包郵,便宜又好用,它能顯示到99小時(shí),所以最長(zhǎng)定時(shí)可達(dá)99小時(shí)59分59秒,雖然實(shí)際使用不需要那么長(zhǎng)的定時(shí)。制作好后不對(duì)電風(fēng)扇作任何改動(dòng),只是把雙向可控硅的T1、T2分別與原定時(shí)器那兩根線(xiàn)接好就可以了,也就是與原定時(shí)器并聯(lián),把原定時(shí)器調(diào)到OFF位置。單片機(jī)改用其他型號(hào)的話(huà),需要改動(dòng)一些地方,如EEPROM操作、扇區(qū)地址、數(shù)量、特殊功能寄存器地址、看門(mén)狗預(yù)分頻數(shù)等等.

電路原理圖如下:



單片機(jī)源程序如下:
  1. ;===================================================================================
  2. ;TM1637顯示模塊,EC11編碼器,電風(fēng)扇長(zhǎng)定時(shí)+自然風(fēng)匯編程序
  3. ;楊小強(qiáng),2020年6月
  4. ;單片機(jī):STC89C51RC,晶振:11.0592MHz
  5. ;顯示:(TM1637)4位數(shù)碼管顯示模塊
  6. ;調(diào)整、設(shè)置:EC11帶開(kāi)關(guān)5腳旋轉(zhuǎn)編碼器,也可以用按鍵代替
  7. ;電源:閑置5V手機(jī)充電器
  8. ;
  9. ;最長(zhǎng)定時(shí)99小時(shí)59分59秒,簡(jiǎn)單的采用間歇通/斷電方式模擬自然風(fēng),周期可調(diào),用可控硅控制通斷。
  10. ;
  11. ;按編碼器開(kāi)關(guān)1次:正常/自然風(fēng)切換,自然風(fēng)狀態(tài)時(shí)LED指示燈亮,可控硅間歇通斷電
  12. ;按編碼器開(kāi)關(guān)2次:定時(shí)時(shí)間清零,風(fēng)扇電機(jī)斷電,兩次按鍵動(dòng)作之間不大于0.6秒
  13. ;
  14. ;長(zhǎng)按編碼器開(kāi)關(guān)5秒以上15秒以?xún)?nèi),松開(kāi)按鍵后進(jìn)入設(shè)置狀態(tài),退出設(shè)置狀態(tài):設(shè)置完第五項(xiàng)后按編碼器開(kāi)關(guān)、或任意一
  15. ;項(xiàng)中停15秒無(wú)任何操作,就自動(dòng)保存并退出。根據(jù)數(shù)碼管左邊顯示的數(shù)字進(jìn)行以下各項(xiàng)設(shè)置,通過(guò)旋轉(zhuǎn)編碼器加或減,
  16. ;按編碼器開(kāi)關(guān)進(jìn)入下一項(xiàng)設(shè)置:
  17. ;一、顯示1——設(shè)置自然風(fēng)狀態(tài)時(shí),通斷電周期時(shí)長(zhǎng),5~30秒,默認(rèn)為10秒
  18. ;二、顯示2——設(shè)置自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng),最短為2秒;最長(zhǎng)為上一項(xiàng)所設(shè)的周期減3秒,比如上一項(xiàng)設(shè)置的周期為10秒,
  19. ;             則本項(xiàng)最多可以設(shè)置到7秒;
  20. ;三、顯示3——設(shè)置3小時(shí)以下定時(shí)調(diào)整時(shí),編碼器每轉(zhuǎn)動(dòng)一格的增(減)值:5、10、15、20、25、30分鐘,默認(rèn)10分鐘,
  21. ;             3小時(shí)以上增(減)值30分鐘;10小時(shí)以上增(減)值1個(gè)小時(shí);20小時(shí)以上增(減)值2個(gè)小時(shí)
  22. ;四、顯示4——設(shè)置電風(fēng)扇插電就自動(dòng)填入的定時(shí)時(shí)間,0~30小時(shí),默認(rèn)8小時(shí)
  23. ;五、顯示5——設(shè)置數(shù)碼管亮度,1~8級(jí),默認(rèn)為3級(jí)
  24. ;
  25. ;長(zhǎng)按編碼器開(kāi)關(guān)15秒:恢復(fù)各項(xiàng)默認(rèn)設(shè)置,數(shù)碼管顯示88:88
  26. ;
  27. ;設(shè)置保存失敗顯示5秒E1
  28. ;
  29. ;--------------------------- 端口定義 ---------------------------
  30.         CLK        EQU P1.5   ;接顯示模塊TM1637的CLK
  31.         DIO        EQU P1.6   ;接顯示模塊TM1637的DIO
  32.         EC11A        EQU P3.2   ;接編碼器的A引腳,外部中斷INT0,也可以接一個(gè)按鍵代替
  33.         EC11B        EQU P3.3   ;接編碼器的B引腳,外部中斷INT1,也可以接一個(gè)按鍵代替
  34.         EC11K        EQU P3.4   ;接編碼器的按鍵開(kāi)關(guān)引腳
  35.         RLED        EQU P0.4   ;只要發(fā)生過(guò)復(fù)位就一直保持低電平,如有需要可接上LED方便觀察
  36.         LED        EQU P0.5   ;自然風(fēng)狀態(tài)LED指示燈,低電平亮
  37.         MOC        EQU P0.7   ;接MOC3022光控可控硅,低電平時(shí)風(fēng)扇電機(jī)通電

  38. ;--------------------------- 位地址及RAM的使用 ---------------------------
  39. ;(20H)第0位:1=編碼器已經(jīng)轉(zhuǎn)動(dòng),等待主程序處理,0=沒(méi)有轉(zhuǎn)動(dòng)或主程序已處理
  40. ;(20H)第1位:1=編碼器順時(shí)針正轉(zhuǎn);0=編碼器逆時(shí)針?lè)崔D(zhuǎn)
  41. ;(20H)第2位:1=自然風(fēng)狀態(tài);0=正常狀態(tài)
  42. ;(20H)第3位:1=禁止;0=允許。進(jìn)行各項(xiàng)設(shè)置時(shí)使用,允許/禁止檢查剩余時(shí)間
  43. ;(20H)第4位:1=閃爍顯示;0=不閃爍。進(jìn)行各項(xiàng)設(shè)置時(shí)用
  44. ;(20H)第5位:1=不顯示,0=顯示,數(shù)字及冒號(hào)閃爍時(shí)用,由T0中斷每0.5秒取反一次
  45. ;(20H)第6位:1=顯示3秒88:88;0=正常
  46. ;(20H)第7位:1=顯示5秒E1;0=正常

  47.         FWBZ1        EQU        022H        ;復(fù)位判斷標(biāo)志1,也作EEPROM數(shù)據(jù)判斷標(biāo)志
  48.         FWBZ2        EQU        023H        ;復(fù)位判斷標(biāo)志2,也作EEPROM數(shù)據(jù)判斷標(biāo)志
  49.         ZRFZQ        EQU        024H        ;自然風(fēng)時(shí)通斷電周期時(shí)長(zhǎng)
  50.         ZRFSJ        EQU        025H        ;自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)
  51.         BMQZJ        EQU        026H          ;編碼器每轉(zhuǎn)動(dòng)一小格的增(減)值
  52.         SDDS        EQU        027H        ;上電就自動(dòng)設(shè)定的定時(shí)時(shí)間(小時(shí))
  53.         SMGLD        EQU        028H          ;數(shù)碼管亮度
  54.         DSSJS        EQU        029H        ;定時(shí)時(shí)間,時(shí)
  55.         DSSJF        EQU        02AH          ;定時(shí)時(shí)間,分
  56.         DSSJM        EQU        02BH        ;定時(shí)時(shí)間,秒
  57.         ZQ        EQU        02CH        ;T0中斷使用,自然風(fēng)通斷電周期時(shí)長(zhǎng)
  58.         SJ        EQU        02DH        ;T0中斷使用,自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)
  59.         SJJS        EQU        02EH          ;時(shí)間計(jì)數(shù),每10毫秒減1,為0后定時(shí)時(shí)間減1秒,重新把HMJS處定義的計(jì)數(shù)值放入這里
  60.         MJS        EQU        02FH        ;按鍵處理時(shí)用,秒計(jì)數(shù),每秒減1,直到為0
  61.         SSSC        EQU        030H        ;閃爍時(shí)長(zhǎng),每秒減1,直到為0
  62.         XSHC1        EQU        031H        ;上次顯示的內(nèi)容,與當(dāng)前不同就立即顯示,相同就每0.5秒顯示一次
  63.         XSHC2        EQU        032H        ;上次顯示的內(nèi)容,與當(dāng)前不同就立即顯示,相同就每0.5秒顯示一次
  64.         XXSZ        EQU        033H        ;下限數(shù)值,進(jìn)行各項(xiàng)設(shè)置時(shí)用
  65.         SXSZ        EQU        034H        ;上限數(shù)值,進(jìn)行各項(xiàng)設(shè)置時(shí)用
  66.         ZXM1        EQU        035H        ;顯示用,待發(fā)送到TM1637的字形碼1
  67.         ZXM2        EQU        036H        ;顯示用,待發(fā)送到TM1637的字形碼2
  68.         ZXM3        EQU        037H        ;顯示用,待發(fā)送到TM1637的字形碼3
  69.         ZXM4        EQU        038H        ;顯示用,待發(fā)送到TM1637的字形碼4
  70.         DSZJ        EQU        039H        ;加減定時(shí)時(shí)間使用
  71.         DISPL        EQU        03AH         ;設(shè)置要顯示的目標(biāo):
  72.                                 ;0=顯示定時(shí)時(shí)間
  73.                                 ;1=顯示1——設(shè)置自然風(fēng)狀態(tài)時(shí)的通斷電周期時(shí)長(zhǎng)
  74.                                 ;2=顯示2——設(shè)置自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)
  75.                                 ;3=顯示3——設(shè)置3小時(shí)以下定時(shí)調(diào)整時(shí),編碼器每轉(zhuǎn)動(dòng)一小格的增(減)值
  76.                                 ;4=顯示4——設(shè)置上電自動(dòng)填入的定時(shí)時(shí)間
  77.                                 ;5=顯示5——設(shè)置數(shù)碼管亮度

  78. ;--------------- 看門(mén)狗、EEPROM特殊功能寄存器地址 ---------------
  79.         AUXR                EQU 08EH        ;輔助寄存器
  80.         WDT_CONTR        EQU 0E1H        ;看門(mén)狗地址
  81.         IAP_DATA         EQU 0E2H        ;數(shù)據(jù)寄存器,讀出、寫(xiě)入的數(shù)據(jù)放在此處
  82.         IAP_ADDRH        EQU 0E3H        ;地址寄存器高八位
  83.         IAP_ADDRL        EQU 0E4H        ;地址寄存器低八位
  84.         IAP_CMD                EQU 0E5H        ;命令寄存器,0=關(guān)閉,1=讀,2=寫(xiě),3=擦除
  85.         IAP_TRIG        EQU 0E6H        ;命令觸發(fā)寄存器,每次操作先放入46H再放入B9,命令立即被觸發(fā)起動(dòng)
  86.         IAP_CONTR        EQU 0E7H        ;控制寄存器,F(xiàn)lash操作允許/禁止及等待時(shí)間
  87.         ENABLE_IAP        EQU 083H ;定義Flash操作等待時(shí)間及允許IAP/ISP/EEPROM操作的常數(shù),時(shí)鐘<12MHz時(shí)為83H

  88. ;==========================================================================
  89.         ORG        0000H
  90.         LJMP        START

  91.         ORG        0003H                ;外部中斷INT0入口
  92.         LJMP        INT_0                ;外部中斷INT0入口

  93.         ORG        000BH                ;T0中斷入口
  94.         LJMP        T0INT                ;T0中斷入口

  95.         ORG        0013H                ;外部中斷INT1入口
  96.         LJMP        INT_1                ;外部中斷INT1入口

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

  98. ;------------------------------------------------------------------------------------------------
  99. ;定義時(shí)間計(jì)數(shù)值,當(dāng)定時(shí)時(shí)間實(shí)際走時(shí)誤差較大時(shí),可調(diào)整此數(shù)值使誤差減小
  100. ;例如每分鐘快7秒,就把此數(shù)值改為112D(7秒÷60秒×100≈12,12+100=112);每分鐘慢6秒,就
  101. ;把此數(shù)值改為90D(6秒÷60秒×100=10,100-10=90)
  102. ;------------------------------------------------------------------------------------------------
  103. HMJS:        DB        100D                ;定義時(shí)間計(jì)數(shù)值,100表示100×10毫秒=1秒,后面的D表示是十進(jìn)制數(shù)

  104. ;--------------- 定時(shí)器0中斷(10毫秒產(chǎn)生一次中斷) ---------------
  105. T0INT:        PUSH        ACC
  106.         PUSH        PSW
  107.         LCALL        TIME                ;處理各項(xiàng)時(shí)間
  108.         LCALL        Control                ;根據(jù)條件控制自然風(fēng)LED指示燈和可控硅(或繼電器)
  109.         LCALL        DISPLAY                ;顯示
  110.         POP        PSW
  111.         POP        ACC
  112.         RETI

  113. ;--------------- 外部中斷INT0,P3.2接編碼器A引腳 ---------------
  114. INT_0:        PUSH        PSW
  115.         JB        00H,INT0_1        ;如果位地址0H為1就退出中斷處理程序,等待主程序處理
  116.         SETB        00H                ;把位地址00H置為1,表示編碼器已轉(zhuǎn)動(dòng),等待主程序處理
  117.         SETB        01H                ;是順時(shí)針正轉(zhuǎn),把位地址01H置為1
  118. INT0_1:        POP        PSW
  119.         RETI

  120. ;--------------- 外部中斷INT1,P3.3接編碼器B引腳 ---------------
  121. INT_1:        PUSH        PSW
  122.         JB        00H,INT1_1        ;如果位地址0H為1就退出中斷處理程序,等待主程序處理
  123.         SETB        00H                ;把位地址00H置為1,表示編碼器已轉(zhuǎn)動(dòng),等待主程序處理
  124.         CLR        01H                ;是逆時(shí)針?lè)崔D(zhuǎn),把位地址01H置為0
  125. INT1_1:        POP        PSW
  126.         RETI

  127. ;--------------- 設(shè)置各項(xiàng)默認(rèn)值 ----------------
  128. SZMRZ:        MOV        ZRFZQ,#10        ;自然風(fēng)狀態(tài)時(shí),通斷電周期時(shí)長(zhǎng)(秒)
  129.         MOV        ZRFSJ,#5        ;自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)(秒)
  130.         MOV        BMQZJ,#10          ;編碼器每轉(zhuǎn)動(dòng)一小格的+、-值(分鐘))
  131.         MOV        SDDS,#8                ;上電就自動(dòng)設(shè)定的定時(shí)時(shí)間(小時(shí))
  132.         MOV        SMGLD,#3          ;數(shù)碼管亮度,8級(jí)亮度最高
  133.         RET

  134. ;--------------- T0、INT0、INT1中斷設(shè)置 ----------------
  135. SETINT:        ANL        AUXR,#7FH        ;定時(shí)器時(shí)鐘12T模式
  136.         ANL        TMOD,#0F0H        ;設(shè)置定時(shí)器模式
  137.         MOV        TL0,#000H        ;設(shè)置定時(shí)初值,10毫秒產(chǎn)生一次中斷(晶振:11.0592MHz)
  138.         MOV        TH0,#0DCH        ;設(shè)置定時(shí)初值,10毫秒產(chǎn)生一次中斷(晶振:11.0592MHz)
  139.         CLR        TF0                ;清除TF0標(biāo)志
  140.         SETB        ET0                ;允許定時(shí)器0中斷
  141.         SETB        TR0                ;定時(shí)器0開(kāi)始計(jì)時(shí)
  142.         SETB        IT0                ;設(shè)外部中斷INT0為下降沿觸發(fā)
  143.         SETB        EX0                ;允許外部中斷INT0
  144.         SETB        IT1                ;設(shè)外部中斷INT1為下降沿觸發(fā)
  145.         SETB        EX1                ;允許外部中斷INT1
  146.         SETB        EA                ;允許全局中斷
  147.         RET

  148. ;--------------- 啟動(dòng)看門(mén)狗及喂狗,11.0592MHz預(yù)分頻數(shù)=4(142.2毫秒),00111001B(39H) ----------------
  149. WG:        MOV        WDT_CONTR,#00111001B
  150.         RET

  151. ;******************************************** 主程序開(kāi)始 ********************************************
  152. START:        MOV        SP,#050H        ;設(shè)置堆棧指針
  153.         MOV        A,FWBZ1                ;
  154.         CJNE        A,#0C8H,START0        ;
  155.         MOV        A,FWBZ2                ;檢查復(fù)位判斷標(biāo)志,不相同說(shuō)明是初次上電,從初始化開(kāi)始運(yùn)行
  156.         CJNE        A,#0D9H,START0        ;
  157.         LCALL        SETINT                ;中斷設(shè)置
  158.         CLR        RLED                ;RAM內(nèi)容沒(méi)變,說(shuō)明是被干擾等原因復(fù)位,不是初次上電,點(diǎn)亮復(fù)位LED指示燈
  159.         MOV        A,DISPL                ;
  160.         CJNE        A,#5,SAT1        ;不管是什么原因復(fù)位,只要RAM不被改變就跳過(guò)初始化,繼續(xù)運(yùn)行
  161.         LJMP        STARTB                ;
  162. SAT1:        CJNE        A,#4,SAT2        ;
  163.         LJMP        STARTA                ;
  164. SAT2:        CJNE        A,#3,SAT3        ;根據(jù)DISPL的內(nèi)容跳轉(zhuǎn)到復(fù)位前的位置
  165.         LJMP        START9                ;
  166. SAT3:        CJNE        A,#2,SAT4        ;
  167.         LJMP        START8                ;
  168. SAT4:        CJNE        A,#1,START2        ;
  169.         LJMP        START7                ;
  170. START0:        CLR        A
  171.         MOV        R0,#30H                ;
  172.         MOV        R1,#20H                ;
  173. START1:        MOV        @R1,A                ;初始化,從RAM地址20H開(kāi)始清零30H個(gè)字節(jié)
  174.         INC        R1                ;
  175.         DJNZ        R0,START1        ;
  176.         LCALL        SETINT                ;初始化,中斷設(shè)置
  177.         MOV        FWBZ1,#0C8H        ;初始化,放入復(fù)位判斷標(biāo)志1到RAM
  178.         MOV        FWBZ2,#0D9H        ;初始化,放入復(fù)位判斷標(biāo)志2到RAM
  179.         LCALL        REEP                ;初始化,讀EEPROM保存的各項(xiàng)設(shè)置,如果沒(méi)有就設(shè)為默認(rèn)值并保存
  180.         SETB        RLED                ;初始化,設(shè)RLED為高電平,復(fù)位LED指示燈不亮
  181. ;
  182. START2:        LCALL        WG                ;喂狗
  183.         MOV        DISPL,#0        ;設(shè)置要顯示的目標(biāo),0=顯示定時(shí)時(shí)間
  184.         CLR        06H                ;位地址06H置為0,顯示定時(shí)時(shí)間
  185.         CLR        07H                ;位地址07H置為0,顯示定時(shí)時(shí)間
  186.         JNB        00H,START3        ;如果位地址00H為0(編碼器沒(méi)有轉(zhuǎn)動(dòng))就轉(zhuǎn)移
  187.         SETB        EC11A                ;拉高編碼器A引腳電平
  188.         SETB        EC11B                ;拉高編碼器B引腳電平
  189.         JNB        EC11A,START3        ;如果仍為0(低電平)就轉(zhuǎn)移,說(shuō)明還沒(méi)有旋轉(zhuǎn)到卡點(diǎn)位置
  190.         JNB        EC11B,START3        ;如果仍為0(低電平)就轉(zhuǎn)移,說(shuō)明還沒(méi)有旋轉(zhuǎn)到卡點(diǎn)位置
  191.         LCALL        DSSJZJ                ;AB引腳都為高電平了,已經(jīng)旋轉(zhuǎn)到卡點(diǎn)位置,根據(jù)方向增減定時(shí)時(shí)間
  192.         CLR        00H                ;把位地址00H置為0,表示已經(jīng)響應(yīng)并處理編碼器旋轉(zhuǎn)動(dòng)作
  193. START3:        LCALL        SKEY                ;掃描編碼器按鍵開(kāi)關(guān)
  194.         JNC        START2                ;沒(méi)有按鍵動(dòng)作(C=0)就轉(zhuǎn)移
  195.         LCALL        KEY                ;有按鍵動(dòng)作,調(diào)用編碼器按鍵開(kāi)關(guān)處理子程序
  196.         CJNE        A,#1,START4        ;如果不是按下1次(正常/自然風(fēng)切換)就轉(zhuǎn)移
  197.         CPL        02H                ;是按1次,位地址第02位取反,自然風(fēng)/正常狀態(tài)切換
  198.         LJMP        START2
  199. START4:        CJNE        A,#2,START5        ;如果不是2(定時(shí)時(shí)間置為零)就轉(zhuǎn)移
  200.         LCALL        DSSJQL                ;是按2次,定時(shí)時(shí)間清零
  201.         LJMP        START2
  202. START5:        CJNE        A,#3,START7        ;如果不是3(恢復(fù)默認(rèn)設(shè)置)就轉(zhuǎn)移
  203.         LCALL        SZMRZ                ;恢復(fù)各項(xiàng)默認(rèn)設(shè)置
  204.         SETB        06H                ;把位地址06H設(shè)置為1,數(shù)碼管顯示3秒88:88
  205.         MOV        SSSC,#3                ;3秒
  206.         MOV        ZXM1,#0FFH        ;8
  207.         MOV        ZXM2,#0FFH        ;8
  208.         MOV        ZXM3,#0FFH        ;8
  209.         MOV        ZXM4,#0FFH        ;8
  210.         LCALL        DISP                ;顯示
  211. START6:        MOV        A,SSSC
  212.         LCALL        WG                ;喂狗
  213.         JNZ        START6                ;等待SSSC為0秒
  214.         LCALL        WSET                ;保存設(shè)置
  215.         LCALL        KEYEX                ;等待按鍵松開(kāi)
  216.         LJMP        START2
  217. START7:        MOV        DISPL,#1        ;是4,進(jìn)入各項(xiàng)設(shè)置,1=顯示“1——設(shè)置自然風(fēng)狀態(tài)時(shí)通斷電周期時(shí)長(zhǎng)”
  218.         LCALL        ZQSZ                ;周期時(shí)長(zhǎng)設(shè)置
  219.         JNZ        START8                ;如果是按下編碼器按鍵開(kāi)關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項(xiàng)設(shè)置
  220.         LJMP        START2                ;是15秒無(wú)操作自動(dòng)保存返回,設(shè)置結(jié)束
  221. START8:        MOV        DISPL,#2        ;2=顯示“2——設(shè)置自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)”
  222.         LCALL        TDSC                ;通電時(shí)長(zhǎng)設(shè)置
  223.         JNZ        START9                ;如果是按下編碼器按鍵開(kāi)關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項(xiàng)設(shè)置
  224.         LJMP        START2                ;是15秒無(wú)操作自動(dòng)保存返回,設(shè)置結(jié)束
  225. START9:        MOV        DISPL,#3        ;3=顯示“3——設(shè)置2小時(shí)以下定時(shí)調(diào)整時(shí),編碼器每轉(zhuǎn)動(dòng)一格的增(減)值”
  226.         LCALL        BMQZJZ                ;編碼器增減值設(shè)置
  227.         JNZ        STARTA                ;如果是按下編碼器按鍵開(kāi)關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項(xiàng)設(shè)置
  228.         LJMP        START2                ;是15秒無(wú)操作自動(dòng)保存返回,設(shè)置結(jié)束
  229. STARTA:        MOV        DISPL,#4        ;4=顯示“4——設(shè)置插電自動(dòng)填入的定時(shí)時(shí)間”
  230.         LCALL        SDDSSJ                ;上電定時(shí)時(shí)間設(shè)置(小時(shí))
  231.         JNZ        STARTB                ;如果是按下編碼器按鍵開(kāi)關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項(xiàng)設(shè)置
  232.         LJMP        START2                ;是15秒無(wú)操作自動(dòng)保存返回,設(shè)置結(jié)束
  233. STARTB:        MOV        DISPL,#5        ;5=顯示“5——設(shè)置數(shù)碼管亮度”
  234.         LCALL        LDSZ                ;亮度設(shè)置
  235.         LJMP        START2

  236. ;--------------------------------------------------------------------------------------------------------
  237. ;子程序:根據(jù)編碼器旋轉(zhuǎn)方向加減定時(shí)時(shí)間。
  238. ;3小時(shí)及以下,按設(shè)置的值加減:5、10、15、20、25、30分鐘
  239. ;3小時(shí)以上每次增(減)30分鐘;10小時(shí)以上每次增(減)1個(gè)小時(shí);20小時(shí)以上每次增(減)2個(gè)小時(shí)
  240. ;--------------------------------------------------------------------------------------------------------
  241. DSSJZJ:        MOV        DSSJM,#59        ;先放入59到定時(shí)時(shí)間(秒)
  242.         MOV        A,DSSJS                ;裝入定時(shí)時(shí)間(時(shí))
  243.         CJNE        A,#20,DSZJ1        ;當(dāng)前“時(shí)”是否等于或大于20
  244. DSZJ1:        JC        DSZJ2                ;小于就轉(zhuǎn)移
  245.         MOV        DSZJ,#2                ;等于或大于20,加減2個(gè)小時(shí)
  246.         LJMP        DSZJ4
  247. DSZJ2:        CJNE        A,#10,DSZJ3        ;當(dāng)前“時(shí)”是否等于或大于10
  248. DSZJ3:        JC        DSZJ8                ;小于就轉(zhuǎn)移
  249.         MOV        DSZJ,#1                ;等于或大于10,加減1個(gè)小時(shí)
  250. DSZJ4:         JNB        01H,DSZJ6        ;如果位地址01H為0(逆時(shí)針?lè)崔D(zhuǎn))就轉(zhuǎn)移
  251.         ADD        A,DSZJ                ;是正轉(zhuǎn),加
  252.         CJNE        A,#100,DSZJ5        ;加完后是否等于或大于100
  253. DSZJ5:        JC        DSZJ7                ;如果小于就轉(zhuǎn)移,把A放回到DSSJS
  254.         MOV        DSSJS,#99        ;已經(jīng)大于99了,直接設(shè)置為99:59:59
  255.         MOV        DSSJF,#59        ;已經(jīng)大于99了,直接設(shè)置為99:59:59
  256.         RET
  257. DSZJ6:        SUBB        A,DSZJ                ;是反轉(zhuǎn),減
  258. DSZJ7:        MOV        DSSJS,A                ;把計(jì)算結(jié)果放入DSSJS
  259.         RET
  260. DSZJ8:        MOV        DSZJ,BMQZJ        ;把設(shè)置的“增(減)值”放入DSZJ
  261.         CJNE        A,#3,DSZJ11        ;當(dāng)前“時(shí)”不是3就轉(zhuǎn)移
  262.         JB        01H,DSZJ12         ;是3,如果位地址01H為1(正轉(zhuǎn))就轉(zhuǎn)移,把DSZJ處的“增(減)值”改為30(分鐘)
  263.         MOV        A,DSSJF                ;是反轉(zhuǎn),裝入定時(shí)時(shí)間(分)
  264.         JZ        DSZJ13                ;如果當(dāng)前“分”為0(3:00)就轉(zhuǎn)移,按設(shè)置的增(減)值減
  265.         CJNE        A,#30,DSZJ9        ;“分”不為0,是否等于或大于30
  266. DSZJ9:        JC        DSZJ10                ;小于就轉(zhuǎn)移,把0放入定時(shí)時(shí)間(分),使時(shí)間變?yōu)?:00
  267.         SUBB        A,#30                ;等于或大于,減30分
  268.         MOV        DSSJF,A                ;把計(jì)算結(jié)果放入定時(shí)時(shí)間(分)
  269.         RET
  270. DSZJ10:        MOV        DSSJF,#0        ;小于30,把0放入定時(shí)時(shí)間(分),使時(shí)間變?yōu)?:00
  271.         RET
  272. DSZJ11:        JC        DSZJ13                 ;小于3就轉(zhuǎn)移
  273. DSZJ12:        MOV        DSZJ,#30        ;大于3:00,把DSZJ處的“增(減)值”改為30(分鐘)
  274. DSZJ13:        MOV        A,DSSJF                ;裝入定時(shí)時(shí)間(分)
  275.         JNB        01H,DSZJ16         ;如果位地址01H為0(逆時(shí)針?lè)崔D(zhuǎn))就轉(zhuǎn)移
  276.         ADD        A,DSZJ                ;是正轉(zhuǎn),當(dāng)前“分”直接加DSZJ處的“增(減)值”
  277.         CJNE        A,#60,DSZJ14        ;加完后“分”是否等于或大于60
  278. DSZJ14:        JC        DSZJ15                ;小于60就轉(zhuǎn)移,把A放入定時(shí)時(shí)間(分)
  279.         SUBB        A,#60                ;等于或大于60,就減60,然后小時(shí)加1
  280.         MOV        DSSJF,A                ;把A放入定時(shí)時(shí)間(分)
  281.         MOV        A,DSSJS                ;裝入“時(shí)”
  282.         INC        A                ;小時(shí)加1
  283.         MOV        DSSJS,A
  284.         CJNE        A,#3,DSZJ19        ;加完后“時(shí)”不是3就轉(zhuǎn)移,退出
  285.         CLR        A                ;加完后大于3:00了,把0放入定時(shí)時(shí)間(分),使時(shí)間變?yōu)?:00
  286. DSZJ15:        MOV        DSSJF,A
  287.         RET
  288. DSZJ16:        CJNE        A,DSZJ,DSZJ17        ;是逆時(shí)針?lè)崔D(zhuǎn),當(dāng)前“分”是否等于或大于DSZJ處的“增(減)值”
  289. DSZJ17:        JC        DSZJ20                ;小于就轉(zhuǎn)移
  290.         SUBB        A,DSZJ                ;等于或大于,定時(shí)時(shí)間(分)減“增(減)值”
  291.         MOV        DSSJF,A                ;把計(jì)算結(jié)果放入定時(shí)時(shí)間(分)
  292.         JZ        DSZJ18                ;如果“分”為0就轉(zhuǎn)移
  293.         RET
  294. DSZJ18:        CJNE        A,DSSJS,DSZJ19        ;如果“時(shí)”不為0就轉(zhuǎn)移
  295.         MOV        DSSJM,A                ;“時(shí)、分”都為0,“秒”也清零
  296. DSZJ19:        RET
  297. DSZJ20:        MOV        A,DSZJ                ;“分”小于“增(減)值”,裝入DSZJ處的“增(減)值”
  298.         CLR        C                ;進(jìn)位標(biāo)志清0
  299.         SUBB        A,DSSJF                ;“增(減)值”減“定時(shí)時(shí)間(分)”
  300.         MOV        DSSJF,A                ;減完后的結(jié)果暫時(shí)放入DSSJF
  301.         MOV        A,#60
  302.         SUBB        A,DSSJF                ;60減上面的計(jì)算結(jié)果,得出定時(shí)時(shí)間(分),然后小時(shí)減1
  303.         MOV        DSSJF,A                ;得出的數(shù)放入定時(shí)時(shí)間(分)
  304.         MOV        A,DSSJS                ;裝入定時(shí)時(shí)間(時(shí))
  305.         JZ        DSSJQL                ;如果“時(shí)”為0就轉(zhuǎn)移(不夠減了,把定時(shí)時(shí)間清零)
  306.         DEC        DSSJS                ;“時(shí)”不為0,減1
  307.         RET
  308. DSSJQL: CLR        A
  309.         MOV        DSSJS,A                ;定時(shí)時(shí)間清零
  310.         MOV        DSSJF,A                ;定時(shí)時(shí)間清零
  311.         MOV        DSSJM,A                ;定時(shí)時(shí)間清零
  312.         RET

  313. ;----------------------------------------------------------------------------------------
  314. ;設(shè)置自然風(fēng)通斷電周期時(shí)長(zhǎng),5~30秒
  315. ;----------------------------------------------------------------------------------------
  316. ZQSZ:        MOV        XXSZ,#5                ;下限為5秒
  317.         MOV        SXSZ,#30        ;上限為30秒
  318.         LJMP        LDSZ1

  319. ;----------------------------------------------------------------------------------------
  320. ;設(shè)置自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng),最短為2秒;最長(zhǎng)為上一項(xiàng)(自然風(fēng)通斷電周期)所設(shè)的周期減3秒
  321. ;----------------------------------------------------------------------------------------
  322. TDSC:        MOV        A,ZRFZQ                ;裝入“自然風(fēng)通斷電周期”
  323.         SUBB        A,#3                ;減3秒
  324.         MOV        SXSZ,A                ;放入上限值
  325.         MOV        XXSZ,#2                ;下限為2秒
  326.         LJMP        LDSZ1

  327. ;----------------------------------------------------------------------------------------
  328. ;設(shè)置2小時(shí)以下定時(shí)調(diào)整時(shí),編碼器每轉(zhuǎn)動(dòng)一小格的增(減)值,5、10、15、20、25、30分鐘
  329. ;----------------------------------------------------------------------------------------
  330. BMQZJZ:        MOV        XXSZ,#5                ;下限為5
  331.         MOV        SXSZ,#30        ;上限為30
  332.         MOV        R4,#5                ;調(diào)整時(shí)的加減步長(zhǎng)值
  333.         LJMP        SZTZ

  334. ;----------------------------------------------------------------------------------------
  335. ;設(shè)置插電就自動(dòng)填入的定時(shí)時(shí)間,0~30小時(shí)
  336. ;----------------------------------------------------------------------------------------
  337. SDDSSJ:        MOV        XXSZ,#0                ;下限為0小時(shí)
  338.         MOV        SXSZ,#30        ;上限為30小時(shí)
  339.         LJMP        LDSZ1

  340. ;----------------------------------------------------------------------------------------
  341. ;設(shè)置數(shù)碼管亮度,1~8級(jí),8級(jí)亮度最高
  342. ;----------------------------------------------------------------------------------------
  343. LDSZ:        MOV        XXSZ,#1                ;下限為1
  344.         MOV        SXSZ,#8                ;上限為8
  345. LDSZ1:        MOV        R4,#1                ;調(diào)整時(shí)的加減步長(zhǎng)值
  346.         LJMP        SZTZ

  347. ;----------------------------------------------------------------------------------------
  348. ;子程序:根據(jù)XXSZ、SXSZ設(shè)定的上下限范圍、編碼器旋轉(zhuǎn)方向,調(diào)整DISPL指向的對(duì)象。
  349. ;無(wú)操作10秒后開(kāi)始閃爍顯示,15秒自動(dòng)保存并退出;有按鍵動(dòng)作就保存并退出
  350. ;入口參數(shù):下限值放入XXSZ;上限值放入SXSZ;R4=加、減步長(zhǎng)值
  351. ;出口參數(shù):15秒無(wú)操作自動(dòng)保存退出A=0;按編碼器按鍵開(kāi)關(guān)保存退出A=1
  352. ;----------------------------------------------------------------------------------------
  353. SZTZ:        MOV        MJS,#15                ;放入15秒
  354.         CLR        03H                ;位地址03H置為0,允許檢查剩余時(shí)間
  355. SZTZ1:        LCALL        SKEY                ;掃描編碼器按鍵開(kāi)關(guān)
  356.         JNC        SZTZ2                ;沒(méi)有按鍵動(dòng)作(C=0)就轉(zhuǎn)移
  357.         CLR        04H                ;有按鍵動(dòng)作,把位地址04H置為0,不閃爍顯示
  358.         LCALL        WSET                ;保存設(shè)置
  359.         LCALL        KEYEX                ;等待按鍵松開(kāi)
  360.         LCALL        SKEY1                ;延時(shí)10毫秒
  361.         LCALL        SKEY1                ;
  362.         LCALL        SKEY1                ;共延時(shí)30毫秒
  363.         MOV        A,#1                ;按編碼器按鍵開(kāi)關(guān)保存退出A=1
  364.         RET
  365. SZTZ2:        JB        00H,SZTZ4        ;如果位地址00H為1(編碼器已經(jīng)轉(zhuǎn)動(dòng))就轉(zhuǎn)移
  366.         MOV        A,MJS                ;沒(méi)有轉(zhuǎn)動(dòng),裝入秒計(jì)數(shù)到寄存器A
  367.         JZ        SZTZ3                ;如果秒計(jì)數(shù)為0(15秒無(wú)操作)就轉(zhuǎn)移
  368.         JB        03H,SZTZ1        ;不為0,如果位地址03H為1就轉(zhuǎn)移,不檢查剩余時(shí)間
  369.         CJNE        A,#5,SZTZ1        ;檢查剩余時(shí)間,如果不是5秒就轉(zhuǎn)移,繼續(xù)掃描編碼器
  370.         SETB        04H                ;還剩5秒,把位地址04H置為1,設(shè)置為閃爍顯示
  371.         MOV        SSSC,A                ;閃爍時(shí)長(zhǎng)5秒放入SSSC
  372.         SETB        03H                ;位地址03H置為1,禁止檢查剩余時(shí)間
  373.         LJMP        SZTZ1
  374. SZTZ3:        CLR        04H                ;15秒時(shí)間到,把位地址04H置為0,不閃爍顯示
  375.         LCALL        WSET                ;保存設(shè)置
  376.         CLR        A                ;15秒無(wú)操作自動(dòng)保存退出A=0
  377.         RET
  378. SZTZ4:        CLR        04H                ;編碼器已經(jīng)轉(zhuǎn)動(dòng),把位地址04H置為0,不閃爍顯示
  379.         SETB        EC11A                ;拉高編碼器A引腳電平
  380.         SETB        EC11B                ;拉高編碼器B引腳電平
  381.         JNB        EC11A,SZTZ        ;如果仍為0(低電平)就轉(zhuǎn)移,說(shuō)明還沒(méi)有旋轉(zhuǎn)到卡點(diǎn)位置
  382.         JNB        EC11B,SZTZ        ;如果仍為0(低電平)就轉(zhuǎn)移,說(shuō)明還沒(méi)有旋轉(zhuǎn)到卡點(diǎn)位置
  383.         MOV        A,DISPL                ;AB引腳都為高電平,已經(jīng)旋轉(zhuǎn)到卡點(diǎn)位置了,裝入要設(shè)置的目標(biāo)項(xiàng)
  384.         DEC        A                ;減1
  385.         ADD        A,#ZRFZQ        ;加上各項(xiàng)設(shè)置的起始地址
  386.         MOV        R0,A                ;把得出的具體地址放入R0
  387.         JB        01H,SZTZ7         ;如果位地址01H為1(順時(shí)針正轉(zhuǎn))就轉(zhuǎn)移
  388.         MOV        A,XXSZ                ;是反轉(zhuǎn),裝入下限數(shù)值到A寄存器
  389.         ADD        A,R4                ;加步長(zhǎng)值
  390.         MOV        MJS,A                ;把下限值+步長(zhǎng)值的結(jié)果暫時(shí)放入MJS
  391.         MOV        A,@R0                ;裝入R0指向的RAM地址的調(diào)整對(duì)象數(shù)值
  392.         CJNE        A,MJS,SZTZ5        ;調(diào)整對(duì)象數(shù)值與“下限值+步長(zhǎng)值”比較
  393. SZTZ5:        JC        SZTZ6                ;如果調(diào)整對(duì)象數(shù)值小于“下限值+步長(zhǎng)值”(不夠減)就轉(zhuǎn)移
  394.         SUBB        A,R4                ;等于或大于,減步長(zhǎng)值
  395.         MOV        @R0,A                ;把計(jì)算結(jié)果放回去
  396.         LJMP        SZTZ10
  397. SZTZ6:        MOV        @R0,XXSZ        ;不夠減了,直接放入下限值
  398.         LJMP        SZTZ10
  399. SZTZ7:        MOV        A,@R0                ;是正轉(zhuǎn),裝入R0指向的RAM地址的調(diào)整對(duì)象數(shù)值
  400.         ADD        A,R4                ;加步長(zhǎng)值
  401.         CJNE        A,SXSZ,SZTZ8        ;加完后與上限數(shù)值比較
  402. SZTZ8:        JC        SZTZ9                ;如果小于就轉(zhuǎn)移
  403.         MOV        @R0,SXSZ        ;等于或大于,直接放入上限值
  404.         LJMP        SZTZ10
  405. SZTZ9:        MOV        @R0,A                ;小于上限數(shù)值,把計(jì)算結(jié)果放回去
  406. SZTZ10:        CLR        00H                ;把位地址00H置為0,表示已經(jīng)處理編碼器旋轉(zhuǎn)動(dòng)作
  407.         LJMP        SZTZ

  408. ;----------------------------------------------------------------------------------------
  409. ;子程序:編碼器按鍵開(kāi)關(guān)處理
  410. ;出口參數(shù):A=1(按了1次);A=2(按了2次);A=3長(zhǎng)按達(dá)到了15秒;A=4長(zhǎng)按達(dá)到了5秒
  411. ;----------------------------------------------------------------------------------------
  412. KEY:        MOV        MJS,#15                ;放入等待時(shí)間,15秒
  413. KEY1:        MOV        A,MJS                ;裝入等待時(shí)間
  414.         JNZ        KEY2                ;如果不為0就轉(zhuǎn)移,時(shí)間未到
  415.         MOV        A,#3                ;為0,時(shí)間到了,放入3到A寄存器,長(zhǎng)按達(dá)到了15秒
  416.         RET
  417. KEY2:        LCALL        SKEY                ;掃描按鍵
  418.         JC        KEY1                ;如果C=1(按鍵還沒(méi)松開(kāi)),就繼續(xù)掃描
  419.         CJNE        A,#10,KEY3        ;按鍵松開(kāi)了,剩余時(shí)間與10比較,不等于就轉(zhuǎn)移
  420.         LJMP        KEY4                ;等于10,長(zhǎng)按時(shí)間達(dá)到了5秒(15-10=5)
  421. KEY3:        JNC        KEY5                ;大于10就轉(zhuǎn)移
  422. KEY4:        MOV        A,#4                ;等于或小于10,放入4到A寄存器,長(zhǎng)按時(shí)間達(dá)到了5秒以上
  423.         RET
  424. KEY5:        LCALL        KEYA                ;大于10,按下的時(shí)間小于5秒,掃描按鍵600毫秒
  425.         JZ        KEY6                ;如果600毫秒內(nèi)有按鍵動(dòng)作就轉(zhuǎn)移
  426.         RET                        ;600毫秒內(nèi)沒(méi)有按鍵動(dòng)作,這時(shí)A=1(按了1次),退出
  427. KEY6:        LCALL        KEYEX                ;等待第二次按鍵松開(kāi)
  428.         MOV        A,#2                ;按鍵松開(kāi)了,A=2(按了2次)
  429.         RET

  430. ;------------------ 掃描按鍵開(kāi)關(guān)600毫秒,有按鍵動(dòng)作A=0,無(wú)按鍵動(dòng)作A=1 ------------------
  431. KEYA:        PUSH        03H
  432.         MOV        03H,#60                ;等待600毫秒,10*60=600毫秒
  433. KEYB:        MOV        A,SJJS                ;裝入(10)毫秒計(jì)數(shù)
  434. KEYC:        CJNE        A,SJJS,KEYD        ;如果不相同就轉(zhuǎn)移,說(shuō)明時(shí)間已經(jīng)過(guò)了10毫秒
  435.         LCALL        SKEY                ;掃描按鍵
  436.         JC        KEYE                ;如果有按鍵動(dòng)作(C=1)就轉(zhuǎn)移
  437.         LJMP        KEYC
  438. KEYD:        DJNZ        03H,KEYB        ;03H減1,不為0就轉(zhuǎn)移,繼續(xù)掃描
  439.         POP        03H
  440.         MOV        A,#1                ;600毫秒等待時(shí)間已到,A=1沒(méi)有按鍵動(dòng)作
  441.         RET
  442. KEYE:        POP        03H
  443.         CLR        A                ;600毫秒內(nèi)有按鍵動(dòng)作A=0
  444.         RET

  445. ;------------------ 等待按鍵松開(kāi) ------------------
  446. KEYEX:        LCALL        SKEY                ;掃描按鍵
  447.         JC        KEYEX                ;如果C=1(按鍵還沒(méi)松開(kāi)),就繼續(xù)掃描
  448.         RET

  449. ;------------------ 按鍵開(kāi)關(guān)掃描,未按C=0,已按下C=1 ------------------
  450. SKEY:        SETB        EC11K                ;按鍵開(kāi)關(guān)設(shè)為高電平
  451.         JNB        EC11K,SKEY1        ;為0(低電平)就轉(zhuǎn)移,表示按鍵開(kāi)關(guān)已經(jīng)被按下
  452. SKEY0:        CLR        C                ;為1(高電平),C置為0,沒(méi)有按鍵動(dòng)作
  453.         LCALL        WG                ;喂狗
  454.         RET
  455. SKEY1:        PUSH        00H                ;按鍵已被按下,延時(shí)10毫秒
  456.         PUSH        01H                ;延時(shí)10毫秒
  457.         MOV        00H,#87                ;延時(shí)10毫秒
  458.         MOV        01H,#10                ;延時(shí)10毫秒
  459. SKEY2:        DJNZ        01H,SKEY2        ;延時(shí)10毫秒
  460.         DJNZ        00H,SKEY2        ;延時(shí)10毫秒
  461.         POP        01H                ;延時(shí)10毫秒
  462.         POP        00H                ;延時(shí)10毫秒
  463.         SETB        EC11K                ;延時(shí)結(jié)束后再次把按鍵開(kāi)關(guān)設(shè)為高電平
  464.         JB        EC11K,SKEY0        ;為1就轉(zhuǎn)移,按鍵開(kāi)關(guān)未被有效按下
  465.         SETB        C                ;為1,按鍵動(dòng)作有效,置C為1
  466.         LCALL        WG                ;喂狗
  467.         RET

  468. ;*************************** 以下為EEPROM操作子程序 **********************************
  469. ;STC89C51RC有4K字節(jié)的EEPROM,由8個(gè)扇區(qū)組成,每個(gè)扇區(qū)512字節(jié),地址2000H-2FFFH
  470. ;第1扇區(qū):2000H~21FFH,第2扇區(qū):2200H~23FFH……第8扇區(qū):2E00H~2FFFH
  471. ;-------------------------------------------
  472. ;讀一字節(jié),A=讀出的數(shù)據(jù)
  473. Byte_Read:
  474.         MOV        IAP_CONTR,#ENABLE_IAP        ;打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間(83H)
  475.         MOV        IAP_CMD,#01                ;設(shè)置為IAP/ISP/EEPROM字節(jié)讀模式命令(1)
  476.         MOV        IAP_TRIG,#46H                ;先送46H
  477.         MOV        IAP_TRIG,#0B9H                ;再送B9H,ISP/IAP命令立即被觸發(fā)起動(dòng)
  478.         NOP
  479.         MOV        A,IAP_DATA                ;讀出的數(shù)據(jù)在IAP_DATA單元中,送入累加器A
  480.         RET
  481. ;-------------------------------------------
  482. ;字節(jié)編程,A=需寫(xiě)入的數(shù)據(jù)
  483. Byte_Program:
  484.         MOV        IAP_CONTR,#ENABLE_IAP        ;打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間(83H)
  485.         MOV        IAP_CMD,#02                ;設(shè)置為IAP/ISP/EEPROM字節(jié)編程模式命令(2)
  486.         MOV        IAP_DATA,A                ;要編程的數(shù)據(jù)先送進(jìn)IAP_DATA寄存器
  487.         MOV        IAP_TRIG,#46H                ;先送46H
  488.         MOV        IAP_TRIG,#0B9H                ;再送B9H,ISP/IAP命令立即被觸發(fā)起動(dòng)
  489.         RET
  490. ;-------------------------------------------
  491. ;擦除扇區(qū)
  492. Sector_Erase:
  493.         MOV        IAP_CONTR,#ENABLE_IAP        ;打開(kāi)IAP功能,設(shè)置Flash操作等待時(shí)間(83H)
  494.         MOV        IAP_CMD,#03                ;設(shè)置為IAP/ISP/EEPROM扇區(qū)擦除模式命令(3)
  495.         MOV        IAP_TRIG,#46H                ;先送46H
  496.         MOV        IAP_TRIG,#0B9H                ;再送B9H,ISP/IAP命令立即被觸發(fā)起動(dòng)
  497.         NOP
  498.         RET

  499. ;---------- 讀EEPROM保存的各項(xiàng)設(shè)置,如果沒(méi)有就設(shè)置為默認(rèn)值并保存 ------------
  500. REEP:        LCALL        RE00                ;讀EEPROM保存的各項(xiàng)設(shè)置
  501.         MOV        A,SDDS                ;裝入“上電就自動(dòng)設(shè)定的定時(shí)時(shí)間(小時(shí))”
  502.         JZ        REEP0                ;如果是0就轉(zhuǎn)移,退出
  503.         MOV        DSSJS,A                ;放入“定時(shí)時(shí)間(小時(shí))”
  504.         MOV        DSSJM,#59        ;放入59到“定時(shí)時(shí)間(秒)”
  505. REEP0:        RET
  506. RE00:        MOV        IAP_ADDRH,#020H        ;從第一個(gè)扇區(qū)開(kāi)始搜索,地址的高8位
  507. RE01:        MOV        IAP_ADDRL,#0        ;從第一個(gè)扇區(qū)開(kāi)始搜索,地址的低8位
  508.         LCALL        Byte_Read        ;讀第一個(gè)字節(jié),返回:A=讀出的數(shù)據(jù)
  509.         CJNE        A,FWBZ1,RE03        ;是否保存在當(dāng)前扇區(qū),不是就轉(zhuǎn)移到RE03
  510.         INC        IAP_ADDRL        ;EEPROM字節(jié)地址增1
  511.         LCALL        Byte_Read        ;讀第二個(gè)字節(jié)
  512.         CJNE        A,FWBZ2,RE03        ;第二個(gè)字節(jié)是否相符
  513.         MOV        R1,#ZRFZQ        ;相符,從ZRFZQ開(kāi)始放置讀出的設(shè)置值
  514.         MOV        R2,#5                ;總共5個(gè)字節(jié)
  515. RE02:        INC        IAP_ADDRL        ;EEPROM字節(jié)地址增1
  516.         LCALL        Byte_Read        ;讀一個(gè)字節(jié),返回:A=讀出的數(shù)據(jù)
  517.         MOV        @R1,A                ;放到R1指向的RAM地址
  518.         INC        R1                ;RAM地址增1
  519.         DJNZ        R2,RE02                ;未讀完就繼續(xù)
  520.         RET                        ;讀完了,退出
  521. RE03:        MOV        A,IAP_ADDRH        ;裝入扇區(qū)地址的高8位
  522.         ADD        A,#2                ;扇區(qū)增1
  523.         MOV        IAP_ADDRH,A        ;放入IAP_ADDRH
  524.         CJNE        A,#30H,RE01        ;如果未搜索完最后一個(gè)扇區(qū)+2(2EH+2=30H)就轉(zhuǎn)移,繼續(xù)搜索
  525.         LCALL        SZMRZ                ;已經(jīng)搜索全部八個(gè)扇區(qū),未找到保存的內(nèi)容,設(shè)置為默認(rèn)值
  526.         MOV        R0,#8                ;總扇區(qū)數(shù)量,共8個(gè)扇區(qū)
  527.         LJMP        WSET3                ;跳轉(zhuǎn)到WSET3保存設(shè)置

  528. ;------------------ 保存設(shè)置,不固定保存到某個(gè)扇區(qū),各扇區(qū)輪流使用 ------------------
  529. WSET:        MOV        R0,#8                ;扇區(qū)總數(shù)量,共8個(gè)扇區(qū)
  530.         MOV        IAP_ADDRH,#020H        ;從第一個(gè)扇區(qū)開(kāi)始搜索上次保存的設(shè)置
  531. WSET1:        MOV        IAP_ADDRL,#0        ;地址低位指向第一個(gè)字節(jié)
  532.         LCALL        Byte_Read        ;讀第一個(gè)字節(jié),返回:A=讀出的數(shù)據(jù)
  533.         CJNE        A,FWBZ1,WSET7        ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志1不相同就轉(zhuǎn)移
  534.         INC        IAP_ADDRL        ;第一個(gè)字節(jié)相同,EEPROM字節(jié)地址增1
  535.         LCALL        Byte_Read        ;讀第二個(gè)字節(jié)
  536.         CJNE        A,FWBZ2,WSET7        ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志2不相同就轉(zhuǎn)移
  537.         MOV        IAP_ADDRL,#0        ;是在當(dāng)前扇區(qū),地址指向扇區(qū)第一個(gè)字節(jié)
  538.         LCALL        Sector_Erase        ;擦除當(dāng)前扇區(qū),另?yè)Q一個(gè)扇區(qū)保存
  539. WSET2:        MOV        A,IAP_ADDRH        ;裝入扇區(qū)地址高位到寄存器A
  540.         CJNE        A,#020H,WSET3        ;當(dāng)前扇區(qū)地址高位如果不是20H(第一個(gè)扇區(qū))就轉(zhuǎn)移
  541.         MOV        IAP_ADDRH,#30H        ;是20H,把IAP_ADDRH設(shè)置為最后一個(gè)扇區(qū)+2(2EH+2=30H)
  542. WSET3:        DEC        IAP_ADDRH        ;減1
  543.         DEC        IAP_ADDRH        ;再減1,指向上一個(gè)扇區(qū)首址
  544.         MOV        IAP_ADDRL,#0        ;低8位指向扇區(qū)第一個(gè)字節(jié)
  545.         LCALL        Sector_Erase        ;擦除整個(gè)扇區(qū)
  546.         MOV        R1,#FWBZ1        ;要保存的內(nèi)容始址
  547.         MOV        R2,#7                ;共7個(gè)字節(jié)
  548. WSET4:        MOV        A,@R1                ;裝入R1指向的RAM地址的內(nèi)容到A
  549.         LCALL        Byte_Program        ;字節(jié)編程(寫(xiě)入EEPROM)
  550.         INC        IAP_ADDRL        ;EEPROM地址加1
  551.         INC        R1                ;RAM地址增1
  552.         DJNZ        R2,WSET4        ;未保存完就繼續(xù)
  553.         MOV        IAP_ADDRL,#0        ;保存完了,扇區(qū)地址低位指向0(當(dāng)前扇區(qū)首址)
  554.         LCALL        Byte_Read        ;讀出來(lái)檢查看是否寫(xiě)入成功
  555.         CJNE        A,FWBZ1,WSET5        ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志1不相同就轉(zhuǎn)移
  556.         INC        IAP_ADDRL        ;EEPROM地址加1
  557.         LCALL        Byte_Read        ;讀第二個(gè)字節(jié)
  558.         CJNE        A,FWBZ2,WSET5        ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志2不相同就轉(zhuǎn)移
  559.         RET                        ;成功了,退出
  560. WSET5:        DJNZ        R0,WSET2        ;如果未試完8個(gè)扇區(qū)就轉(zhuǎn)移到WSET2繼續(xù)往前一個(gè)扇區(qū)寫(xiě)
  561.         SETB        07H                ;已經(jīng)試完8個(gè)扇區(qū),都失敗了,位地址07H置為1
  562.         MOV        SSSC,#5                ;顯示E1五秒
  563.         MOV        ZXM1,#0                ;消隱碼
  564.         MOV        ZXM2,#079H        ;E
  565.         MOV        ZXM3,#006H        ;1
  566.         MOV        ZXM4,#0                ;消隱碼
  567.         LCALL        DISP                ;顯示
  568. WSET6:        MOV        A,SSSC
  569.         LCALL        WG                ;喂狗
  570.         JNZ        WSET6                ;等待SSSC為0秒
  571.         CLR        07H                ;顯示結(jié)束,位地址07H置為0
  572.         RET
  573. WSET7:        MOV        A,IAP_ADDRH        ;裝入扇區(qū)地址高位
  574.         ADD        A,#2                ;加2,指向下一個(gè)扇區(qū)首址
  575.         MOV        IAP_ADDRH,A        ;放回IAP_ADDRH
  576.         CJNE        A,#30H,WSET1        ;如果未到最后一個(gè)扇區(qū)地址高位+2(2EH+2=30H)就轉(zhuǎn)移到WSET1繼續(xù)搜索
  577.         LJMP        WSET3                ;是30H,已經(jīng)搜索完所有扇區(qū),未找到上次保存的數(shù)據(jù),跳轉(zhuǎn)到WSET3保存當(dāng)前設(shè)置
  578. ;***************************************** 以上為EEPROM操作子程序 ********************************************

  579. ;------------------------------------------------------------------------------------------
  580. ;子程序:T0中斷調(diào)用,時(shí)間計(jì)數(shù)及倒計(jì)時(shí)處理
  581. ;------------------------------------------------------------------------------------------
  582. TIME:        MOV        A,SJJS                 ;裝入(10)毫秒時(shí)間計(jì)數(shù)
  583.         JZ        TIME2                ;如果是0就轉(zhuǎn)移
  584.         DEC        SJJS                ;不是0,減1
  585.         CJNE        A,#50,TIME1        ;如果不是50就轉(zhuǎn)移退出
  586.         CPL        05H                ;位地址第05位取反,數(shù)字及冒號(hào)閃爍時(shí)用,每0.5秒取反一次
  587. TIME1:        RET
  588. TIME2:        CPL        05H                ;是0,位地址第05位取反,數(shù)字及冒號(hào)閃爍時(shí)用,每0.5秒取反一次
  589.         MOV        DPTR,#HMJS        ;把定義的時(shí)間計(jì)數(shù)值地址裝入數(shù)據(jù)指針DPTR
  590.         MOVC        A,@A+DPTR        ;從程序存儲(chǔ)區(qū)裝入時(shí)間計(jì)數(shù)值到A寄存器
  591.         MOV        SJJS,A                ;時(shí)間計(jì)數(shù)值放入SJJS,重新計(jì)數(shù)
  592.         MOV        A,MJS                 ;裝入秒計(jì)數(shù)
  593.         JZ        TIME20                ;如果是0就轉(zhuǎn)移
  594.         DEC        MJS                ;不是0,減1秒
  595. TIME20:        MOV        A,SSSC                 ;裝入閃爍時(shí)長(zhǎng)秒計(jì)數(shù)
  596.         JZ        TIME3                ;如果是0就轉(zhuǎn)移
  597.         DEC        SSSC                ;不是0,減1秒
  598. TIME3:        MOV        A,SJ                ;裝入自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)到寄存器A
  599.         JZ        TIME4                ;如果是0就轉(zhuǎn)移
  600.         DEC        SJ                ;不是0,減1秒
  601. TIME4:        MOV        A,ZQ                ;裝入自然風(fēng)變化周期時(shí)長(zhǎng)到寄存器A
  602.         DEC        ZQ                ;先減1
  603.         JNZ        TIME5                ;如果不是0就轉(zhuǎn)移
  604.         MOV        ZQ,ZRFZQ        ;是0,重新裝入設(shè)置值
  605.         MOV        SJ,ZRFSJ        ;是0,重新裝入設(shè)置值
  606. TIME5:        MOV        A,DSSJM                ;裝入定時(shí)時(shí)間(秒)到寄存器A
  607.         JZ        TIME7                ;如果是0就轉(zhuǎn)移
  608.         CJNE        A,#59,TIME6        ;如果不是59秒就轉(zhuǎn)移
  609.         MOV        A,DSSJF                ;是59秒,檢查“時(shí)”
  610.         JNZ        TIME6                ;不是0就轉(zhuǎn)移
  611.         MOV        A,DSSJS                ;檢查“分”
  612.         JNZ        TIME6                ;不是0就轉(zhuǎn)移
  613.         MOV        DSSJM,A                ;“時(shí)、分”都是0,把“秒”也清零
  614.         RET
  615. TIME6:        DEC        DSSJM                ;不是0,減1秒
  616.         RET
  617. TIME7:        MOV        A,DSSJF                ;裝入定時(shí)時(shí)間(分)到寄存器A
  618.         JZ        TIME8                ;如果是0就轉(zhuǎn)移
  619.         DEC        DSSJF                ;不是0,減1分
  620.         MOV        DSSJM,#59        ;把59放入定時(shí)時(shí)間(秒)
  621.         RET
  622. TIME8:        MOV        A,DSSJS                ;裝入定時(shí)時(shí)間(時(shí))到寄存器A
  623.         JZ        TIME9                ;如果是0就轉(zhuǎn)移,退出
  624.         DEC        DSSJS                ;不是0,小時(shí)減1
  625.         MOV        DSSJM,#59        ;把59放入定時(shí)時(shí)間(秒)
  626.         MOV        DSSJF,#59        ;把59放入定時(shí)時(shí)間(分)
  627. TIME9:        RET

  628. ;---------------------------------------------------------------------------------------------
  629. ;子程序:T0中斷調(diào)用,根據(jù)條件控制自然風(fēng)狀態(tài)LED指示燈和可控硅
  630. ;---------------------------------------------------------------------------------------------
  631. Control:SETB        LED                ;先熄滅自然風(fēng)LED指示燈
  632.         JNB        02H,CTL00        ;如果位地址02H(正常/自然風(fēng)切換)為0(正常)就轉(zhuǎn)移,保持熄滅狀態(tài)
  633.         CLR        LED                ;為1,自然風(fēng)狀態(tài),點(diǎn)亮LED指示燈
  634. CTL00:        MOV        A,DSSJM                ;裝入定時(shí)時(shí)間(秒)到寄存器A
  635.         JNZ        CTL02                ;如果不是0就轉(zhuǎn)移
  636.         MOV        A,DSSJF                ;裝入定時(shí)時(shí)間(分)到寄存器A
  637.         JNZ        CTL02                ;如果不是0就轉(zhuǎn)移
  638.         MOV        A,DSSJS                ;裝入定時(shí)時(shí)間(時(shí))到寄存器A
  639.         JNZ        CTL02                ;如果不是0就轉(zhuǎn)移
  640. CTL01:        SETB        MOC                ;置MOC為高電平,斷電
  641.         RET
  642. CTL02:        JNB        02H,CTL03        ;如果位地址02H(正常/自然風(fēng)切換)為0(正常)就轉(zhuǎn)移,通電
  643.         MOV        A,SJ                ;是自然風(fēng)狀態(tài),裝入自然風(fēng)時(shí)電機(jī)通電時(shí)長(zhǎng)到寄存器A
  644.         JZ        CTL01                ;如果為0(通電倒計(jì)時(shí)結(jié)束)就轉(zhuǎn)移,斷電
  645. CTL03:        CLR        MOC                ;置MOC為低電平,通電
  646.         RET

  647. ;------------------------------------------------------------------------------------------
  648. ;子程序:T0中斷調(diào)用,顯示定時(shí)時(shí)間及各項(xiàng)設(shè)置的內(nèi)容
  649. ;------------------------------------------------------------------------------------------
  650. DISPLAY:JB        06H,DPYSZ1        ;如果位地址06H為1就轉(zhuǎn)移退出,主程序顯示88:88
  651.         JB        07H,DPYSZ1        ;如果位地址07H為1就轉(zhuǎn)移退出,主程序顯示E1
  652.         MOV        A,DISPL                ;裝入要顯示的目標(biāo)
  653.         JZ        DISPL0                ;如果是0(顯示定時(shí)時(shí)間)就轉(zhuǎn)移
  654. DPYSZ:        PUSH        ACC
  655.         MOV        DPTR,#SEGTAB        ;查表獲取字形碼
  656.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  657.         MOV        ZXM1,A                ;項(xiàng)目編號(hào)字形碼放到待發(fā)送TM1637區(qū)1
  658.         MOV        ZXM2,#40H        ;放入“-”的字形碼到待發(fā)送TM1637區(qū)2
  659.         POP        ACC
  660.         DEC        A                ;減1
  661.         PUSH        01H
  662.         MOV        R1,#ZRFZQ        ;各項(xiàng)設(shè)置值始址
  663.         ADD        A,R1                ;加上項(xiàng)目號(hào)
  664.         MOV        R1,A                ;得出設(shè)置項(xiàng)目的實(shí)際地址放入R1
  665.         MOV        A,@R1                ;裝入設(shè)置值
  666.         POP        01H
  667.         MOV        B,A                ;放入B寄存器
  668.         CJNE        A,XSHC1,DPYSZ3        ;當(dāng)前設(shè)置值與顯示緩存1不相同就轉(zhuǎn)移,立即顯示
  669.         MOV        A,SJJS                 ;相同,裝入時(shí)間計(jì)數(shù)
  670.         JNZ        DPYSZ2                ;不是0就轉(zhuǎn)移,每半秒(遇到50或0)顯示一次
  671.         LJMP        DPYSZ3                ;是0,顯示
  672. DPYSZ1:        RET
  673. DPYSZ2:        CJNE        A,#50,DPYSZ1        ;不是50就轉(zhuǎn)移退出,每半秒(遇到50或0)顯示一次
  674. DPYSZ3:        MOV        XSHC1,B                ;當(dāng)前設(shè)置值放入顯示緩存1
  675.         JNB        04H,DPYSZ4        ;如果位地址04H為0(不閃爍)就轉(zhuǎn)移
  676.         JNB        05H,DPYSZ4        ;為1,閃爍顯示,如果位地址05H為0(顯示)就轉(zhuǎn)移
  677.         CLR        A                ;為1,處于閃爍顯示中的“不顯示”狀態(tài),放入消隱碼
  678.         MOV        ZXM1,A                ;放入消隱碼
  679.         MOV        ZXM2,A                ;放入消隱碼
  680.         MOV        ZXM3,A                ;放入消隱碼
  681.         MOV        ZXM4,A                ;放入消隱碼
  682.         LJMP        disp                ;跳轉(zhuǎn)到disp,發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示
  683. DPYSZ4:        MOV        A,B                ;當(dāng)前設(shè)置值放入A寄存器
  684.         LCALL        DISPL6                ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)3和4
  685.         LJMP        disp                ;跳轉(zhuǎn)到disp,發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示
  686. DISPL0:        MOV        A,DSSJS                ;顯示定時(shí)時(shí)間,裝入定時(shí)時(shí)間(時(shí))
  687.         CJNE        A,XSHC1,DISPL3        ;定時(shí)時(shí)間(時(shí))與顯示緩存1不相同就轉(zhuǎn)移,顯示
  688.         MOV        A,DSSJF
  689.         CJNE        A,XSHC2,DISPL3        ;定時(shí)時(shí)間(分)與顯示緩存2不相同就轉(zhuǎn)移,顯示
  690.         MOV        A,SJJS                 ;時(shí)、分都相同,裝入(10)毫秒時(shí)間計(jì)數(shù)
  691.         JNZ        DISPL2                ;不是0就轉(zhuǎn)移
  692.         LJMP        DISPL3                ;是0,顯示,每半秒(遇到50或0)顯示一次
  693. DISPL1:        RET
  694. DISPL2:        CJNE        A,#50,DISPL1        ;不是50就轉(zhuǎn)移,每半秒(遇到50或0)顯示一次
  695. DISPL3:        MOV        XSHC1,DSSJS        ;當(dāng)前時(shí)間放入顯示緩存1
  696.         MOV        XSHC2,DSSJF        ;當(dāng)前時(shí)間放入顯示緩存2
  697.         MOV        A,DSSJM                ;
  698.         JNZ        DISPL4                ;檢查當(dāng)前定時(shí)時(shí)間是否全部為0,不是就轉(zhuǎn)移
  699.         MOV        A,DSSJF                ;
  700.         JNZ        DISPL4                ;檢查當(dāng)前定時(shí)時(shí)間是否全部為0,不是就轉(zhuǎn)移
  701.         MOV        A,DSSJS                ;
  702.         JNZ        DISPL4                ;檢查當(dāng)前定時(shí)時(shí)間是否全部為0,不是就轉(zhuǎn)移
  703.         CLR        05H                ;定時(shí)時(shí)間為0,把位地址05H置為0,冒號(hào)不閃爍顯示
  704. DISPL4:        MOV        A,DSSJS                ;裝入“時(shí)”
  705.         MOV        B,#10                ;轉(zhuǎn)換為BCD碼
  706.         DIV        AB                ;轉(zhuǎn)換為BCD碼
  707.         MOV        DPTR,#SEGTAB        ;查表獲取字形碼
  708.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  709.         MOV        ZXM1,A                ;字形碼放入待發(fā)送TM1637區(qū)1
  710.         XCH        A,B                ;A、B寄存器內(nèi)容交換
  711.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  712.         JB        05H,DISPL5        ;如果05H為1就轉(zhuǎn)移,不顯示冒號(hào)
  713.         ORL        A,#10000000B        ;為0,把最高位置為1,顯示冒號(hào)(字形碼的最高位為1就顯示冒號(hào))
  714. DISPL5:        MOV        ZXM2,A                ;放入待發(fā)送TM1637區(qū)2
  715.         MOV        A,DSSJF                ;裝入“分”
  716.         LCALL        DISPL6                ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)3和4
  717.         LJMP        disp                ;跳轉(zhuǎn)到disp,發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示
  718. DISPL6:        MOV        B,#10                ;轉(zhuǎn)換為BCD碼
  719.         DIV        AB                ;轉(zhuǎn)換為BCD碼
  720.         MOV        DPTR,#SEGTAB        ;查表獲取字形碼
  721.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  722.         MOV        ZXM3,A                ;字形碼放入待發(fā)送TM1637區(qū)3
  723.         XCH        A,B                ;A、B寄存器內(nèi)容交換
  724.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  725.         MOV        ZXM4,A                ;字形碼放入待發(fā)送TM1637區(qū)4
  726.         RET

  727. ;------------------ 發(fā)送4個(gè)字節(jié)數(shù)據(jù)到TM1637顯示,地址自動(dòng)加1 ------------------
  728. disp:        LCALL        Srt
  729.         MOV          A,#040H                ;數(shù)據(jù)命令設(shè)置40H:地址自動(dòng)加1,寫(xiě)數(shù)據(jù)到顯示寄存器
  730.         LCALL        Writebyte        ;發(fā)送一個(gè)字節(jié)
  731.         LCALL        Stop
  732.         NOP
  733.         LCALL        Srt
  734.         MOV          A,#0C0H                ;地址命令設(shè)置C0H:初始地址為00H
  735.         LCALL        Writebyte        ;發(fā)送一個(gè)字節(jié)
  736.         PUSH        01H
  737.         PUSH        06H
  738.         MOV        06H,#4                ;發(fā)送4個(gè)字節(jié)數(shù)據(jù)
  739.         MOV          R1,#ZXM1        ;等待發(fā)送的字形碼始址
  740. disp1:        MOV          A,@R1                ;裝入要發(fā)送的字形碼
  741.         LCALL        Writebyte        ;發(fā)送一個(gè)字節(jié)
  742.         INC          R1                ;地址加1
  743.         DJNZ        06H,disp1            ;如果還未發(fā)送完就繼續(xù)
  744.         POP        06H
  745.         POP        01H
  746.         LCALL        Stop
  747.         LCALL        Srt
  748.         MOV        A,SMGLD                ;裝入設(shè)置的數(shù)碼管亮度(1~8)
  749.         ADD        A,#087H                ;加上87H后即為對(duì)應(yīng)的亮度控制命令88H~8FH
  750.         LCALL        Writebyte        ;按設(shè)置的亮度開(kāi)顯示
  751.         LJMP         Stop

  752. ;------------------ 發(fā)送8bit(一個(gè)字節(jié))數(shù)據(jù)到TM1637,A=要發(fā)送的數(shù)據(jù),從低位開(kāi)始 ------------------
  753. Writebyte:
  754.         PUSH        00H
  755.         MOV        00H,#8                ;發(fā)送8位數(shù)據(jù)
  756. WBY1:        CLR          CLK                ;拉低CLK
  757.         JNB          ACC.0,WBY2        ;A寄存器的低位(0位)如果為0就轉(zhuǎn)移
  758.         SETB         DIO                ;為1,拉高DIO
  759.         SJMP         WBY3
  760. WBY2:        CLR          DIO                ;為0,拉低DIO
  761. WBY3:        NOP         
  762.         NOP         
  763.         NOP         
  764.         NOP         
  765.         NOP         
  766.         SETB         CLK                ;拉高CLK
  767.         CLR          C                ;進(jìn)位標(biāo)志清0
  768.         RRC          A                ;A寄存器內(nèi)容帶進(jìn)位循環(huán)右移
  769.         DJNZ        00H,WBY1            ;如果還未發(fā)送完8bit數(shù)據(jù)就繼續(xù)
  770. WBY4:        CLR          CLK                ;8位數(shù)據(jù)發(fā)送完了
  771.         NOP
  772.         MOV        00H,#05                ;設(shè)置等待應(yīng)答信號(hào)計(jì)數(shù)值,防止萬(wàn)一與TM1637通訊失敗而造成死循環(huán)
  773. WBY5:        DEC        00H                ;減1,正常情況下ACK應(yīng)答信號(hào)很快,第一次減1就會(huì)有應(yīng)答
  774.         MOV        A,00H                ;裝入計(jì)數(shù)值到A
  775.         JZ        WBY6                ;如果為0就轉(zhuǎn)移退出,說(shuō)明與TM1637通訊失敗,或TM1637不存在
  776.         JB        DIO,WBY5        ;不為0,判斷TM1637發(fā)過(guò)來(lái)的ACK應(yīng)答信號(hào),未應(yīng)答(為1,高電平)就轉(zhuǎn)移
  777. WBY6:        POP        00H
  778.         NOP         
  779.         NOP         
  780.         NOP
  781.         SETB         CLK
  782.         NOP         
  783.         NOP         
  784.         NOP
  785.         RET         

  786. ;------------------ Start子程序 ------------------
  787. Srt:        SETB         DIO        ;拉高DIO
  788.         SETB         CLK        ;拉高CLK
  789.         NOP         
  790.         NOP         
  791.         NOP         
  792.         NOP         
  793.         NOP         
  794.         SETB         DIO        ;拉高DIO
  795.         NOP         
  796.         NOP         
  797.         NOP         
  798.         NOP         
  799.         NOP         
  800.         CLR          DIO        ;拉低DIO
  801.         NOP         
  802.         NOP         
  803.         NOP         
  804.         NOP         
  805.         NOP         
  806.         CLR          CLK        ;拉低CLK
  807.         RET         

  808. ;------------------ Stop子程序 ------------------
  809. Stop:        CLR          CLK
  810.         NOP         
  811.         NOP         
  812.         NOP         
  813.         NOP         
  814.         NOP         
  815.         NOP         
  816.         NOP         
  817.         NOP         
  818.         NOP         
  819.         NOP         
  820.         CLR          DIO
  821.         NOP         
  822.         NOP         
  823.         NOP         
  824.         NOP         
  825.         NOP         
  826.         NOP         
  827.         NOP         
  828.         NOP         
  829.         NOP         
  830.         NOP         
  831.         SETB         CLK
  832.         NOP         
  833.         NOP         
  834.         NOP         
  835.         NOP         
  836.         NOP         
  837.         NOP         
  838.         NOP         
  839.         NOP         
  840.         NOP         
  841.         NOP         
  842.         NOP         
  843.         NOP         
  844.         NOP         
  845.         NOP         
  846.         NOP         
  847.         SETB         DIO
  848.         NOP         
  849.         NOP         
  850.         NOP         
  851.         NOP         
  852.         NOP         
  853.         CLR          CLK
  854.         CLR          DIO
  855.         RET         

  856. ;------------------ 字形表 ------------------
  857. SEGTAB:
  858.         DB  00111111B  ;0(3FH)
  859.         DB  00000110B  ;1(06H)
  860.         DB  01011011B  ;2(5BH)
  861.         DB  01001111B  ;3(4FH)
  862.         DB  01100110B  ;4(66H)
  863.         DB  01101101B  ;5(6DH)
  864.         DB  01111101B  ;6(7DH)
  865.         DB  00000111B  ;7(07H)
  866.         DB  01111111B  ;8(7FH)
  867.         DB  01101111B  ;9(6FH)
  868.         DB  01110111B  ;A(77H)
  869.         DB  01111100B  ;B(7CH)
  870.         DB  00111001B  ;C(39H)
  871.         DB  01011110B  ;D(5EH)
  872.         DB  01111001B  ;E(79H)
  873.         DB  01110001B  ;F(71H)
  874.         DB  00000000B  ;消隱碼(00)

  875. ;------------------------------------------------------------------------------------------

  876.         END
復(fù)制代碼

以上資料51hei下載地址:
電風(fēng)扇長(zhǎng)定時(shí)器.rar (95.52 KB, 下載次數(shù): 98)


評(píng)分

參與人數(shù) 2黑幣 +100 收起 理由
新鄉(xiāng)家電維修 + 10 共享資料的黑幣獎(jiǎng)勵(lì)!
admin + 90 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:517951 發(fā)表于 2020-11-13 21:34 | 只看該作者
完全匯編,牛!
回復(fù)

使用道具 舉報(bào)

板凳
ID:756506 發(fā)表于 2020-11-14 08:24 | 只看該作者
樓主好牛,匯編玩的這么溜,膜拜!
回復(fù)

使用道具 舉報(bào)

地板
ID:8222 發(fā)表于 2020-11-15 08:51 | 只看該作者
這是個(gè)大牛。『軈柡Γ!
回復(fù)

使用道具 舉報(bào)

5#
ID:8222 發(fā)表于 2021-1-6 13:30 | 只看該作者
看匯編,就象看天書(shū)!牛人才能玩這個(gè)!!
回復(fù)

使用道具 舉報(bào)

6#
ID:23844 發(fā)表于 2021-1-30 17:36 | 只看該作者
匯編玩的溜,大俠級(jí)別,如果沒(méi)有寫(xiě)注釋的話(huà),比較難看懂。樓主威武
回復(fù)

使用道具 舉報(bào)

7#
ID:87631 發(fā)表于 2021-2-2 16:37 | 只看該作者
牛人啊,這只在學(xué)校玩過(guò),現(xiàn)在不玩了
回復(fù)

使用道具 舉報(bào)

8#
ID:430492 發(fā)表于 2022-4-7 13:05 | 只看該作者
樓主好牛匯編玩的這么溜,膜拜中!。!
回復(fù)

使用道具 舉報(bào)

9#
ID:76044 發(fā)表于 2022-8-25 11:20 | 只看該作者
樓主 能否辛苦下把TM1637顯示這部分的匯編代碼發(fā)一下,如讓數(shù)碼管顯示1.2.3.4.5.6,辛苦一下,很期待
回復(fù)

使用道具 舉報(bào)

10#
ID:53978 發(fā)表于 2022-9-1 17:05 | 只看該作者
可以用TM1650嗎?
回復(fù)

使用道具 舉報(bào)

11#
ID:748535 發(fā)表于 2022-11-8 16:10 | 只看該作者
不錯(cuò)不錯(cuò)  , 可以移植
回復(fù)

使用道具 舉報(bào)

12#
ID:1088110 發(fā)表于 2023-7-11 16:52 | 只看該作者
這匯編666
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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