找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8011|回復(fù): 11
收起左側(cè)

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

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

電路原理圖如下:
電路接線圖.JPG


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

  38. ;--------------------------- 位地址及RAM的使用 ---------------------------
  39. ;(20H)第0位:1=編碼器已經(jīng)轉(zhuǎn)動,等待主程序處理,0=沒有轉(zhuǎn)動或主程序已處理
  40. ;(20H)第1位:1=編碼器順時針正轉(zhuǎn);0=編碼器逆時針反轉(zhuǎn)
  41. ;(20H)第2位:1=自然風(fēng)狀態(tài);0=正常狀態(tài)
  42. ;(20H)第3位:1=禁止;0=允許。進(jìn)行各項設(shè)置時使用,允許/禁止檢查剩余時間
  43. ;(20H)第4位:1=閃爍顯示;0=不閃爍。進(jìn)行各項設(shè)置時用
  44. ;(20H)第5位:1=不顯示,0=顯示,數(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)時通斷電周期時長
  50.         ZRFSJ        EQU        025H        ;自然風(fēng)時電機(jī)通電時長
  51.         BMQZJ        EQU        026H          ;編碼器每轉(zhuǎn)動一小格的增(減)值
  52.         SDDS        EQU        027H        ;上電就自動設(shè)定的定時時間(小時)
  53.         SMGLD        EQU        028H          ;數(shù)碼管亮度
  54.         DSSJS        EQU        029H        ;定時時間,時
  55.         DSSJF        EQU        02AH          ;定時時間,分
  56.         DSSJM        EQU        02BH        ;定時時間,秒
  57.         ZQ        EQU        02CH        ;T0中斷使用,自然風(fēng)通斷電周期時長
  58.         SJ        EQU        02DH        ;T0中斷使用,自然風(fēng)時電機(jī)通電時長
  59.         SJJS        EQU        02EH          ;時間計數(shù),每10毫秒減1,為0后定時時間減1秒,重新把HMJS處定義的計數(shù)值放入這里
  60.         MJS        EQU        02FH        ;按鍵處理時用,秒計數(shù),每秒減1,直到為0
  61.         SSSC        EQU        030H        ;閃爍時長,每秒減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)行各項設(shè)置時用
  65.         SXSZ        EQU        034H        ;上限數(shù)值,進(jìn)行各項設(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        ;加減定時時間使用
  71.         DISPL        EQU        03AH         ;設(shè)置要顯示的目標(biāo):
  72.                                 ;0=顯示定時時間
  73.                                 ;1=顯示1——設(shè)置自然風(fēng)狀態(tài)時的通斷電周期時長
  74.                                 ;2=顯示2——設(shè)置自然風(fēng)時電機(jī)通電時長
  75.                                 ;3=顯示3——設(shè)置3小時以下定時調(diào)整時,編碼器每轉(zhuǎn)動一小格的增(減)值
  76.                                 ;4=顯示4——設(shè)置上電自動填入的定時時間
  77.                                 ;5=顯示5——設(shè)置數(shù)碼管亮度

  78. ;--------------- 看門狗、EEPROM特殊功能寄存器地址 ---------------
  79.         AUXR                EQU 08EH        ;輔助寄存器
  80.         WDT_CONTR        EQU 0E1H        ;看門狗地址
  81.         IAP_DATA         EQU 0E2H        ;數(shù)據(jù)寄存器,讀出、寫入的數(shù)據(jù)放在此處
  82.         IAP_ADDRH        EQU 0E3H        ;地址寄存器高八位
  83.         IAP_ADDRL        EQU 0E4H        ;地址寄存器低八位
  84.         IAP_CMD                EQU 0E5H        ;命令寄存器,0=關(guān)閉,1=讀,2=寫,3=擦除
  85.         IAP_TRIG        EQU 0E6H        ;命令觸發(fā)寄存器,每次操作先放入46H再放入B9,命令立即被觸發(fā)起動
  86.         IAP_CONTR        EQU 0E7H        ;控制寄存器,F(xiàn)lash操作允許/禁止及等待時間
  87.         ENABLE_IAP        EQU 083H ;定義Flash操作等待時間及允許IAP/ISP/EEPROM操作的常數(shù),時鐘<12MHz時為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ù)值,當(dāng)定時時間實際走時誤差較大時,可調(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ù)值,100表示100×10毫秒=1秒,后面的D表示是十進(jìn)制數(shù)

  104. ;--------------- 定時器0中斷(10毫秒產(chǎn)生一次中斷) ---------------
  105. T0INT:        PUSH        ACC
  106.         PUSH        PSW
  107.         LCALL        TIME                ;處理各項時間
  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)動,等待主程序處理
  117.         SETB        01H                ;是順時針正轉(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)動,等待主程序處理
  124.         CLR        01H                ;是逆時針反轉(zhuǎn),把位地址01H置為0
  125. INT1_1:        POP        PSW
  126.         RETI

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

  134. ;--------------- T0、INT0、INT1中斷設(shè)置 ----------------
  135. SETINT:        ANL        AUXR,#7FH        ;定時器時鐘12T模式
  136.         ANL        TMOD,#0F0H        ;設(shè)置定時器模式
  137.         MOV        TL0,#000H        ;設(shè)置定時初值,10毫秒產(chǎn)生一次中斷(晶振:11.0592MHz)
  138.         MOV        TH0,#0DCH        ;設(shè)置定時初值,10毫秒產(chǎn)生一次中斷(晶振:11.0592MHz)
  139.         CLR        TF0                ;清除TF0標(biāo)志
  140.         SETB        ET0                ;允許定時器0中斷
  141.         SETB        TR0                ;定時器0開始計時
  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. ;--------------- 啟動看門狗及喂狗,11.0592MHz預(yù)分頻數(shù)=4(142.2毫秒),00111001B(39H) ----------------
  149. WG:        MOV        WDT_CONTR,#00111001B
  150.         RET

  151. ;******************************************** 主程序開始 ********************************************
  152. START:        MOV        SP,#050H        ;設(shè)置堆棧指針
  153.         MOV        A,FWBZ1                ;
  154.         CJNE        A,#0C8H,START0        ;
  155.         MOV        A,FWBZ2                ;檢查復(fù)位判斷標(biāo)志,不相同說明是初次上電,從初始化開始運行
  156.         CJNE        A,#0D9H,START0        ;
  157.         LCALL        SETINT                ;中斷設(shè)置
  158.         CLR        RLED                ;RAM內(nèi)容沒變,說明是被干擾等原因復(fù)位,不是初次上電,點亮復(fù)位LED指示燈
  159.         MOV        A,DISPL                ;
  160.         CJNE        A,#5,SAT1        ;不管是什么原因復(fù)位,只要RAM不被改變就跳過初始化,繼續(xù)運行
  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開始清零30H個字節(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保存的各項設(shè)置,如果沒有就設(shè)為默認(rèn)值并保存
  180.         SETB        RLED                ;初始化,設(shè)RLED為高電平,復(fù)位LED指示燈不亮
  181. ;
  182. START2:        LCALL        WG                ;喂狗
  183.         MOV        DISPL,#0        ;設(shè)置要顯示的目標(biāo),0=顯示定時時間
  184.         CLR        06H                ;位地址06H置為0,顯示定時時間
  185.         CLR        07H                ;位地址07H置為0,顯示定時時間
  186.         JNB        00H,START3        ;如果位地址00H為0(編碼器沒有轉(zhuǎn)動)就轉(zhuǎn)移
  187.         SETB        EC11A                ;拉高編碼器A引腳電平
  188.         SETB        EC11B                ;拉高編碼器B引腳電平
  189.         JNB        EC11A,START3        ;如果仍為0(低電平)就轉(zhuǎn)移,說明還沒有旋轉(zhuǎn)到卡點位置
  190.         JNB        EC11B,START3        ;如果仍為0(低電平)就轉(zhuǎn)移,說明還沒有旋轉(zhuǎn)到卡點位置
  191.         LCALL        DSSJZJ                ;AB引腳都為高電平了,已經(jīng)旋轉(zhuǎn)到卡點位置,根據(jù)方向增減定時時間
  192.         CLR        00H                ;把位地址00H置為0,表示已經(jīng)響應(yīng)并處理編碼器旋轉(zhuǎn)動作
  193. START3:        LCALL        SKEY                ;掃描編碼器按鍵開關(guān)
  194.         JNC        START2                ;沒有按鍵動作(C=0)就轉(zhuǎn)移
  195.         LCALL        KEY                ;有按鍵動作,調(diào)用編碼器按鍵開關(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(定時時間置為零)就轉(zhuǎn)移
  200.         LCALL        DSSJQL                ;是按2次,定時時間清零
  201.         LJMP        START2
  202. START5:        CJNE        A,#3,START7        ;如果不是3(恢復(fù)默認(rèn)設(shè)置)就轉(zhuǎn)移
  203.         LCALL        SZMRZ                ;恢復(fù)各項默認(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                ;等待按鍵松開
  216.         LJMP        START2
  217. START7:        MOV        DISPL,#1        ;是4,進(jìn)入各項設(shè)置,1=顯示“1——設(shè)置自然風(fēng)狀態(tài)時通斷電周期時長”
  218.         LCALL        ZQSZ                ;周期時長設(shè)置
  219.         JNZ        START8                ;如果是按下編碼器按鍵開關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項設(shè)置
  220.         LJMP        START2                ;是15秒無操作自動保存返回,設(shè)置結(jié)束
  221. START8:        MOV        DISPL,#2        ;2=顯示“2——設(shè)置自然風(fēng)時電機(jī)通電時長”
  222.         LCALL        TDSC                ;通電時長設(shè)置
  223.         JNZ        START9                ;如果是按下編碼器按鍵開關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項設(shè)置
  224.         LJMP        START2                ;是15秒無操作自動保存返回,設(shè)置結(jié)束
  225. START9:        MOV        DISPL,#3        ;3=顯示“3——設(shè)置2小時以下定時調(diào)整時,編碼器每轉(zhuǎn)動一格的增(減)值”
  226.         LCALL        BMQZJZ                ;編碼器增減值設(shè)置
  227.         JNZ        STARTA                ;如果是按下編碼器按鍵開關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項設(shè)置
  228.         LJMP        START2                ;是15秒無操作自動保存返回,設(shè)置結(jié)束
  229. STARTA:        MOV        DISPL,#4        ;4=顯示“4——設(shè)置插電自動填入的定時時間”
  230.         LCALL        SDDSSJ                ;上電定時時間設(shè)置(小時)
  231.         JNZ        STARTB                ;如果是按下編碼器按鍵開關(guān)返回,就轉(zhuǎn)移,進(jìn)行下一項設(shè)置
  232.         LJMP        START2                ;是15秒無操作自動保存返回,設(shè)置結(jié)束
  233. STARTB:        MOV        DISPL,#5        ;5=顯示“5——設(shè)置數(shù)碼管亮度”
  234.         LCALL        LDSZ                ;亮度設(shè)置
  235.         LJMP        START2

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

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

  319. ;----------------------------------------------------------------------------------------
  320. ;設(shè)置自然風(fēng)時電機(jī)通電時長,最短為2秒;最長為上一項(自然風(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小時以下定時調(diào)整時,編碼器每轉(zhuǎn)動一小格的增(減)值,5、10、15、20、25、30分鐘
  329. ;----------------------------------------------------------------------------------------
  330. BMQZJZ:        MOV        XXSZ,#5                ;下限為5
  331.         MOV        SXSZ,#30        ;上限為30
  332.         MOV        R4,#5                ;調(diào)整時的加減步長值
  333.         LJMP        SZTZ

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

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

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

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

  430. ;------------------ 掃描按鍵開關(guān)600毫秒,有按鍵動作A=0,無按鍵動作A=1 ------------------
  431. KEYA:        PUSH        03H
  432.         MOV        03H,#60                ;等待600毫秒,10*60=600毫秒
  433. KEYB:        MOV        A,SJJS                ;裝入(10)毫秒計數(shù)
  434. KEYC:        CJNE        A,SJJS,KEYD        ;如果不相同就轉(zhuǎn)移,說明時間已經(jīng)過了10毫秒
  435.         LCALL        SKEY                ;掃描按鍵
  436.         JC        KEYE                ;如果有按鍵動作(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毫秒等待時間已到,A=1沒有按鍵動作
  441.         RET
  442. KEYE:        POP        03H
  443.         CLR        A                ;600毫秒內(nèi)有按鍵動作A=0
  444.         RET

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

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

  468. ;*************************** 以下為EEPROM操作子程序 **********************************
  469. ;STC89C51RC有4K字節(jié)的EEPROM,由8個扇區(qū)組成,每個扇區(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        ;打開IAP功能,設(shè)置Flash操作等待時間(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ā)起動
  478.         NOP
  479.         MOV        A,IAP_DATA                ;讀出的數(shù)據(jù)在IAP_DATA單元中,送入累加器A
  480.         RET
  481. ;-------------------------------------------
  482. ;字節(jié)編程,A=需寫入的數(shù)據(jù)
  483. Byte_Program:
  484.         MOV        IAP_CONTR,#ENABLE_IAP        ;打開IAP功能,設(shè)置Flash操作等待時間(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ā)起動
  489.         RET
  490. ;-------------------------------------------
  491. ;擦除扇區(qū)
  492. Sector_Erase:
  493.         MOV        IAP_CONTR,#ENABLE_IAP        ;打開IAP功能,設(shè)置Flash操作等待時間(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ā)起動
  497.         NOP
  498.         RET

  499. ;---------- 讀EEPROM保存的各項設(shè)置,如果沒有就設(shè)置為默認(rèn)值并保存 ------------
  500. REEP:        LCALL        RE00                ;讀EEPROM保存的各項設(shè)置
  501.         MOV        A,SDDS                ;裝入“上電就自動設(shè)定的定時時間(小時)”
  502.         JZ        REEP0                ;如果是0就轉(zhuǎn)移,退出
  503.         MOV        DSSJS,A                ;放入“定時時間(小時)”
  504.         MOV        DSSJM,#59        ;放入59到“定時時間(秒)”
  505. REEP0:        RET
  506. RE00:        MOV        IAP_ADDRH,#020H        ;從第一個扇區(qū)開始搜索,地址的高8位
  507. RE01:        MOV        IAP_ADDRL,#0        ;從第一個扇區(qū)開始搜索,地址的低8位
  508.         LCALL        Byte_Read        ;讀第一個字節(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        ;讀第二個字節(jié)
  512.         CJNE        A,FWBZ2,RE03        ;第二個字節(jié)是否相符
  513.         MOV        R1,#ZRFZQ        ;相符,從ZRFZQ開始放置讀出的設(shè)置值
  514.         MOV        R2,#5                ;總共5個字節(jié)
  515. RE02:        INC        IAP_ADDRL        ;EEPROM字節(jié)地址增1
  516.         LCALL        Byte_Read        ;讀一個字節(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        ;如果未搜索完最后一個扇區(qū)+2(2EH+2=30H)就轉(zhuǎn)移,繼續(xù)搜索
  525.         LCALL        SZMRZ                ;已經(jīng)搜索全部八個扇區(qū),未找到保存的內(nèi)容,設(shè)置為默認(rèn)值
  526.         MOV        R0,#8                ;總扇區(qū)數(shù)量,共8個扇區(qū)
  527.         LJMP        WSET3                ;跳轉(zhuǎn)到WSET3保存設(shè)置

  528. ;------------------ 保存設(shè)置,不固定保存到某個扇區(qū),各扇區(qū)輪流使用 ------------------
  529. WSET:        MOV        R0,#8                ;扇區(qū)總數(shù)量,共8個扇區(qū)
  530.         MOV        IAP_ADDRH,#020H        ;從第一個扇區(qū)開始搜索上次保存的設(shè)置
  531. WSET1:        MOV        IAP_ADDRL,#0        ;地址低位指向第一個字節(jié)
  532.         LCALL        Byte_Read        ;讀第一個字節(jié),返回:A=讀出的數(shù)據(jù)
  533.         CJNE        A,FWBZ1,WSET7        ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志1不相同就轉(zhuǎn)移
  534.         INC        IAP_ADDRL        ;第一個字節(jié)相同,EEPROM字節(jié)地址增1
  535.         LCALL        Byte_Read        ;讀第二個字節(jié)
  536.         CJNE        A,FWBZ2,WSET7        ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志2不相同就轉(zhuǎn)移
  537.         MOV        IAP_ADDRL,#0        ;是在當(dāng)前扇區(qū),地址指向扇區(qū)第一個字節(jié)
  538.         LCALL        Sector_Erase        ;擦除當(dāng)前扇區(qū),另換一個扇區(qū)保存
  539. WSET2:        MOV        A,IAP_ADDRH        ;裝入扇區(qū)地址高位到寄存器A
  540.         CJNE        A,#020H,WSET3        ;當(dāng)前扇區(qū)地址高位如果不是20H(第一個扇區(qū))就轉(zhuǎn)移
  541.         MOV        IAP_ADDRH,#30H        ;是20H,把IAP_ADDRH設(shè)置為最后一個扇區(qū)+2(2EH+2=30H)
  542. WSET3:        DEC        IAP_ADDRH        ;減1
  543.         DEC        IAP_ADDRH        ;再減1,指向上一個扇區(qū)首址
  544.         MOV        IAP_ADDRL,#0        ;低8位指向扇區(qū)第一個字節(jié)
  545.         LCALL        Sector_Erase        ;擦除整個扇區(qū)
  546.         MOV        R1,#FWBZ1        ;要保存的內(nèi)容始址
  547.         MOV        R2,#7                ;共7個字節(jié)
  548. WSET4:        MOV        A,@R1                ;裝入R1指向的RAM地址的內(nèi)容到A
  549.         LCALL        Byte_Program        ;字節(jié)編程(寫入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        ;讀出來檢查看是否寫入成功
  555.         CJNE        A,FWBZ1,WSET5        ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志1不相同就轉(zhuǎn)移
  556.         INC        IAP_ADDRL        ;EEPROM地址加1
  557.         LCALL        Byte_Read        ;讀第二個字節(jié)
  558.         CJNE        A,FWBZ2,WSET5        ;如果與EEPROM數(shù)據(jù)判斷標(biāo)志2不相同就轉(zhuǎn)移
  559.         RET                        ;成功了,退出
  560. WSET5:        DJNZ        R0,WSET2        ;如果未試完8個扇區(qū)就轉(zhuǎn)移到WSET2繼續(xù)往前一個扇區(qū)寫
  561.         SETB        07H                ;已經(jīng)試完8個扇區(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,指向下一個扇區(qū)首址
  575.         MOV        IAP_ADDRH,A        ;放回IAP_ADDRH
  576.         CJNE        A,#30H,WSET1        ;如果未到最后一個扇區(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ù)及倒計時處理
  581. ;------------------------------------------------------------------------------------------
  582. TIME:        MOV        A,SJJS                 ;裝入(10)毫秒時間計數(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ù)字及冒號閃爍時用,每0.5秒取反一次
  587. TIME1:        RET
  588. TIME2:        CPL        05H                ;是0,位地址第05位取反,數(shù)字及冒號閃爍時用,每0.5秒取反一次
  589.         MOV        DPTR,#HMJS        ;把定義的時間計數(shù)值地址裝入數(shù)據(jù)指針DPTR
  590.         MOVC        A,@A+DPTR        ;從程序存儲區(qū)裝入時間計數(shù)值到A寄存器
  591.         MOV        SJJS,A                ;時間計數(shù)值放入SJJS,重新計數(shù)
  592.         MOV        A,MJS                 ;裝入秒計數(shù)
  593.         JZ        TIME20                ;如果是0就轉(zhuǎn)移
  594.         DEC        MJS                ;不是0,減1秒
  595. TIME20:        MOV        A,SSSC                 ;裝入閃爍時長秒計數(shù)
  596.         JZ        TIME3                ;如果是0就轉(zhuǎn)移
  597.         DEC        SSSC                ;不是0,減1秒
  598. TIME3:        MOV        A,SJ                ;裝入自然風(fēng)時電機(jī)通電時長到寄存器A
  599.         JZ        TIME4                ;如果是0就轉(zhuǎn)移
  600.         DEC        SJ                ;不是0,減1秒
  601. TIME4:        MOV        A,ZQ                ;裝入自然風(fē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                ;裝入定時時間(秒)到寄存器A
  607.         JZ        TIME7                ;如果是0就轉(zhuǎn)移
  608.         CJNE        A,#59,TIME6        ;如果不是59秒就轉(zhuǎn)移
  609.         MOV        A,DSSJF                ;是59秒,檢查“時”
  610.         JNZ        TIME6                ;不是0就轉(zhuǎn)移
  611.         MOV        A,DSSJS                ;檢查“分”
  612.         JNZ        TIME6                ;不是0就轉(zhuǎn)移
  613.         MOV        DSSJM,A                ;“時、分”都是0,把“秒”也清零
  614.         RET
  615. TIME6:        DEC        DSSJM                ;不是0,減1秒
  616.         RET
  617. TIME7:        MOV        A,DSSJF                ;裝入定時時間(分)到寄存器A
  618.         JZ        TIME8                ;如果是0就轉(zhuǎn)移
  619.         DEC        DSSJF                ;不是0,減1分
  620.         MOV        DSSJM,#59        ;把59放入定時時間(秒)
  621.         RET
  622. TIME8:        MOV        A,DSSJS                ;裝入定時時間(時)到寄存器A
  623.         JZ        TIME9                ;如果是0就轉(zhuǎn)移,退出
  624.         DEC        DSSJS                ;不是0,小時減1
  625.         MOV        DSSJM,#59        ;把59放入定時時間(秒)
  626.         MOV        DSSJF,#59        ;把59放入定時時間(分)
  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),點亮LED指示燈
  634. CTL00:        MOV        A,DSSJM                ;裝入定時時間(秒)到寄存器A
  635.         JNZ        CTL02                ;如果不是0就轉(zhuǎn)移
  636.         MOV        A,DSSJF                ;裝入定時時間(分)到寄存器A
  637.         JNZ        CTL02                ;如果不是0就轉(zhuǎn)移
  638.         MOV        A,DSSJS                ;裝入定時時間(時)到寄存器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)時電機(jī)通電時長到寄存器A
  644.         JZ        CTL01                ;如果為0(通電倒計時結(jié)束)就轉(zhuǎn)移,斷電
  645. CTL03:        CLR        MOC                ;置MOC為低電平,通電
  646.         RET

  647. ;------------------------------------------------------------------------------------------
  648. ;子程序:T0中斷調(diào)用,顯示定時時間及各項設(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(顯示定時時間)就轉(zhuǎn)移
  654. DPYSZ:        PUSH        ACC
  655.         MOV        DPTR,#SEGTAB        ;查表獲取字形碼
  656.         MOVC        A,@A+DPTR        ;查表獲取字形碼
  657.         MOV        ZXM1,A                ;項目編號字形碼放到待發(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        ;各項設(shè)置值始址
  663.         ADD        A,R1                ;加上項目號
  664.         MOV        R1,A                ;得出設(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ù)
  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個字節(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個字節(jié)數(shù)據(jù)到TM1637顯示
  686. DISPL0:        MOV        A,DSSJS                ;顯示定時時間,裝入定時時間(時)
  687.         CJNE        A,XSHC1,DISPL3        ;定時時間(時)與顯示緩存1不相同就轉(zhuǎn)移,顯示
  688.         MOV        A,DSSJF
  689.         CJNE        A,XSHC2,DISPL3        ;定時時間(分)與顯示緩存2不相同就轉(zhuǎn)移,顯示
  690.         MOV        A,SJJS                 ;時、分都相同,裝入(10)毫秒時間計數(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)前時間放入顯示緩存1
  696.         MOV        XSHC2,DSSJF        ;當(dāng)前時間放入顯示緩存2
  697.         MOV        A,DSSJM                ;
  698.         JNZ        DISPL4                ;檢查當(dāng)前定時時間是否全部為0,不是就轉(zhuǎn)移
  699.         MOV        A,DSSJF                ;
  700.         JNZ        DISPL4                ;檢查當(dāng)前定時時間是否全部為0,不是就轉(zhuǎn)移
  701.         MOV        A,DSSJS                ;
  702.         JNZ        DISPL4                ;檢查當(dāng)前定時時間是否全部為0,不是就轉(zhuǎn)移
  703.         CLR        05H                ;定時時間為0,把位地址05H置為0,冒號不閃爍顯示
  704. DISPL4:        MOV        A,DSSJS                ;裝入“時”
  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)移,不顯示冒號
  713.         ORL        A,#10000000B        ;為0,把最高位置為1,顯示冒號(字形碼的最高位為1就顯示冒號)
  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個字節(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個字節(jié)數(shù)據(jù)到TM1637顯示,地址自動加1 ------------------
  728. disp:        LCALL        Srt
  729.         MOV          A,#040H                ;數(shù)據(jù)命令設(shè)置40H:地址自動加1,寫數(shù)據(jù)到顯示寄存器
  730.         LCALL        Writebyte        ;發(fā)送一個字節(jié)
  731.         LCALL        Stop
  732.         NOP
  733.         LCALL        Srt
  734.         MOV          A,#0C0H                ;地址命令設(shè)置C0H:初始地址為00H
  735.         LCALL        Writebyte        ;發(fā)送一個字節(jié)
  736.         PUSH        01H
  737.         PUSH        06H
  738.         MOV        06H,#4                ;發(fā)送4個字節(jié)數(shù)據(jù)
  739.         MOV          R1,#ZXM1        ;等待發(fā)送的字形碼始址
  740. disp1:        MOV          A,@R1                ;裝入要發(fā)送的字形碼
  741.         LCALL        Writebyte        ;發(fā)送一個字節(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后即為對應(yīng)的亮度控制命令88H~8FH
  750.         LCALL        Writebyte        ;按設(shè)置的亮度開顯示
  751.         LJMP         Stop

  752. ;------------------ 發(fā)送8bit(一個字節(jié))數(shù)據(jù)到TM1637,A=要發(fā)送的數(shù)據(jù),從低位開始 ------------------
  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)答信號計數(shù)值,防止萬一與TM1637通訊失敗而造成死循環(huán)
  773. WBY5:        DEC        00H                ;減1,正常情況下ACK應(yīng)答信號很快,第一次減1就會有應(yīng)答
  774.         MOV        A,00H                ;裝入計數(shù)值到A
  775.         JZ        WBY6                ;如果為0就轉(zhuǎn)移退出,說明與TM1637通訊失敗,或TM1637不存在
  776.         JB        DIO,WBY5        ;不為0,判斷TM1637發(fā)過來的ACK應(yīng)答信號,未應(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.png
以上資料51hei下載地址:
電風(fēng)扇長定時器.rar (95.52 KB, 下載次數(shù): 98)


評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:517951 發(fā)表于 2020-11-13 21:34 | 顯示全部樓層
完全匯編,牛!
回復(fù)

使用道具 舉報

ID:756506 發(fā)表于 2020-11-14 08:24 | 顯示全部樓層
樓主好牛,匯編玩的這么溜,膜拜!
回復(fù)

使用道具 舉報

ID:8222 發(fā)表于 2020-11-15 08:51 | 顯示全部樓層
這是個大牛。『軈柡Γ!
回復(fù)

使用道具 舉報

ID:8222 發(fā)表于 2021-1-6 13:30 | 顯示全部樓層
看匯編,就象看天書!!牛人才能玩這個!
回復(fù)

使用道具 舉報

ID:23844 發(fā)表于 2021-1-30 17:36 | 顯示全部樓層
匯編玩的溜,大俠級別,如果沒有寫注釋的話,比較難看懂。樓主威武
回復(fù)

使用道具 舉報

ID:87631 發(fā)表于 2021-2-2 16:37 | 顯示全部樓層
牛人啊,這只在學(xué)校玩過,現(xiàn)在不玩了
回復(fù)

使用道具 舉報

ID:430492 發(fā)表于 2022-4-7 13:05 | 顯示全部樓層
樓主好牛匯編玩的這么溜,膜拜中。。!
回復(fù)

使用道具 舉報

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

使用道具 舉報

ID:53978 發(fā)表于 2022-9-1 17:05 | 顯示全部樓層
可以用TM1650嗎?
回復(fù)

使用道具 舉報

ID:748535 發(fā)表于 2022-11-8 16:10 | 顯示全部樓層
不錯不錯  , 可以移植
回復(fù)

使用道具 舉報

ID:1088110 發(fā)表于 2023-7-11 16:52 | 顯示全部樓層
這匯編666
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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