?? yao.asm
字號:
;
;***********************************************************************
;
; 遙控器
; v1.0-------2007,6,6
; cpu==em78p156E
;************************************************************************
;CLK---4M ,采用2分頻,
;P5為紅外發射口, P6.0-3為KEY輸出
;P6.4-7為KEY輸入(上拉),允許電平變化中斷,
;紅外發射采用TC 38K==T(26,3US)的定時中斷,每個BIT發422USx4
;
; |--------|422 | |----|422X3 |
;1== | 422x3 |----| ; 0==|422 |--------|
;
;KEY==01----60H; 02----50H; 03---48H; 04----44H
; 05----42H; 06----41H; 07---A0H; 08----90H
; 09----88H; 0A----84H; 0B---82H; 0C----81H
;發射時KEY前面加0000;
;每個數據發2次,間隔38MS
;
;***********************************************************************
PORT5 == 0x05 ;定義端口PORT5
PORT6 == 0x06 ;定義端口PORT6
R1 == 0X01
PC == 0x02 ;定義端口PORT6
STATUS == 0x03 ;定義端口PORT6
;-----------------------------------------------------------------------
IOCB == 0x0B ;定義寄存器IOCB
IOCC == 0x0C ;定義寄存器IOCC
IOCD == 0x0D ;定義寄存器IOCD
IOCE == 0x0E ;定義寄存器IOCE
CONT == 0X01 ;定義寄存器cont
IOCF == 0x0F ;定義寄存器IOCF
RF == 0x0F ;定義寄存器rf
;-----------------------------------------------------------------------
DLY1 == 0x12
DLY2 == 0x13
DLY3 == 0x14
key_1 == 0X15 ;定義延時單元
key_2 == 0X16
key_3 == 0X17
main_key == 0X18
key_temp == 0X19
key_bak == 0X1A
tx_code == 0x1B
tx_count == 0x1c
DLY4 == 0x1d
DLY5 == 0x1e
code_temp == 0x1f
;-----------------------------------------------------------------------
tcif ==0
icif ==1
;--------------------------------------------------------------
ORG 0X00 ;源地址從0X00開始
JMP INIT
ORG 0X08
JMP SERV
INIT:
nop
nop
MOV A,@0x10
IOW IOCE ;open看門狗功能,wdt time=32ms
IOW PORT5 ;設定PORT5全部為輸出
IOW IOCC ;禁止開路
clr port5
MOV A,@0xff
IOW IOCB ;禁止下拉
MOV A,@0x1F
CONTW ;分頻1:128 給WDT, TC==指令周期
MOV A,@0xff ;禁止上拉
IOW IOCD ;
MOV A,@0xf0 ;設定PT6.0-PT6.3為輸出
IOW PORT6 ;PT6.4-PT6.7為輸入
MOV A,@0x03 ;PT6.4-7上拉
IOW IOCF ;允許TC和P6中斷
CLR RF ;CLEAR P6 INPUT CHANGE SIGN ;CLEAR TC SI
mov a,@0x01
mov main_key,a
clr key_temp
clr key_bak
clr port5
disi ;close interrput
wdtc
;-----------------------------------------------------------------------
MAIN: NOP
CALL TEST_KEY
NOP
NOP
;----------------------------------------------------
mov a,@0b00000110
contw
clr r1
mov a,@0b00001110
contw
wdtc
mov a,@0b00000000
iow ioce
mov port6,port6
MOV A,@0b00000110 ;PT6.4-7上拉
IOW iocf ;允許TC和P6中斷
disi
;--------------------------------------------------------
slep
nop
MOV A,@0x10
IOW IOCE ;open看門狗功能,wdt time=32ms
call delay10ms
JMP MAIN
;-------------------------------------------------------
; KEY TRANSLATE
; 按鍵掃描
;-------------------------------------------------------
KEY_TAB:
mov a,key_2
add pc,a
nop
RETL @0xe0
RETL @0xd0
RETL @0xb0
RETL @0x70
;------------------------------------------
key_vol:
mov a,key_bak
add pc,a
nop
RETL @0x60
RETL @0x50
RETL @0x48
RETL @0x44
RETL @0x42
RETL @0x41
RETL @0xa0
RETL @0x90
RETL @0x88
RETL @0x84
RETL @0x82
RETL @0x81
;--------------------------------------
key_on:
clr key_1
clr key_2
clr key_3
mov a,@0xfd ;p6.1=0, test a,b,c,d
mov port6,a
call delay10us
mov a,port6
and a,@0xf0
xor a,@0xf0
jbc status,2
jmp keyval1
mov a,@0x00
mov key_1,a ;key_1按鍵掃描行寄存器
jmp keyval4
keyval1:
mov a,@0xfb ;p6.2=0, test e,f,g,h
mov port6,a
call delay10us
mov a,port6
and a,@0xf0
xor a,@0xf0
jbc status,2
jmp keyval2
mov a,@0x04
mov key_1,a ;key_1按鍵掃描行寄存器
jmp keyval4
keyval2:
mov a,@0xf7 ;p6.3=0, test i,j,k,l
mov port6,a
call delay10us
mov a,port6
and a,@0xf0
xor a,@0xf0
jbc status,2
jmp keyval3
mov a,@0x08
mov key_1,a ;key_1按鍵掃描行寄存器
jmp keyval4
keyval3:
mov a,@0xfe ;p6.0=0, test main
mov port6,a
call delay10us
mov a,port6
and a,@0xf0
xor a,@0xf0
jbc status,2
ret
mov a,@0x0c
mov key_1,a ;key_1按鍵掃描行寄存器
keyval4:
inc key_2 ;key_2按鍵掃描列寄存器
mov a,key_2
sub a,@0x04 ;04-a>=0,c=1
jbs status,0
ret
call KEY_TAB
mov key_3,a
mov a,port6
and a,@0xf0
xor a,key_3 ;
jbs status,2
jmp keyval4
mov a,key_1
add a,key_2
mov key_temp,a
ret
; -------------------------------------------
; KEY TEST PROM
; P6.0 P6.1 P6.2 P6.3(out)
;P6.4 ---|-----A------E----I----
;
;P6.5 ---|-----B------F----J----
;
;P6.6 ---|-----C------G----K----
;
;P6.7 --MAIN---D------H----L----
;(in)
;
; KEY CODE: A--01H, E--05H, I--09H, MAIN--OD10H
; B--02H, F--06H, J--0AH,
; C--03H, G--07H, K--0BH,
; D--04H, H--08H, L--0CH,
;
; MAIN+KEY(01/02--0C)==KEY(01/02--0C)
;-------------------------------------------------
test_key:
mov a,@0xf0
mov port6,a ;p6.0--3=low, p6.4--7==high
nop
nop
mov a,port6
and a,@0xf0
xor a,@0xf0 ;test p6.4--7
jbc status,2
ret
call delay10ms
mov a,port6
and a,@0xf0
xor a,@0xf0
jbc status,2
ret
call key_on ;按鍵判斷
mov a,key_temp ;KEY_TEMP按鍵代碼寄存器
mov key_bak,a ;按鍵代碼備份寄存器
mov a,@0x10 ;0d為main按鍵代碼,
xor a,key_temp ;
jbs status,2
jmp key_quite
mov a,main_key
mov key_bak,a
key_quite:
call key_vol
mov tx_code,a
call input_despose ;輸入處理
call delay10ms
call delay10ms
call delay10ms
call input_despose ;輸入處理
key_off:
wdtc
mov a,@0xf0 ;等待松手
mov port6,a ;p6.0--3=low, p6.4--7==high
nop
nop
mov a,port6
and a,@0xf0
xor a,@0xf0
jbc status,2
jmp key_open
mov a,@0x10 ;10為main按鍵代碼,
xor a,key_temp ;
jbs status,2
jmp key_off
call key_on ;按鍵再判斷
mov a,@0x10
xor a,key_temp
jbc status,2
jmp key_off
mov a,key_temp
mov main_key,a
jmp key_off
key_open:
call delay10ms
mov a,port6
and a,@0xf0
xor a,@0xf0
jbs status,2
jmp key_off
key_over:
clr key_temp
clr key_bak
ret
;------------------------------------------------------------------
input_despose:
MOV A,@0x01 ;
IOW IOCF ;允許TC intreeput
mov a,@0x08
mov tx_count,a
mov a,tx_code
mov code_temp,a
call tx_low ;422us bit=1,422usx3 bit=0
call tx_low ;422us bit=1,422usx3 bit=0
call tx_low ;422us bit=1,422usx3 bit=0
call tx_low ;422us bit=1,422usx3 bit=0
tx_data:
jbc code_temp,7
jmp tx_1
call tx_low
jmp tx_down
tx_1:
call tx_high
tx_down:
rlc code_temp
djz tx_count
jmp tx_data
clr port5
ret
;------------------------------------------------------------------
tx_low:
eni ;allow interrput
call day422
disi ;not_allow interrput
clr port5
call delay422
call delay422
call delay422
clr port5
ret
;-----------------------------------------------------------------
tx_high:
eni ;allow interrput
call day422
call day422
call day422
disi ;not_allow interrput
clr port5
call delay422
clr port5
ret
;----------------------------------------------------------------
day422:
MOV A,@0x23 ;36pcs
MOV DLY4,A ;
day422_1:
nop ;
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop ;12 nop
nop
DJZ DLY4
JMP day422_1
nop
nop
ret
;------------------------------------------------------
delay422:
MOV A,@0x38 ;燒寫時為38H,防真時為37H-----!
MOV DLY5,A ;
delay422_1:
nop ;
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop ;12 nop
nop
DJZ DLY5
JMP delay422_1
ret
;-----------------------------------------------------------------
delay10ms:
wdtc
MOV A,@0x21 ;1*(DLY3)
MOV DLY2,A ;1*(DLY3)
INNER2:
MOV A,@0xff ;1*(DLY3)*(DLY2)
MOV DLY1,A ;1*(DLY3)*(DLY2)
INNER1:
DJZ DLY1 ;1*(DLY3)*(DLY2)*(DLY1)
JMP INNER1 ;1*(DLY3)*(DLY2)*(DLY1)
DJZ DLY2 ;1*(DLY3)*(DLY2)
JMP INNER2 ;1*(DLY3)*(DLY2)
wdtc
RET ;延時去抖動子程序
;----------------------------------------------------------------
delay10us:
MOV A,@0x20
MOV DLY3,A
delay20us_1:
DJZ DLY3
JMP delay20us_1
ret
;-----------------------------------------------------------------
SERV:
com port5
mov a,@0xee
mov R1,a
bc rf,tcif
reti
;-------------------------------------------------------------------
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -