?? ir.asm
字號(hào):
;名稱 數(shù)碼管2
;編寫 田若征 聯(lián)系QQ:36731207
;時(shí)間 2006.10.26
;功能 此程序?qū)崿F(xiàn)把紅外遙控器按鍵值解出并顯示在數(shù)碼管上
;難度等級(jí) 3
ORG 0000H
AJMP MAIN;轉(zhuǎn)入主程序
ORG 0003H ;外部中斷P3.2腳INT0入口地址
AJMP INT ;轉(zhuǎn)入外部中斷服務(wù)子程序(解碼程序)
;以下為主程序進(jìn)行CPU中斷方式設(shè)置
MAIN:SETB EA ;打開CPU總中斷請(qǐng)求
SETB IT0 ;設(shè)定INT0的觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
SETB EX0 ;打開INT0中斷請(qǐng)求
;以下對(duì)單片機(jī)的所有引腳進(jìn)行初始化,全部設(shè)置成高電平
MOV P2,#0c0h
mov p1,#00h
AJMP $
;以下為進(jìn)入P3.2腳外部中斷子程序,也就是解碼程序
INT: CLR EA ;暫時(shí)關(guān)閉CPU的所有中斷請(qǐng)求
MOV R6,#10
SB: ACALL YS1;調(diào)用882微秒延時(shí)子程序
JB P3.2,EXIT;延時(shí)882微秒后判斷P3.2腳是否出現(xiàn)高電平如果有就退出解碼程序
DJNZ R6, SB;重復(fù)10次,目的是檢測在8820微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序
;以上完成對(duì)遙控信號(hào)的9000微秒的初始低電平信號(hào)的識(shí)別。
JNB P3.2, $ ;等待高電平避開9毫秒低電平引導(dǎo)脈沖
ACALL YS2 ;延時(shí)4.74毫秒避開4.5毫秒的結(jié)果碼
MOV R7,#26;忽略前26位系統(tǒng)識(shí)別碼
JJJJA:JNB P3.2,$;等待地址碼第一位的高電平信號(hào)
LCALL YS1;高電平開始后用882微秒的時(shí)間尺去判斷信號(hào)此時(shí)的高低電平狀態(tài)
MOV C,P3.2;將P3.2引腳此時(shí)的電平狀態(tài)0或1存入C中
JNC UUUA;如果為0就跳轉(zhuǎn)到UUUA
LCALL YS3;檢測到高電平1的話延時(shí)1毫秒等待脈沖高電平結(jié)束
UUUA: DJNZ R7,JJJJA
MOV R1,#1AH ;設(shè)定1AH為起始RAM區(qū)
MOV R2,#2;接收從1AH到1BH的2個(gè)內(nèi)存,用于存放操作碼和操作反碼
PP: MOV R3,#8;每組數(shù)據(jù)為8位
JJJJ: JNB P3.2,$;等待地址碼第一位的高電平信號(hào)
LCALL YS1;高電平開始后用882微秒的時(shí)間尺去判斷信號(hào)此時(shí)的高低電平狀態(tài)
MOV C,P3.2;將P3.2引腳此時(shí)的電平狀態(tài)0或1存入C中
JNC UUU;如果為0就跳轉(zhuǎn)到UUU
LCALL YS3;檢測到高電平1的話延時(shí)1毫秒等待脈沖高電平結(jié)束
UUU: MOV A,@R1;將R1中地址的給A
RRC A;將C中的值0或1移入A中的最低位
MOV @R1,A;將A中的數(shù)暫時(shí)存放在R1數(shù)值的內(nèi)存中
DJNZ R3,JJJJ;接收滿8位換一個(gè)內(nèi)存
INC R1;對(duì)R1中的值加1,換下一個(gè)RAM
DJNZ R2,PP ;接收完8位數(shù)據(jù)碼和8位數(shù)據(jù)反碼,存放在1AH/1BH中
MOV A,1AH
CPL A;對(duì)1AH取反后和1BH比較
CJNE A,1BH,EXIT;如果不等表示接收數(shù)據(jù)發(fā)生錯(cuò)誤,放棄
call display
CLR P3.3;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
LCALL YS2
LCALL YS2
LCALL YS2
SETB P3.3;蜂鳴器停止
EXIT: SETB EA ;允許中斷
RETI ;退出解碼子程序
display:
;push a
mov a,1ah
cjne a,#11h,ds1
mov 1ch,#1
jmp quit
ds1: cjne a,#12h,ds2
mov 1ch,#2
jmp quit
ds2: cjne a,#13h,ds3
mov 1ch,#3
jmp quit
ds3: cjne a,#14h,ds4
mov 1ch,#4
jmp quit
ds4: cjne a,#15h,ds5
mov 1ch,#5
jmp quit
ds5: cjne a,#16h,ds6
mov 1ch,#6
jmp quit
ds6: cjne a,#17h,ds7
mov 1ch,#7
jmp quit
ds7: cjne a,#18h,ds8
mov 1ch,#8
jmp quit
ds8: cjne a,#19h,ds9
mov 1ch,#9
jmp quit
ds9: cjne a,#10h,quit
mov 1ch,#0
quit:
mov a,1ch
mov dptr,#numtab ;指定查表啟始地址
MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
MOV P2,a;將按鍵的鍵值通過P1口的8個(gè)LED顯示出來!
mov p1,#00h
;pop a
ret
YS1: MOV R4,#14 ;延時(shí)子程序1,精確延時(shí)882微秒
D1: MOV R5,#27
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#182 ;延時(shí)子程序2,精確延時(shí)4740微秒
D2: MOV R5,#10
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#23;延時(shí)程序3,精確延時(shí)1000微秒
D3:MOV R5,#18
DJNZ R5,$
DJNZ R4,D3
nop
nop
RET
;實(shí)驗(yàn)板上的7段數(shù)碼管0~9數(shù)字的共陽顯示代碼
numtab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h
;0 1 2 3 4 5 6 7 8 9
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -