|
本帖最后由 楊小強 于 2022-8-16 04:42 編輯
- ;------------------------------------------------------------------------------------
- ;子程序:編碼器按鍵開關(guān)處理,間隔時間不超過0.6秒的2次短按,為有效按鍵動作
- ;出口參數(shù):A=1(按了1次);A=2(按了2次);A=3(長按達到了10秒)
- ;------------------------------------------------------------------------------------
- KEY:
- MOV MJS,#10 ;放入等待時間(秒)
- MOV FENGMQ,#12 ;蜂鳴器響一聲,12*10毫秒=120毫秒
- KEY1:
- MOV A,MJS ;裝入等待時間
- JNZ KEY2 ;如果不為0就轉(zhuǎn)移,時間未到
- MOV A,#3 ;時間到了
- RET
- KEY2:
- LCALL SKEY ;掃描按鍵
- JC KEY1 ;如果C=1(按鍵還沒松開),就繼續(xù)掃描
- LCALL KEYA ;掃描按鍵600毫秒
- JZ KEY3 ;如果600毫秒內(nèi)有按鍵動作就轉(zhuǎn)移
- MOV A,#1 ;600毫秒內(nèi)沒有按鍵動作,置A=1(按了1次)
- RET
- KEY3:
- MOV FENGMQ,#12 ;蜂鳴器響一聲,12*10毫秒=120毫秒
- LCALL KEYEX ;等待第二次按鍵松開
- MOV A,#2 ;置A=2(按了2次)
- RET
- ;----------- 掃描按鍵600毫秒,有按鍵動作A=0,無按鍵動作A=1 -----------
- KEYA:
- MOV SHMJS,#60 ;等待600毫秒
- KEYB:
- MOV A,SHMJS ;裝入(10)毫秒計數(shù)
- JZ KEYC ;為0(時間到)就轉(zhuǎn)移
- LCALL SKEY ;掃描按鍵
- JNC KEYB ;沒有按鍵動作(C=0)就轉(zhuǎn)移
- CLR A ;有按鍵動作A=0
- RET
- KEYC:
- MOV A,#1 ;等待時間已到,A=1沒有按鍵動作
- RET
- ;-------------- 按鍵開關(guān)掃描,未按C=0,已按下C=1 --------------
- SKEY:
- SETB EC11K ;按鍵端口置為高電平
- JNB EC11K,SKEY1 ;為0(低電平)就轉(zhuǎn)移
- CLR C ;C置為0,沒有按鍵動作
- RET
- SKEY1:
- LCALL DELAY20 ;延時20毫秒
- SETB EC11K ;延時結(jié)束后再次把按鍵端口置為高電平
- JNB EC11K,SKEY2 ;為0(低電平)就轉(zhuǎn)移
- CLR C ;C置為0,沒有按鍵動作
- RET ;按鍵未被有效按下,退出
- SKEY2:
- SETB C ;C置為1,按鍵已有效按下
- LCALL SETPWM ;有按鍵動作就重新放置“延時PWM驅(qū)動”時間
- RET
- ;------------------ 等待按鍵釋放 ------------------
- KEYEX:
- LCALL SKEY ;掃描按鍵
- JC KEYEX ;如果C=1(按鍵還沒釋放)就繼續(xù)掃描
- RET
- ;------------------ 延時20毫秒 ------------------
- DELAY20: ;@11.0592MHz
- PUSH 15H
- PUSH 16H
- PUSH 17H
- MOV 15H,#2
- MOV 16H,#32
- MOV 17H,#58
- NEXT20:
- DJNZ 17H,NEXT20
- DJNZ 16H,NEXT20
- DJNZ 15H,NEXT20
- POP 17H
- POP 16H
- POP 15H
- RET
- ;---------------------------------------------------------------------------------------------
- ;子程序:編碼器旋轉(zhuǎn)動作處理,根據(jù)旋轉(zhuǎn)方向增(減)定時時間、檔位
- ;10小時以下每次增(減)30分鐘;10小時及以上每次增(減)1個小時;20小時以上每次增(減)2個小時
- ;---------------------------------------------------------------------------------------------
- BMQCL:
- LCALL Scan2 ;掃描編碼器(無方向標志)
- MOV DSDW,DSDWJG ;置交替顯示間隔時間
- JB BMQDZ,BMQCL ;“編碼器動作”為1(動作未結(jié)束)就轉(zhuǎn)移繼續(xù)等待
- BMQCL0:
- JNB XSNRXZ,BMQCL5 ;“顯示內(nèi)容選擇”為0(顯示定時時間)就轉(zhuǎn)移
- SETB YSBC ;“延時保存”置為1
- MOV MJS,#10 ;“延時保存”時長(秒)。延時結(jié)束后才保存,避免頻繁的EEPROM操作
- MOV A,DANG ;裝入當(dāng)前檔位值
- JB XZFX,BMQCL2 ;“旋轉(zhuǎn)方向”為1(順時針正轉(zhuǎn))就轉(zhuǎn)移
- DEC A ;是反轉(zhuǎn),減1檔
- JNZ BMQCL1 ;減1后不為0就轉(zhuǎn)移
- RET
- BMQCL1:
- MOV DANG,A
- RET
- BMQCL2:
- CJNE A,#15,BMQCL3 ;是否已到最高15檔
- BMQCL3:
- JC BMQCL4 ;小于就轉(zhuǎn)移
- MOV DANG,#15 ;等于或大于,放入最高檔位15
- RET
- BMQCL4:
- INC DANG ;還未到上限,增1檔
- RET
- BMQCL5:
- CLR SSBZ ;“閃爍標志”置為0(數(shù)字及冒號狀態(tài)為“顯示”)
- MOV A,DSSJS ;裝入定時時間(時)
- CJNE A,#20,BMQCL6 ;當(dāng)前“時”是否等于或大于20
- BMQCL6:
- JC BMQCL7 ;小于就轉(zhuǎn)移
- MOV R5,#2 ;等于或大于20,加減2個小時
- LJMP BMQCL9
- BMQCL7:
- CJNE A,#10,BMQCL8 ;當(dāng)前“時”是否等于或大于10
- BMQCL8:
- JC BMQCL13 ;小于就轉(zhuǎn)移
- MOV R5,#1 ;等于或大于10,加減1個小時
- BMQCL9:
- JNB XZFX,BMQCL11 ;“旋轉(zhuǎn)方向”為0(逆時針反轉(zhuǎn))就轉(zhuǎn)移
- ADD A,R5 ;是正轉(zhuǎn),加
- CJNE A,#100,BMQCL10 ;加完后是否等于或大于100
- BMQCL10:
- JC BMQCL12 ;如果小于就轉(zhuǎn)移,把A放回到DSSJS
- MOV DSSJS,#99 ;已經(jīng)大于99了,直接設(shè)置為99:59:59+HMJS(1秒),100小時
- MOV DSSJF,#59 ;已經(jīng)大于99了,直接設(shè)置為99:59:59+HMJS(1秒),100小時
- MOV DSSJM,#59 ;已經(jīng)大于99了,直接設(shè)置為99:59:59+HMJS(1秒),100小時
- RET
- BMQCL11:
- SUBB A,R5 ;是反轉(zhuǎn),減
- BMQCL12:
- MOV DSSJS,A ;把計算結(jié)果放入DSSJS
- RET
- BMQCL13:
- MOV A,DSSJF ;小于10小時,裝入定時時間(分)
- JNB XZFX,BMQCL16 ;“旋轉(zhuǎn)方向”為0(逆時針反轉(zhuǎn))就轉(zhuǎn)移
- ADD A,#30 ;是正轉(zhuǎn),當(dāng)前“分”加30
- CJNE A,#60,BMQCL14 ;加完后“分”是否等于或大于60
- BMQCL14:
- JC BMQCL15 ;小于60就轉(zhuǎn)移,把A放入定時時間(分)
- SUBB A,#60 ;等于或大于60,就減60,然后小時加1
- INC DSSJS ;小時加1
- BMQCL15:
- MOV DSSJF,A ;把A放入定時時間(分)
- RET
- BMQCL16:
- CJNE A,#30,BMQCL17 ;是逆時針反轉(zhuǎn),當(dāng)前“分”是否等于或大于30
- BMQCL17:
- JC BMQCL18 ;小于就轉(zhuǎn)移
- SUBB A,#30 ;定時時間(分)減30
- MOV DSSJF,A ;把計算結(jié)果放入定時時間(分)
- RET
- BMQCL18:
- MOV A,#30 ;“分”小于30,把30放入寄存器A
- CLR C ;進位標志清0
- SUBB A,DSSJF ;減“定時時間(分)”
- MOV DSSJF,A ;減完后的結(jié)果暫時放入DSSJF
- MOV A,#60
- SUBB A,DSSJF ;60減上面的計算結(jié)果,得出定時時間(分),然后小時減1
- MOV DSSJF,A ;得出的數(shù)放入定時時間(分)
- MOV A,DSSJS ;裝入定時時間(時)
- JZ DSSJQL ;如果“時”為0就轉(zhuǎn)移(不夠減了,把定時時間清零)
- DEC DSSJS ;“時”不為0,減1
- RET
- DSSJQL:
- MOV DSSJS,#0 ;定時時間清零
- MOV DSSJF,#0 ;定時時間清零
- MOV DSSJM,#0 ;定時時間清零
- RET
- ;----------------------------------------------------------------------------------------------
- ;子程序:掃描編碼器是否有旋轉(zhuǎn)動作并設(shè)置好方向標志
- ;出口參數(shù):“編碼器動作”=1已經(jīng)轉(zhuǎn)動,=0沒有轉(zhuǎn)動;“旋轉(zhuǎn)方向”=1順時針正轉(zhuǎn),=0逆時針反轉(zhuǎn)
- ;----------------------------------------------------------------------------------------------
- Scan1:
- SETB EC11A ;拉高編碼器A引腳電平
- SETB EC11B ;拉高編碼器B引腳電平
- JNB EC11A,Scan11 ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動作,順時針正轉(zhuǎn)
- JNB EC11B,Scan12 ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動作,逆時針反轉(zhuǎn)
- CLR BMQDZ ;沒有旋轉(zhuǎn)動作,把“編碼器動作”置為0
- RET
- Scan11:
- SETB XZFX ;順時針正轉(zhuǎn),把“旋轉(zhuǎn)方向”置為1
- SETB BMQDZ ;有旋轉(zhuǎn)動作,把“編碼器動作”置為1
- LCALL SETPWM ;有動作就重新放置“延時PWM驅(qū)動”時間
- RET
- Scan12:
- CLR XZFX ;逆時針反轉(zhuǎn),把“旋轉(zhuǎn)方向”置為0
- SETB BMQDZ ;有旋轉(zhuǎn)動作,把“編碼器動作”置為1
- LCALL SETPWM ;有動作就重新放置“延時PWM驅(qū)動”時間
- RET
- ;-------------------------------------------------------------
- ;子程序:掃描編碼器是否有旋轉(zhuǎn)動作,不設(shè)置方向標志
- ;出口參數(shù):“編碼器動作”BMQDZ=1已經(jīng)轉(zhuǎn)動,=0沒有轉(zhuǎn)動
- ;-------------------------------------------------------------
- Scan2:
- SETB EC11A ;拉高編碼器A引腳電平
- SETB EC11B ;拉高編碼器B引腳電平
- JNB EC11A,Scan21 ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動作
- JNB EC11B,Scan21 ;如果為0(低電平)就轉(zhuǎn)移,編碼器有旋轉(zhuǎn)動作
- CLR BMQDZ ;沒有旋轉(zhuǎn)動作,把“編碼器動作”置為0
- RET
- Scan21:
- SETB BMQDZ ;有旋轉(zhuǎn)動作,把“編碼器動作”置為1
- LCALL SETPWM ;有動作就重新放置“延時PWM驅(qū)動”時間
- RET
- ;--------------------------------------------------------------
- ;子程序:繼電器控制,T0中斷、EEPROM操作子程序調(diào)用
- ;--------------------------------------------------------------
- Control:
- JNB EEPBC,CTL00 ;EEPBC標志為0就轉(zhuǎn)移。為1表示EEPROM操作子程序正在調(diào)用下面的繼電器控制程序
- RET
- CTL00:
- MOV A,DSSJM ;裝入定時時間(秒)到寄存器A
- JNZ CTL02 ;不是0就轉(zhuǎn)移
- MOV A,DSSJF ;裝入定時時間(分)到寄存器A
- JNZ CTL02 ;不是0就轉(zhuǎn)移
- MOV A,DSSJS ;裝入定時時間(時)到寄存器A
- JNZ CTL02 ;不是0就轉(zhuǎn)移
- CTL01:
- MOV P3,#0FFH ;置P3端口為高電平,斷電
- RET
- CTL02:
- JNB PWM,CTL03 ;PWM標志為0就轉(zhuǎn)移。0=禁止PWM驅(qū)動,1=使用PWM方式驅(qū)動
- MOV A,YSPWM ;裝入“延時PWM驅(qū)動”,為0時使用PWM驅(qū)動方式
- JNZ CTL03 ;不是0就轉(zhuǎn)移
- JB PWMBZ,CTL01 ;“PWM電平狀態(tài)標志”為1(高電平)就轉(zhuǎn)移。PWM周期25微秒*2=50微秒,20KHz占空比50%
- CTL03:
- JB FLQH,CTL05 ;“風(fēng)類切換”為1自然風(fēng)(睡眠風(fēng))就轉(zhuǎn)移
- MOV A,DANG ;裝入檔位值
- CTL04:
- PUSH DPL
- PUSH DPH
- MOV DPTR,#DAB1 ;檔位控制碼地址
- DEC A ;檔位值減1后為正確地址
- MOVC A,@A+DPTR ;裝入檔位控制碼
- MOV P3,A ;置P3口控制繼電器
- POP DPH
- POP DPL
- RET
- CTL05:
- MOV A,SMFJG2 ;裝入自然風(fēng)(睡眠風(fēng))檔位變化時的間隔時間(秒)
- JZ CTL06 ;是0就轉(zhuǎn)移
- MOV A,DANGW ;裝入自然風(fēng)當(dāng)前檔位
- LJMP CTL04
- CTL06:
- MOV SMFJG2,SMFJG ;重新放入設(shè)置的檔位變化間隔時間
- LCALL SETPWM ;設(shè)置“延時PWM驅(qū)動”時間
- MOV A,DANGW ;裝入當(dāng)前檔位值
- JNB TSFX,CTL09 ;如果“調(diào)速方向”為0(漸慢降檔)就轉(zhuǎn)移
- CJNE A,DANG_G,CTL07 ;當(dāng)前檔位值是否等于或大于設(shè)置的最高上限
- CTL07:
- JC CTL08 ;小于就轉(zhuǎn)移
- MOV A,DANG_G ;等于或大于,裝入最高上限
- CLR TSFX ;“調(diào)速方向”改為0(漸慢降檔)
- LJMP CTL09
- CTL08:
- INC A ;增1檔
- MOV DANGW,A
- LJMP CTL04
- CTL09:
- CJNE A,DANG_D,CTL10 ;當(dāng)前檔位值不是設(shè)置的最低下限就轉(zhuǎn)移
- SETB TSFX ;是,“調(diào)速方向”改為1(漸快增檔)
- LJMP CTL04
- CTL10:
- JC CTL13 ;小于就轉(zhuǎn)移
- CJNE A,DANG_G,CTL11 ;是否大于設(shè)置的最高上限
- CTL11:
- JC CTL12 ;小于就轉(zhuǎn)移
- MOV A,DANG_G ;等于或大于,裝入最高上限
- CTL12:
- DEC A ;減1檔
- MOV DANGW,A
- LJMP CTL04
- CTL13:
- MOV A,DANG_D ;小于最低下限,裝入最低下限
- MOV DANGW,A
- LJMP CTL04
- ;--------------------------------------------------------------
- ;子程序:T1中斷調(diào)用,時間計數(shù)及倒計時處理。10毫秒執(zhí)行一次
- ;--------------------------------------------------------------
- TIME:
- MOV A,YSPWM ;延時PWM驅(qū)動
- JZ TIME0
- DEC YSPWM ;每10毫秒減1,直到為0
- TIME0:
- MOV A,FENGMQ ;蜂鳴器鳴響時長
- JZ TIME1
- DEC FENGMQ ;每10毫秒減1,直到為0
- TIME1:
- MOV A,SHMJS ;裝入(10)毫秒計數(shù)
- JZ TIME2 ;如果是0就轉(zhuǎn)移
- DEC SHMJS ;每10毫秒減1,直到為0
- TIME2:
- MOV A,HWJS ;每10毫秒減1,為0時清除“接收到的紅外遙控數(shù)據(jù)碼”
- JZ TIME3 ;是0就轉(zhuǎn)移
- DEC HWJS ;減1
- LJMP TIME4
- TIME3:
- MOV MA1,FWBZ1 ;用“復(fù)位及EEPROM判斷標志”填充“接收到的紅外遙控數(shù)據(jù)碼”
- MOV MA2,FWBZ2 ;用“復(fù)位及EEPROM判斷標志”填充“接收到的紅外遙控數(shù)據(jù)碼”
- TIME4:
- MOV A,HMJS ;裝入(10)毫秒計數(shù)2
- JZ TIME6 ;如果是0就轉(zhuǎn)移
- DEC HMJS ;不是0,減1
- CJNE A,#50,TIME5 ;如果不是50就轉(zhuǎn)移退出
- SETB SSBZ ;“閃爍標志”置為1,數(shù)字及冒號閃爍時用,每0.5秒變化一次
- TIME5:
- RET
- TIME6:
- CLR SSBZ ;“閃爍標志”置為0,數(shù)字及冒號閃爍時用,每0.5秒變化一次
- MOV HMJS,#99 ;重新放入計數(shù)值(1秒)
- MOV A,SMFJG2 ;裝入運行時使用的“睡眠風(fēng)(自然風(fēng))檔位變化時的間隔時間(秒)”
- JZ TIME7 ;如果是0就轉(zhuǎn)移
- DEC SMFJG2 ;每秒減1,直到為0
- TIME7:
- MOV A,MJS ;秒計數(shù)
- JZ TIME8 ;如果是0就轉(zhuǎn)移
- DEC MJS ;每秒減1,直到為0
- TIME8:
- MOV A,FWBZ0 ;裝入復(fù)位提示(閃爍顯示)秒計數(shù)
- JZ TIME9 ;如果是0就轉(zhuǎn)移
- DEC FWBZ0 ;每秒減1,直到為0
- TIME9:
- MOV A,DSDW ;裝入定時與檔位交替顯示的間隔時間(秒)
- JNZ TIME10 ;如果不是0就轉(zhuǎn)移
- MOV DSDW,DSDWJG ;重新放入設(shè)置值
- CPL XSNRXZ ;“顯示內(nèi)容選擇”取反,交替顯示
- TIME10:
- DEC DSDW ;每秒減1,直到為0
- MOV A,DSSJM ;裝入定時時間(秒)到寄存器A
- JZ TIME11 ;如果是0就轉(zhuǎn)移
- DEC DSSJM ;減1秒
- RET
- TIME11:
- MOV A,DSSJF ;裝入定時時間(分)到寄存器A
- JZ TIME12 ;如果是0就轉(zhuǎn)移
- DEC DSSJF ;不是0,減1分
- MOV DSSJM,#59 ;把59放入定時時間(秒)
- RET
- TIME12:
- MOV A,DSSJS ;裝入定時時間(時)到寄存器A
- JNZ TIME13 ;不是0就轉(zhuǎn)移
- CLR XSNRXZ ;定時結(jié)束,“顯示內(nèi)容選擇”置為0,不顯示檔位
- RET
- TIME13:
- DEC DSSJS ;不是0,小時減1
- MOV DSSJM,#59 ;把59放入定時時間(秒)
- MOV DSSJF,#59 ;把59放入定時時間(分)
- RET
- ;---------------------------------------------------------------------------
- ;子程序:T1中斷調(diào)用,顯示定時時間及檔位、紅外遙控解碼等。10毫秒執(zhí)行一次
- ;---------------------------------------------------------------------------
- DISPLAY:
- JB XSKG,DPYSZ1 ;如果“顯示開關(guān)”為1(禁止T1顯示功能)就轉(zhuǎn)移,退出
- JNB XSQHY,DPYSZ0 ;如果“顯示切換1”為0(顯示定時或檔位)就轉(zhuǎn)移
- LJMP DSZ
- DPYSZ0:
- JB FLQH,DISPL0 ;如果“風(fēng)類切換”為1睡眠風(fēng)(自然風(fēng))就轉(zhuǎn)移,顯示定時時間
- JNB XSNRXZ,DISPL0 ;如果“顯示內(nèi)容選擇”為0(顯示定時時間)就轉(zhuǎn)移
- MOV A,DANG ;顯示檔位,裝入檔位值
- CJNE A,XSHC1,DPYSZ3 ;當(dāng)前檔位值與緩存1不相同就轉(zhuǎn)移,立即顯示
- MOV A,HMJS ;相同,裝入(10)毫秒計數(shù)2
- CJNE A,#99,DPYSZ2 ;不是99就轉(zhuǎn)移,每0.5秒顯示一次
- LJMP DPYSZ3 ;是,顯示
- DPYSZ1: RET
- DPYSZ2:
- CJNE A,#49,DPYSZ1 ;不是49就轉(zhuǎn)移退出,每0.5秒顯示一次
- DPYSZ3:
- MOV XSHC1,DANG ;當(dāng)前檔位值放入緩存1
- MOV ZXM1,#0 ;放入消隱碼到待發(fā)送TM1637區(qū)1
- MOV ZXM4,#0 ;放入消隱碼到待發(fā)送TM1637區(qū)4
- MOV R0,#ZXM2 ;裝入待發(fā)送TM1637區(qū)2地址
- MOV A,DANG ;裝入檔位值
- LCALL BCD ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)2和3
- LCALL disp ;發(fā)送4個字節(jié)數(shù)據(jù)到TM1637顯示
- RET
- ;--------------------------------
- DISPL0:
- CLR XSNRXZ ;“顯示內(nèi)容選擇”置為0,顯示定時時間
- MOV R1,#DSSJS ;把定時時間“時”的地址放入R1
- MOV A,@R1 ;裝入“時”
- JZ DISPL1 ;如果“時”為0就轉(zhuǎn)移
- LJMP DISPL3
- DISPL1:
- CLR SSBZ ;“時”為0,把“閃爍標志”置為0,始終顯示冒號
- INC R1 ;地址加1,指向“分”
- MOV A,@R1 ;裝入“分”
- DISPL3:
- CJNE A,XSHC1,DISPL6 ;寄存器A的數(shù)據(jù)與顯示緩存1不相同就轉(zhuǎn)移,立即顯示
- INC R1 ;地址加1
- MOV A,@R1 ;裝入下一個時間數(shù)值
- DEC R1 ;地址減1
- CJNE A,XSHC2,DISPL6 ;寄存器A的數(shù)據(jù)與顯示緩存2不相同就轉(zhuǎn)移,立即顯示
- MOV A,HMJS ;都相同,裝入(10)毫秒時間計數(shù)2
- CJNE A,#99,DISPL5 ;不是99就轉(zhuǎn)移
- LJMP DISPL6 ;是,顯示(每0.5秒顯示一次)
- DISPL4: RET
- DISPL5:
- CJNE A,#49,DISPL4 ;不是49就轉(zhuǎn)移退出,每0.5秒顯示一次
- DISPL6:
- INC R1 ;地址加1
- MOV A,@R1 ;裝入后面一位時間數(shù)值
- MOV XSHC2,A ;放入緩存2
- DEC R1 ;地址減1
- MOV A,@R1 ;裝入前面一位時間數(shù)值
- MOV XSHC1,A ;放入緩存1
- MOV R0,#ZXM1 ;待發(fā)送TM1637區(qū)1地址
- LCALL BCD ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)1、2
- INC R1 ;地址加1
- MOV R0,#ZXM3 ;待發(fā)送TM1637區(qū)3地址
- MOV A,@R1 ;裝入后面一位時間數(shù)值
- LCALL BCD ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)3、4
- JB SSBZ,DISPL8 ;如果“閃爍標志”為1就轉(zhuǎn)移,不顯示冒號
- DISPL7:
- ORL ZXM2,#10000000B ;把最高位置為1(最高位為1就顯示冒號)
- DISPL8:
- LCALL disp ;發(fā)送4個字節(jié)數(shù)據(jù)到TM1637顯示
- RET
- ;--------------------------------
- DSZ:
- JNB XSQHE,DHW ;如果“顯示切換2”為0(顯示紅外遙控信號解碼)就轉(zhuǎn)移
- MOV A,ZRFJG ;裝入當(dāng)前要顯示的項目號,1:檔位下限;2=檔位上限;3=檔位變化的間隔時間(秒)
- DEC A ;減1
- JNZ DSZ1 ;不為0就轉(zhuǎn)移
- MOV A,DANG_D ;是1,顯示檔位下限
- MOV ZXM1,#038H ;放入“L”到待發(fā)送TM1637區(qū)1
- LJMP DSZ3
- DSZ1:
- DEC A ;減1
- JNZ DSZ2 ;不為0就轉(zhuǎn)移
- MOV A,DANG_G ;是2,顯示檔位上限
- MOV ZXM1,#076H ;放入“H”到待發(fā)送TM1637區(qū)1
- LJMP DSZ3
- DSZ2:
- MOV A,SMFJG ;是3,顯示檔位變化的間隔時間(秒)
- MOV ZXM1,#079H ;放入“E”到待發(fā)送TM1637區(qū)1
- DSZ3:
- MOV ZXM2,#040H ;放入“-”到待發(fā)送TM1637區(qū)2
- MOV R0,#ZXM3 ;待發(fā)送TM1637區(qū)3地址
- LCALL BCD ;轉(zhuǎn)換并獲取字形碼放到待發(fā)送TM1637區(qū)2和3
- LCALL disp ;顯示
- RET
- ;---------------------------------
- DHW:
- JB BMXSQH,DHW4 ;如果“編碼顯示切換”為1(顯示數(shù)據(jù)碼+反碼)就轉(zhuǎn)移
- MOV A,XMBH ;裝入功能編號
- CJNE A,XSHC1,DHW3 ;與顯示緩存1不相同就轉(zhuǎn)移,立即顯示
- MOV A,HMJS ;相同,裝入(10)毫秒計數(shù)
- CJNE A,#99,DHW2 ;不是99就轉(zhuǎn)移,每0.5秒顯示一次
- LJMP DHW3 ;是,顯示
- DHW1: RET
- DHW2:
- CJNE A,#49,DHW1 ;不是49就轉(zhuǎn)移退出,每0.5秒顯示一次
- DHW3:
- MOV XSHC1,XMBH ;功能編號放入緩存1
- MOV R0,#ZXM1 ;顯示功能編號+系統(tǒng)碼,待發(fā)送TM1637區(qū)1
- MOV A,XMBH ;裝入功能編號
- LCALL BCD1 ;獲取字形碼放到待發(fā)送TM1637區(qū)
- MOV ZXM2,#040H ;放入“-”到待發(fā)送TM1637區(qū)2
- MOV A,ANJZ ;裝入系統(tǒng)碼
- MOV R0,#ZXM3 ;待發(fā)送TM1637區(qū)3
- LCALL HEX ;顯示十六進制系統(tǒng)碼
- LCALL disp ;顯示十六進制系統(tǒng)碼
- RET
- DHW4:
- MOV A,XMBH ;裝入功能編號
- MOV B,#2 ;功能編號乘2
- MUL AB ;功能編號乘2
- DEC A ;計算結(jié)果減1
- ADD A,#ANJZ ;加遙控按鍵值首地址,得出數(shù)據(jù)碼的實際地址
- MOV R1,A ;地址放入R1
- MOV A,@R1 ;裝入數(shù)據(jù)碼
- CJNE A,XSHC1,DHW7 ;與顯示緩存1不相同就轉(zhuǎn)移,立即顯示
- INC R1 ;地址加1
- MOV A,@R1 ;裝入裝入數(shù)據(jù)碼反碼
- DEC R1 ;地址減1
- CJNE A,XSHC2,DHW7 ;與顯示緩存2不相同就轉(zhuǎn)移,立即顯示
- MOV A,HMJS ;都相同,裝入(10)毫秒時間計數(shù)
- CJNE A,#99,DHW6 ;不是99就轉(zhuǎn)移
- LJMP DHW7 ;是,顯示(每0.5秒顯示一次)
- DHW5: RET
- DHW6:
- CJNE A,#49,DHW5 ;不是49就轉(zhuǎn)移退出,每0.5秒顯示一次
- DHW7:
- INC R1 ;地址加1
- MOV A,@R1 ;裝入數(shù)據(jù)碼反碼
- MOV XSHC2,A ;放入緩存2
- DEC R1 ;地址減1
- MOV A,@R1 ;裝入數(shù)據(jù)碼碼
- MOV XSHC1,A ;放入緩存1
- MOV R0,#ZXM1 ;待發(fā)送TM1637區(qū)1
- LCALL HEX ;查表獲取字形碼
- MOV A,@R1 ;裝入數(shù)據(jù)碼反碼
- LCALL HEX ;查表獲取字形碼
- LCALL disp ;顯示
- RET
- ;---------------------------------
- HEX:
- PUSH ACC
- SWAP A ;高低半字節(jié)交換
- ANL A,#0FH ;邏輯與運算
- LCALL BCD1 ;查表獲取字形碼放到待發(fā)送TM1637區(qū)
- INC R0 ;地址加1
- POP ACC
- ANL A,#0FH ;邏輯與運算
- LCALL BCD1 ;查表獲取字形碼放到待發(fā)送TM1637區(qū)
- INC R0 ;地址加1
- INC R1 ;地址加1
- RET
- ;---------------------------------
- BCD:
- MOV B,#10 ;轉(zhuǎn)換為BCD碼
- DIV AB ;轉(zhuǎn)換為BCD碼
- PUSH DPL
- PUSH DPH
- MOV DPTR,#SEGTAB ;查表獲取字形碼
- MOVC A,@A+DPTR ;查表獲取字形碼
- POP DPH
- POP DPL
- MOV @R0,A ;字形碼放入待發(fā)送TM1637區(qū)
- INC R0 ;地址加1
- XCH A,B ;A、B寄存器內(nèi)容交換
- BCD1:
- PUSH DPL
- PUSH DPH
- MOV DPTR,#SEGTAB ;查表獲取字形碼
- MOVC A,@A+DPTR ;查表獲取字形碼
- POP DPH
- POP DPL
- MOV @R0,A ;字形碼放入待發(fā)送TM1637區(qū)
- RET
- ;************** 關(guān)閉T1中斷的顯示功能,顯示“----”**************
- HENGX:
- SETB XSKG ;“顯示開關(guān)”置為1,關(guān)閉T1中斷的顯示功能
- MOV ZXM1,#40H ;顯示“----”
- MOV ZXM2,#40H
- MOV ZXM3,#40H ;顯示“----”
- MOV ZXM4,#40H
- LJMP disp0
- ;---------- 發(fā)送4個字節(jié)數(shù)據(jù)到TM1637顯示,地址自動加1 ----------
- disp:
- MOV A,FWBZ0 ;裝入復(fù)位提示(閃爍顯示)秒計數(shù)
- JZ disp0 ;如果是0(未發(fā)生復(fù)位)就轉(zhuǎn)移
- JNB SSBZ,disp0 ;已經(jīng)發(fā)生復(fù)位,“閃爍標志”為0(閃爍顯示中的“顯示”狀態(tài))就轉(zhuǎn)移
- CLR A ;處于閃爍顯示中的“不顯示”狀態(tài),放入消隱碼(0)
- MOV ZXM1,A ;放入消隱碼
- MOV ZXM2,A ;放入消隱碼
- MOV ZXM3,A ;放入消隱碼
- MOV ZXM4,A ;放入消隱碼
- disp0:
- LCALL Srt
- MOV A,#040H ;數(shù)據(jù)命令設(shè)置40H:地址自動加1,寫數(shù)據(jù)到顯示寄存器
- LCALL Writebyte ;發(fā)送一個字節(jié)
- LCALL Stop
- NOP
- LCALL Srt
- MOV A,#0C0H ;地址命令設(shè)置C0H:初始地址為00H
- LCALL Writebyte ;發(fā)送一個字節(jié)
- MOV R6,#4 ;發(fā)送4個字節(jié)數(shù)據(jù)
- MOV R1,#ZXM1 ;等待發(fā)送的字形碼始址
- disp1:
- MOV A,@R1 ;裝入要發(fā)送的字形碼
- LCALL Writebyte ;發(fā)送一個字節(jié)
- INC R1 ;地址加1
- DJNZ R6,disp1 ;如果還未發(fā)送完就繼續(xù)
- LCALL Stop
- LCALL Srt
- MOV A,SMGLD ;裝入設(shè)置的數(shù)碼管亮度(1~8)
- ADD A,#087H ;加上87H后即為對應(yīng)的亮度控制命令88H~8FH
- LCALL Writebyte ;按設(shè)置的亮度開顯示
- LCALL Stop
- RET
- ;----- 發(fā)送8bit(一個字節(jié))數(shù)據(jù)到TM1637,A=要發(fā)送的數(shù)據(jù),從低位開始 -----
- Writebyte:
- MOV R7,#8 ;發(fā)送8位數(shù)據(jù)
- WBY1:
- CLR CLK ;拉低CLK
- JNB ACC.0,WBY2 ;A寄存器的低位(0位)如果為0就轉(zhuǎn)移
- SETB DIO ;為1,拉高DIO
- SJMP WBY3
- WBY2:
- CLR DIO ;為0,拉低DIO
- WBY3:
- MOV R4,#13 ;延時
- DJNZ R4,$ ;延時
- SETB CLK ;拉高CLK
- CLR C ;進位標志清0
- RRC A ;A寄存器內(nèi)容帶進位循環(huán)右移
- DJNZ R7,WBY1 ;如果還未發(fā)送完8bit數(shù)據(jù)就繼續(xù)
- CLR CLK ;8位數(shù)據(jù)發(fā)送完了
- MOV R7,#20 ;設(shè)置等待應(yīng)答信號延時計數(shù)
- WBY5:
- JNB DIO,WBY6 ;判斷TM1637發(fā)過來的ACK應(yīng)答信號,應(yīng)答就轉(zhuǎn)移(0,低電平)
- DJNZ R7,WBY5 ;
- WBY6:
- MOV R4,#13 ;延時
- DJNZ R4,$ ;延時
- SETB CLK ;拉高CLK
- MOV R4,#13 ;延時
- DJNZ R4,$ ;延時
- RET
- ;------------------ Start子程序 ------------------
- Srt:
- SETB DIO ;拉高DIO
- SETB CLK ;拉高CLK
- MOV R4,#13 ;延時
- DJNZ R4,$ ;延時
- SETB DIO ;拉高DIO
- MOV R4,#13 ;延時
- DJNZ R4,$ ;延時
- CLR DIO ;拉低DIO
- MOV R4,#13 ;延時
- DJNZ R4,$ ;延時
- CLR CLK ;拉低CLK
- RET
- ;------------------ Stop子程序 ------------------
- Stop:
- CLR CLK
- MOV R4,#30
- DJNZ R4,$
- CLR DIO
- MOV R4,#30
- DJNZ R4,$
- SETB CLK
- MOV R4,#40
- DJNZ R4,$
- SETB DIO
- MOV R4,#30
- DJNZ R4,$
- CLR CLK
- CLR DIO
- RET
- ;********************** 以下為EEPROM操作子程序 **********************
- ;STC8G1K08有4K的EEPROM,共8個扇區(qū),
- ;第1扇區(qū):0000H~01FFH;第2扇區(qū):0200H~03FFH……
- ;----------------------------------------------------
- ;
- ;------- 讀EEPROM保存的各項設(shè)置,如果沒有就保存當(dāng)前的設(shè)置值 ---------
- REEP:
- LCALL RE00 ;讀EEPROM
- JNC WEEP ;無數(shù)據(jù)(C=0)就轉(zhuǎn)移,保存當(dāng)前的設(shè)置值
- RET
- WEEP:
- LCALL BCJDQ ;全功率驅(qū)動繼電器保持至EEPROM操作結(jié)束,防止PWM驅(qū)動方式時可能斷開無法吸合
- MOV IAP_ADDRH,#00H ;第一個扇區(qū)地址的高8位
- MOV IAP_ADDRL,#00H ;第一個扇區(qū)地址的低8位
- LCALL Sector_Erase ;擦除整個扇區(qū)
- MOV R1,#FWBZ1 ;首地址
- MOV R2,#30 ;共寫入20個字節(jié)
- WEEP1:
- MOV A,@R1 ;裝入R1指向的RAM地址的內(nèi)容到A
- LCALL Byte_Program ;寫入EEPROM
- INC IAP_ADDRL ;EEPROM地址加1
- INC R1 ;RAM地址增1
- DJNZ R2,WEEP1 ;未保存完就轉(zhuǎn)移繼續(xù)
- MOV IAP_ADDRL,#0 ;保存完了,扇區(qū)地址低位指向0(當(dāng)前扇區(qū)首址)
- LCALL Byte_Read ;讀出來檢查看是否寫入成功
- CJNE A,FWBZ1,WEEP3 ;如果與EEPROM數(shù)據(jù)判斷標志1不相同就轉(zhuǎn)移
- INC IAP_ADDRL ;EEPROM地址加1
- LCALL Byte_Read ;讀第二個字節(jié)
- CJNE A,FWBZ2,WEEP3 ;如果與EEPROM數(shù)據(jù)判斷標志2不相同就轉(zhuǎn)移
- RET ;成功了,退出
- WEEP3:
- SETB XSKG ;“顯示開關(guān)”置為1,關(guān)閉T1中斷的顯示功能
- MOV MJS,#5 ;顯示5秒E1
- MOV ZXM1,#0 ;消隱碼
- MOV ZXM2,#079H ;E
- MOV ZXM3,#006H ;1
- MOV ZXM4,#0 ;消隱碼
- LCALL DISP ;顯示
- WEEP4:
- MOV A,MJS
- JNZ WEEP4 ;等待MJS為0秒
- RET
- ;;---------- 讀EEPROM保存的各項設(shè)置 ----------
- RE00:
- LCALL BCJDQ ;全功率驅(qū)動繼電器保持至EEPROM操作結(jié)束,防止PWM驅(qū)動方式時可能斷開無法吸合
- MOV IAP_ADDRH,#00H ;第一個扇區(qū)地址的高8位
- MOV IAP_ADDRL,#00H ;第一個扇區(qū)地址的低8位
- LCALL Byte_Read ;讀第一個字節(jié),返回:A=讀出的數(shù)據(jù)
- CJNE A,FWBZ1,RE02 ;如果不是原來保存的數(shù)據(jù)就轉(zhuǎn)移
- INC IAP_ADDRL ;EEPROM字節(jié)地址增1
- LCALL Byte_Read ;讀第二個字節(jié)
- CJNE A,FWBZ2,RE02 ;如果不是原來保存的數(shù)據(jù)就轉(zhuǎn)移
- MOV R1,#FWBZ2 ;從FWBZ2+1處開始放置讀出的設(shè)置值
- MOV R2,#28 ;再讀出28個字節(jié)
- RE01:
- INC R1 ;RAM地址增1
- INC IAP_ADDRL ;EEPROM字節(jié)地址增1
- LCALL Byte_Read ;讀一個字節(jié),返回:A=讀出的數(shù)據(jù)
- MOV @R1,A ;放到R1指向的RAM地址
- DJNZ R2,RE01 ;未讀完就繼續(xù)
- SETB C ;把C置為1,讀取成功
- RET
- RE02:
- CLR C ;把C置為0,沒有數(shù)據(jù)
- RET
- ;-------------------------------
- ;EEPROM操作需要數(shù)毫秒以上,期間MCU會暫停,PWM停止。
- ;全功率驅(qū)動使繼電器保持吸合狀態(tài)至EEPROM操作結(jié)束,防止PWM驅(qū)動方式時可能斷開無法吸合
- BCJDQ:
- LCALL SETPWM ;設(shè)置“延時PWM驅(qū)動”時間
- SETB EEPBC ;“EEPROM操作子程序調(diào)用”標志置為1,使T0中斷暫停執(zhí)行繼電器控制程序
- LCALL CTL00 ;控制繼電器
- CLR EEPBC ;標志置為0
- RET
- ;-------------------------------
- ;讀一個字節(jié),A=讀出的數(shù)據(jù)
- Byte_Read:
- MOV IAP_CONTR,#80H ;打開IAP功能
- MOV IAP_TPS,#12 ;設(shè)置等待參數(shù)
- MOV IAP_CMD,#01 ;設(shè)置IAP讀命令
- MOV IAP_TRIG,#05AH ;觸發(fā)命令
- MOV IAP_TRIG,#0A5H ;觸發(fā)命令
- NOP
- MOV A,IAP_DATA ;讀出的數(shù)據(jù)在IAP_DATA,送入累加器A
- RET
- ;-------------------------------
- ;字節(jié)編程,A=需寫入的數(shù)據(jù)
- Byte_Program:
- MOV IAP_CONTR,#80H ;打開IAP功能
- MOV IAP_TPS,#12 ;設(shè)置等待參數(shù)
- MOV IAP_CMD,#02 ;設(shè)置IAP寫命令
- MOV IAP_DATA,A ;要寫入的數(shù)據(jù)先送進IAP_DATA寄存器
- MOV IAP_TRIG,#05AH ;觸發(fā)命令
- MOV IAP_TRIG,#0A5H ;觸發(fā)命令
- RET
- ;-------------------------------
- ;擦除扇區(qū)
- Sector_Erase:
- MOV IAP_CONTR,#80H ;打開IAP功能
- MOV IAP_TPS,#12 ;設(shè)置等待參數(shù)
- MOV IAP_CMD,#03 ;設(shè)置IAP擦除命令
- MOV IAP_TRIG,#05AH ;觸發(fā)命令
- MOV IAP_TRIG,#0A5H ;觸發(fā)命令
- RET
- ;************************* 以上為EEPROM操作子程序 ***************************
- ;
- ;1~15檔控制碼:
- DAB1: DB 0FEH,0FDH,0FBH,0FAH,0F9H,0F8H,0F4H,0F2H,0F1H,0F0H,0E4H,0E2H,0E1H,0E0H,0DFH
- ;
- ;------------------ 字形表 ------------------
- SEGTAB:
- DB 00111111B ;0(3FH)
- DB 00000110B ;1(06H)
- DB 01011011B ;2(5BH)
- DB 01001111B ;3(4FH)
- DB 01100110B ;4(66H)
- DB 01101101B ;5(6DH)
- DB 01111101B ;6(7DH)
- DB 00000111B ;7(07H)
- DB 01111111B ;8(7FH)
- DB 01101111B ;9(6FH)
- DB 01110111B ;A(77H)
- DB 01111100B ;B(7CH)
- DB 00111001B ;C(39H)
- DB 01011110B ;D(5EH)
- DB 01111001B ;E(79H)
- DB 01110001B ;F(71H)
- ;---------------------------------------------
- END
復(fù)制代碼
|
|