;;內(nèi)容:按下PA3接的按鍵進(jìn)中斷LED數(shù)碼管加1
;數(shù)碼管段碼接法A-PD0,B-PD1....G-PD6,H-PD7
;數(shù)碼管位碼接法OM0-PC0...COM4-PC3
;紅外頭接-PA.3
;完整源代碼下載:http://www.torrancerestoration.com/f/hthw.rar
include HT66F50.inc
ORG 0000H
JMP A1
ORG 04H ;外部中斷0入口地址
JMP ZD01 ;
ORG 0014H ;多功能中斷入口地址
JMP ZD1
ORG 30H ;
Q1:
DC 03FH ; 0
DC 006H ; 1
DC 05BH ; 2
DC 04FH ; 3
DC 066H ; 4
DC 06DH ; 5
DC 07DH ; 6
DC 007H ; 7
DC 07FH ; 8
DC 06FH ; 9
DC 077H ; A
DC 07CH ; B
DC 039H ; C
DC 05EH ; D
DC 079H ; E
DC 071H ; F
A1:
MOV A,3FH ;顯示內(nèi)容
MOV [8AH],A ;第一位數(shù)碼管段碼顯示內(nèi)容寄存器
MOV A,3FH ;顯示內(nèi)容
MOV [8BH],A ;第二位數(shù)碼管段碼顯示內(nèi)容寄存器
MOV A,3FH ;顯示內(nèi)容
MOV [8CH],A ;第三位數(shù)碼管段碼顯示內(nèi)容寄存器
MOV A,3FH ;顯示內(nèi)容
MOV [8DH],A ;第四位數(shù)碼管顯示內(nèi)容寄存器
MOV A,08H ;跟CP1C寄存器設(shè)置要求選擇數(shù)據(jù)
MOV CP1C,A ;設(shè)置PC口為I/0口而不是中斷口
CLR PCC ;設(shè)置pc 口為輸出口
CLR PDC ;設(shè)置PD 口為輸出口
MOV A,1 ;設(shè)置初始顯示位碼顯示第一位
MOV [80H],A ;位碼寄存器
MOV A,8AH ;設(shè)置對應(yīng)第一位段碼寄存器
MOV MP0,A ;間接寄存器指針
MOV A,00000000B ;
MOV PRM1,A ;設(shè)置外部中斷0的管腳為PA.3
MOV A,00000010B ;
MOV INTEG,A ;設(shè)置外部中斷0為下降沿觸發(fā)
CLR ACERL ;設(shè)置PA口不為AD輸入口
SET PAPU.3 ;設(shè)置PA.3上拉
SET PAC.3 ;設(shè)置PA.3為輸入口
MOV A,08H ;
MOV CP0C,A ;設(shè)置PA3不為比較器輸入口
CLR PDC ;設(shè)置PD口為輸出口
MOV A,01H ;設(shè)置PD口初始狀態(tài)
MOV PD,A ;PD口顯示初始狀態(tài)
MOV A,00000000B ;設(shè)置TM2 計數(shù)時鐘位為fSYS/4
MOV TM2C0,A
MOV A,11000001B ;設(shè)置TM2中斷為定時/計數(shù)模式選擇比較器A匹配
MOV TM2C1,A
MOV A,LOW 5000 ;設(shè)置中斷時間為5000個時鐘周期
MOV TM2AL,A ;低8位
MOV A,HIGH 5000 ;設(shè)置中斷時間為5000個時鐘周期
MOV TM2AH,A ;高8位
CLR MF0F ;清多功能中斷0標(biāo)志
CLR T2AF ;清定時器2較器A中斷標(biāo)志
SET MF0E ;使能多功能0中斷
SET T2AE ;使能定時器2較器A中斷
CLR INT0F ;清中斷0標(biāo)志
SET INT0E ;使能外部0中斷
SET EMI ;使能總中斷
SET T2ON ;開始計數(shù)
JMP $
;*************************************************
; 外部中斷0服務(wù)子程序
;*************************************************
ZD01: ;進(jìn)入中斷自動關(guān)閉總中斷
SET EMI ;打開總中斷允許嵌套
CLR INT0E ;關(guān)閉外部中斷0避免為完成操作2次中斷
MOV [0F2H],A ;壓棧ACC到0F2H
MOV A,STATUS ;
MOV [0F3H],A ;壓棧status標(biāo)志寄存器到0F3H
MOV A,18 ;設(shè)置起始碼時間(0.5*18=9MS)
MOV [0A0H],A
A2: CALL M001 ;調(diào)用0.5MS延時
SZ PA.3 ;9MS時間內(nèi)判斷PA3是否為高電平
JMP ZD02 ;是高電平不是起始碼則跳出中斷
SDZ [0A0H] ;判斷是否到9MS
JMP A2 ;不到則返回繼續(xù)等待
MOV A,9 ;設(shè)置結(jié)果碼時間4.5MS(0.5*9=4.5MS)
MOV [0A0H],A ;
SNZ PA.3 ;判斷是否為高電平(起始碼是否結(jié)束,
JMP $-1 ;起始碼必須結(jié)束,結(jié)果碼才能開始)
A3: CALL M001 ;調(diào)用0.5MS延時
SNZ PA.3 ;4.5MS時間內(nèi)判斷PA3是否為低電平
JMP ZD02 ;是低電平則不是結(jié)果碼跳出中斷
SDZ [0A0H] ;判斷是否到4.5ms
JMP A3 ;不到這繼續(xù)等待
SZ PA.3 ;到了則是結(jié)果碼則等待判斷結(jié)果碼是否結(jié)束
JMP $-1 ;結(jié)果碼必須結(jié)束后才能繼續(xù)下一步判斷
MOV A,8 ;設(shè)置接收的數(shù)為8bit
MOV [0A1H],A ;
MOV A,4 ;設(shè)置接收個數(shù)
MOV [0A2H],A ;
MOV A,3 ;設(shè)置分辨0或1的時間1.5MS以上為1
MOV [0A0H],A ;
MOV A,0A4H ;設(shè)置收到的數(shù)存到0A4H(地址碼)0A5H(地址反碼)
MOV MP1,A ;0A6H(數(shù)據(jù)碼)0A7H(數(shù)據(jù)反碼)
A4:
SNZ PA.3 ;判斷0.565MS低電平是否結(jié)束
JMP A4 ;必須在0.565MS低電平結(jié)束后才能判斷所收的數(shù)是1還是0
A5:
CALL M001 ;延時0.5MS
SNZ PA.3 ;1.5MS內(nèi)判斷PA3是否為0
JMP A6 ;是0則說明時間小于1.5MS為0
SDZ [0A0H] ;判斷是否到1.5MS
JMP A5 ;1 ;否則繼續(xù)等待
SET C ;置位標(biāo)志C
RLC IAR1 ;通過帶進(jìn)位左移指令把當(dāng)前數(shù)保存起來
JMP A7 ;
A6:
CLR C ;清標(biāo)志C
RLC IAR1 ;通過帶進(jìn)位左移指令把當(dāng)前數(shù)保存起來
A7:
MOV A,3 ;到了1.5MS還是高電平說明為1
MOV [0A0H],A ;重新設(shè)置分辨0或1的時間1.5MS以上為1
SZ PA.3 ;判斷是否結(jié)束回到0.565MS低電平狀態(tài)
JMP $-1 ;必須要回到0.565MS才能接收下一個數(shù)
SDZ [0A1H] ;判斷是否收夠了8位數(shù)
JMP A4 ;否則繼續(xù)
MOV A,8 ;重新設(shè)置位數(shù)
MOV [0A1H],A ;
INC MP1 ;間接寄存器加1
SDZ [0A2H] ;判斷是否收夠4個NEC碼
JMP A4 ;
MOV A,[0A4H] ;地址碼
MOV [8AH],A ;第一位數(shù)碼管段碼顯示內(nèi)容寄存器
MOV A,[0A5H] ;地址反碼
MOV [8BH],A ;第二位數(shù)碼管段碼顯示內(nèi)容寄存器
MOV A,[0A6H] ;數(shù)據(jù)碼
MOV [8CH],A ;第三位數(shù)碼管段碼顯示內(nèi)容寄存器
MOV A,[0A7H] ;數(shù)據(jù)反碼
MOV [8DH],A ;第四位數(shù)碼管顯示內(nèi)容寄存器
ZD02:
MOV A,[0F3H] ;彈棧后進(jìn)先出先進(jìn)后出
MOV STATUS,A ;彈棧0F1H的數(shù)到標(biāo)志寄存器
MOV A,[0F2H] ;彈棧0F0H的數(shù)到acc
CLR INT0F ;清中斷標(biāo)志
SET INT0E ;使能外部中斷
RETI ;中斷返回
;*******************************************************
; 中斷服務(wù)子程序
;*******************************************************
ZD1:
MOV [0F0H],A ;壓棧ACC到0F0H
MOV A,STATUS ;
MOV [0F1H],A ;壓棧status標(biāo)志寄存器到0F1H
CLR PC ;清PC(清屏幕)
MOV A,Q1 ;數(shù)據(jù)表地址
CLR TBHP ;清數(shù)據(jù)表地址高位否則出錯
ADD A,IAR0 ;利用間接寄存器找到要顯示段碼所在數(shù)據(jù)表的地址
MOV TBLP,A ;表格指針寄存器TBLP
; TABRD PD ;查表并將數(shù)據(jù)存到PD口寄存器
MOV A,IAR0 ;
MOV PD,A ;顯示收到的數(shù)到LED上
MOV A,[80H] ;位碼寄存器
MOV PC,A ;將位碼寄存器的數(shù)存到PC口寄存器
;段碼和位碼的數(shù)都有了所以數(shù)碼管被點(diǎn)亮
INC MP0 ;間接寄存器指針加1指向下一個段碼寄存器
RL [80H] ;左移位碼寄存器控制下一個數(shù)碼管
SNZ [80H].5 ;判斷是否控制完4個數(shù)碼管
JMP ZD2 ;退出中斷繼續(xù)
MOV A,1 ;是則從新初始化寄存器數(shù)據(jù)
MOV [80H],A ;
MOV A,8AH ;千位數(shù)碼管對應(yīng)寄存器
MOV MP0,A ;存到間接寄存器0
ZD2:
MOV A,[0F1H] ;彈棧后進(jìn)先出先進(jìn)后出
MOV STATUS,A ;彈棧0F1H的數(shù)到標(biāo)志寄存器
MOV A,[0F0H] ;彈棧0F0H的數(shù)到acc
CLR MF0F ;清多功能標(biāo)志
CLR T2AF ;清定時器2比較器A標(biāo)志
RETI ;中斷返回
;**************************************
; 延時子程序
;**************************************
M001:
MOV A,1
MOV [85H],A
M002:
MOV A,3
MOV [86H],A
M003:
MOV A,105
MOV [87H],A
M004:
SDZ [87H]
JMP M004
SDZ [86H]
JMP M003
SDZ [85H]
JMP M002
RET
END