NOKIA线控耳机源码,协议为NOKIA自定义协议
;======================================================; Programmer: freebirds
; Date : 2008/04/18
; Cycle : IRC(internal RC)(4MHZ)=1us/一个指令
; IC : MK7A11P
; Description :
; H8 耳机代码
; 由FM8PS53上代码移植
;
;======================================================
;======================================================
; 命名方式:
; R_ Variables(Register)
; L_ Label
; S_ Subroutine
; C_ Constants
;======================================================
;======================================================
;状态寄存器的说明:
;"c" 产生进位时,置1,无进位时,置0
; 产生借位时,置0无借位时,置1
;"z" 当算术运算或逻辑运算结果为0时,该位为1,反之为0
;======================================================
;======================================================
; 功能寄存器
;======================================================
IAR EQU 0x00
TMR0 EQU 0x01
PCL EQU 0x02
;----------------------------------
STATUS EQU 0x03 ; 状态控制寄存器
C EQU 0
DC EQU 1
Z EQU 2
FSR EQU 0x04
;----------------------------------
PORTA EQU 0x05
C_HOLD EQU 0 ; 对应HOLD键
C_VSS EQU 1 ;
;----------------------------------
PORTB EQU 0x06
C_Data EQU 0
C_Out EQU 1
;----------------------------------
IRQM EQU 0x09
INTM EQU 7
PB0M EQU 1
TM0M EQU 0
;----------------------------------
IRQF EQU 0x0A
PB0F EQU 1
TM0F EQU 0
PA_PDM EQU 0x0B
PB_PUP EQU 0x0C
PB_PDM EQU 0x0D
PB_POD EQU 0x0E
WAKEUP EQU 0x0F
;======================================================
A EQU 0
M EQU 1
;======================================================
; 普通寄存器
;======================================================
R_10H EQU 0x20
R_23H EQU 0x21
R_29H EQU 0x22
R_11H EQU 0x23
R_2AH EQU 0x24
R_2BH EQU 0x25
R_24H EQU 0x26
R_21H EQU 0x27
R_20H EQU 0x28
R_22H EQU 0x29
R_27H EQU 0x2A
R_28H EQU 0x2B
R_26H EQU 0x2C
R_25H EQU 0x2D
ORG 0000H
START:
LCALL S_INIT
;==================================================
; Test Area
;L_TEST:
; BS PORTB,7
; MOVLA 0x12
; MOVAM R_29H
; LCALL S_164H
; BC PORTB,7
; MOVLA 0x12
; MOVAM R_29H
; LCALL S_164H
;
; LGOTO L_TEST
;==================================================
BTSC PORTA,C_VSS ; PA1为1 GOTO L_1AH (PA1 为外部上拉)
LGOTO L_1AH
;MOVLA 0x1E
;IODIR PORTB ; 设置PB<1:7>为输出
L_0CH:
LCALL S_10CH ; 按键扫描
MOV R_10H,A
MOVAM R_23H
MOV R_23H,A
XORLA 0xFF
BTSC STATUS,Z
LGOTO L_15H
BS PORTB,0
LGOTO L_16H
L_15H:
BC PORTB,0
L_16H:
MOVLA 0x12
MOVAM R_29H
LCALL S_164H ; 延时 7*(R_29H)+9 cycle = 7*18+9 = 135us
LGOTO L_0CH ; 继续按键扫描,扫描周期为135us,无防抖处理
; ------------------------------------------------------------
; 以下为耳机与手机的交互过程
L_1AH:
LCALL S_INIT ; 初始化
L_1CH:
BTSS PORTB,C_Data
LGOTO L_1CH ; 循环等待高电平
LGOTO L_94H
L_23H:
LCALL S_172H ; 握手,不成功不退出
CLR R_22H
LCALL S_1DFH ; PB0接收一个8位数据 并与22H内数据进行比较
MOV R_10H,A
BTSC STATUS,Z
LGOTO L_2AH
LGOTO L_1AH
L_2AH:
BC IRQM,INTM ; 关总中断
MOVLA 0xC6
SELECT ; 预分频器给TMR0,128分频
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
L_2EH:
MOV TMR0,A
;XORLA 0x20
XORLA 0xDF
BTSS STATUS,Z
LGOTO L_2EH ; 延时4.096ms
BC IRQM,INTM ; 关总中断
MOVLA 0xC1
SELECT ; 设置TMR0预分频为8
LCALL S_1B7H ; PB0 输出83.5us低电平->高电平
MOVLA 0x0C
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 1100
CLR R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0000
MOVLA 0x0C
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 1100
CLR R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0000
MOVLA 0x0A
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 1010
CLR R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0000
MOVLA 0x09
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 1001
MOVLA 0x0C
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 1100
MOVLA 0x02
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0010
LCALL S_1DFH ; PB0接收一个8位数据 并与22H内数据进行比较
; 实际接收数据为08H(高位数据先接收)
BC IRQM,INTM ; 关总中断
MOVLA 0xC6
SELECT ; TMR0 预分频设置为128
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
L_53H:
MOV TMR0,A
;XORLA 0x20
XORLA 0xDF
BTSS STATUS,Z
LGOTO L_53H ; 延时4.096ms
BC IRQM,INTM
MOVLA 0xC1
SELECT ; TMR0 预分频设置为4
LCALL S_1B7H ; PB0 输出83.5us低电平->高电平
MOVLA 0x0D
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 1101
MOVLA 0x0D
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 1101
MOVLA 0x04
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0100
CLR R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0000
MOVLA 0x02
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0010
CLR R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0000
MOVLA 0x01
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0001
CLR R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0000
CLR R_22H
LCALL S_236H ; PB0 输出4位数据 ; 0000
LCALL S_1DFH ; PB0接收一个8位数据 并与22H内数据进行比较
LCALL S_1DFH ; PB0接收一个8位数据 并与22H内数据进行比较
LCALL S_1DFH ; PB0接收一个8位数据 并与22H内数据进行比较
LCALL S_1DFH ; PB0接收一个8位数据 并与22H内数据进行比较
LCALL S_1DFH ; PB0接收一个8位数据 并与22H内数据进行比较
LCALL S_1DFH ; PB0接收一个8位数据 并与22H内数据进行比较
MOVLA 0x2A
MOVAM R_22H
LCALL S_1DFH ;PB0接收一个8位数据 并与R_22H内数据进行比较
MOV R_10H,A
BTSC STATUS,Z
LGOTO L_7FH
LGOTO L_1AH
L_7FH:
BC IRQM,INTM
MOVLA 0xC6
SELECT ; TMR0设置预分频为128
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
L_83H:
MOV TMR0,A
;XORLA 0x20
XORLA 0xDF
BTSS STATUS,Z
LGOTO L_83H ; 延时4.096ms
LCALL S_1B7H ; PB0 输出83.5us低电平->高电平
MOVLA 0x0F
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据
MOVLA 0x0F
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据
LCALL S_1C0H
LCALL S_1C0H
MOVLA 0x1D
IODIR PORTB ; PB0 改成输入
LGOTO L_96H
L_94H:
LGOTO L_23H
L_95H:
LGOTO L_1CH
L_96H:
CLR R_27H
MOVLA 0xFF
MOVAM R_28H
MOVLA 0xFA
MOVAM R_23H
LGOTO L_A1H
L_9CH:
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
L_9DH:
MOV TMR0,A
;XORLA 0x20
XORLA 0xDF
BTSS STATUS,Z
LGOTO L_9DH ; 延时4.096ms
L_A1H:
MOV R_23H,A
MOVAM R_11H
MOVLA 0x01
SUB R_11H,A
MOVAM R_23H
MOV R_11H,A
BTSS STATUS,Z
LGOTO L_9CH ; 循环延时,次数为23H的值,总时间为4.096ms*250 = 1.024s
MOVLA 0x96
MOVAM R_23H
LGOTO L_B1H
L_ACH:
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
L_ADH:
MOV TMR0,A
;XORLA 0x20
XORLA 0xDF
BTSS STATUS,Z
LGOTO L_ADH
L_B1H:
MOV R_23H,A
MOVAM R_11H
MOVLA 0x01
SUB R_11H,A
MOVAM R_23H
MOV R_11H,A
BTSS STATUS,Z
LGOTO L_ACH ; 循环延时,次数为23H的值,总时间为4.096ms*150 = 0.614s
L_B9H:
LCALL S_10CH ; 键盘扫描,R_10H带回键值
MOV R_10H,A
MOVAM R_23H
BC R_23H,1 ; 键值的b1位恒为1,所以将其屏蔽,不做处理
MOV R_23H,A
XOR R_28H,A
BTSS STATUS,Z
LGOTO L_C2H
LGOTO L_B9H ; 按键无变化
L_C2H:
MOV R_23H,A
MOVAM R_28H
MOV R_23H,A
MOVAM R_26H
LGOTO L_FCH
L_C7H:
MOVLA 0x12
MOVAM R_25H
LCALL S_259H ; PB0 输出1(禁止漏极开路输出)->延时135us->PB0使能漏极开路输出
LCALL S_172H ; 握手
LCALL S_1DFH ; PB0接收一个8位数据 并与22H内数据进行比较
BC IRQM,INTM ; 关总中断
MOVLA 0xC6
SELECT ; TMR0 设置预分频为128
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
L_D0H:
MOV TMR0,A
;XORLA 0x20
XORLA 0xDF
BTSS STATUS,Z
LGOTO L_D0H ; 延时4.096ms
LCALL S_1B7H ; PB0 输出83.5us低电平->高电平
LCALL S_1C0H
MOVLA 0x08
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据
MOVLA 0x03
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据
BC IRQM,INTM ; 关总中断
MOVLA 0xC1
SELECT ; TMR0 设置预分频为4
LCALL S_1DFH ; PB0接收一个8位数据 并与22H内数据进行比较
BC IRQM,INTM
MOVLA 0xC6
SELECT ; TMR0 设置预分频为128
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
L_E4H:
MOV TMR0,A
;XORLA 0x20
XORLA 0xDF
BTSS STATUS,Z
LGOTO L_E4H
SWAP R_26H,A
ANDLA 0x0F
MOVAM R_23H
MOVLA 0x0F
AND R_26H,M
LCALL S_1B7H ; PB0 输出83.5us低电平->高电平
LCALL S_24FH ; PB0 输出 135.5us 高电平->538.5us低电平->高电平
MOV R_23H,A
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据
MOV R_26H,A
MOVAM R_22H
LCALL S_236H ; PB0 输出4位数据
; 上述这段,将26H的值高低4位分两次调用S_236H进行处理
; 该值 即为耳机的按键值
BS PORTB,C_Data
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
L_F7H:
MOV TMR0,A
;XORLA 0xA0
XORLA 0x5F
BTSS STATUS,Z
LGOTO L_F7H ; 延时20ms
LGOTO L_B9H ; 返回键盘扫描
L_FCH:
LGOTO L_C7H
RET
;======================================================
; 上电初始化
;======================================================
S_INIT:
BC IRQM,INTM ; clear all interrupt
MOVLA 0xC6
SELECT ; 预分频器给TMR0,128分频
MOVLA 0x1D
IODIR PORTB ; set PB0,PB<2:4> input
;MOVLA 0xFD
MOVLA 0x1D
MOVAM PB_POD ; PB1 disable open-drain, 其他漏级开路
;MOVLA 0x07
;MOVAM PB_PDM ; PB禁止下拉
MOVLA 0xFE
MOVAM PB_PUP ; PB0 disable pull-up, 其他上拉PB0口输出具"线与"特性
MOVLA 0xFF
IODIR PORTA ; 设置PA为输入口,复位为内部下拉禁止
MOVLA 0x01
MOVAM IRQM ; TMR0 中断允许,总中断禁止
RET
;---------------------------------
; 按键扫描:
; 10H 返回键值
; PHONE FEH
; HOLD FFH
; PREV 7FH
; VOL+ FBH
; NEXT BFH
; VOL- F7H
; PAUSE EFH
; STOP DFH
; 无 FFH
S_10CH:
MOV R_11H,A
MOVAM R_2AH
;MOVLA 0x1D
;MOVAM PB_POD ; PB1、PB<5:7> disable open-drain
BC PORTB,5
BS PORTB,6
BS PORTB,7 ; PB5 set 0, PB6 set 1, PB7 set 1
; PHONE
NOP
BTSC PORTB,2
LGOTO L_11AH
MOVLA 0xFE
MOVAM R_10H
LGOTO L_161H
; HOLD
L_11AH:
BTSC PORTA,0
LGOTO L_123H
MOVLA 0xFF
MOVAM R_10H
LGOTO L_161H
; PREV
L_123H:
BTSC PORTB,3
LGOTO L_12CH
MOVLA 0x7F
MOVAM R_10H
LGOTO L_161H
; VOL+
L_12CH:
BTSC PORTB,4
LGOTO L_135H
MOVLA 0xFB
MOVAM R_10H
LGOTO L_161H
; NEXT
L_135H:
BS PORTB,5
BC PORTB,6
BS PORTB,7
NOP
BTSC PORTB,3
LGOTO L_141H
MOVLA 0xBF
MOVAM R_10H
LGOTO L_161H
; VOL-
L_141H:
BTSC PORTB,4
LGOTO L_14AH
MOVLA 0xF7
MOVAM R_10H
LGOTO L_161H
; PAUSE
L_14AH:
BS PORTB,5
BS PORTB,6
BC PORTB,7
NOP
BTSC PORTB,3
LGOTO L_156H
MOVLA 0xEF
MOVAM R_10H
LGOTO L_161H
; STOP
L_156H:
BTSC PORTB,4
LGOTO L_15FH
MOVLA 0xDF
MOVAM R_10H
LGOTO L_161H
L_15FH:
MOVLA 0xFF
MOVAM R_10H ; 无任何按键,置标志为R_10H为FFH
L_161H:
;MOVLA 0xFD
;MOVAM PB_POD ; PB1 disable open-drain, 其他漏级开路
MOV R_2AH,A
MOVAM R_11H
RET
;----------------------------------
; 根据R_29H的值延时
; 一个循环 = 7 cycle = 7*1us = 7us
; R_29H = 1时, 整个调用时间为 2+2+7+1+2+2 cycle = 16us
; 延时时间 = 2+2+7*(R_29H)+1+2+2 cycle = 7*(R_29H)+9 cycle
S_164H:
LGOTO L_16EH ; 2
L_165H:
NOP ; 1
NOP ; 1
DEC R_29H,M ; 1
L_16EH:
MOV R_29H,A ; 1
BTSS STATUS,Z ; 1 or 2
LGOTO L_165H ; 2
RET ; 2
;----------------------------------
; 握手
; 握手成功后,TMR0预分频改为4
S_172H:
MOV R_11H,A
MOVAM R_2AH
MOVLA 0x1D
IODIR PORTB ; 将PB0 设为输入
LGOTO L_1B0H
L_178H:
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
BC IRQF,TM0F
BS PORTB,C_Out
L_17BH:
BTSC PORTB,C_Data
LGOTO L_17BH ; 循环等待低电平
BC PORTB,C_Out
MOV TMR0,A
MOVAM R_23H ; 读取TMR0 -> R_23H
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
BTSC IRQF,TM0F
LGOTO L_18DH
;MOVLA 0x14
;SUB R_23H,A
;BTSC STATUS,C
MOVLA 0xEB
SUB R_23H,A
BTSS STATUS,C ; TMR0计数不足(FF-EB)=0x14,则goto L_1B0H,重新握手
LGOTO L_18DH ; TMR0计数超过0x14,则继续执行
LGOTO L_1B0H ; 实际就是 goto L_178H
L_18DH:
BC IRQF,TM0F
L_18EH:
BTSS PORTB,C_Data
LGOTO L_18EH ; 循环等待高电平
MOV TMR0,A
MOVAM R_23H
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
;MOVLA 0x14
;SUB R_23H,A
;BTSC STATUS,C
MOVLA 0xEB
SUB R_23H,A
BTSS STATUS,C
LGOTO L_19DH
LGOTO L_1B0H ; 重新握手
L_19DH:
BTSS IRQF,TM0F
LGOTO L_1A0H
LGOTO L_1B0H ; TMR0溢出 低电平过长,重新握手
L_1A0H:
MOV TMR0,A
;XORLA 0x08
XORLA 0xF7 ; 0xFF - 0xF7 = 8
BTSS STATUS,Z
LGOTO L_1A0H ; 等待TMR0计数变为08H, 8×256×0.5 = 1.024ms
BTSC PORTB,C_Data
LGOTO L_1ABH
LGOTO L_1B0H ; 数据线为0,重新握手
L_1ABH:
LCALL S_1B7H ; 输出83.5us低电平->高电平
LCALL S_1C0H ; PB0 输入等待537.5us->高电平->输出134.5us低电平->输出高电平
; 输入等待537.5us->低电平->退出
MOV R_10H,A
BTSC STATUS,Z
LGOTO L_1B1H ; R_10H 为0 则goto L_1B1H 意为握手成功
L_1B0H:
LGOTO L_178H ; R_10H 为1 则goto L_178H 握手失败,重新握手
L_1B1H:
BC IRQM,INTM ; 关总中断
MOVLA 0xC1
SELECT ; TMR0预分频改为4
MOV R_2AH,A
MOVAM R_11H
RET
;-------------------------------
; PB0 输出83.5us低电平->高电平
; PB0 为漏极开路输出
S_1B7H:
;MOVLA 0xFC
MOVLA 0x1C
MOVAM PB_POD ; PB0 禁止漏极开路
MOVLA 0x1C
IODIR PORTB ; PB0 改为输出
BC PORTB,C_Data ; PB0 输出0
MOVLA 0x0A
MOVAM R_29H
;LCALL S_164H ; 延时 7*10+9 = 79us
L_1B7H_1:
NOP
NOP
LGOTO L_1B7H_3 ; 2
L_1B7H_2:
NOP ; 1
NOP ; 1
DEC R_29H,M ; 1
L_1B7H_3:
MOV R_29H,A ; 1
BTSS STATUS,Z ; 1 or 2
LGOTO L_1B7H_2 ; 2
NOP
NOP
;MOVLA 0xFD
MOVLA 0x1D
MOVAM PB_POD ; PB0 漏极开路
BS PORTB,C_Data ; PB0 输出1
RET
;--------------------------------
;PB0 改为输入,等待537.5us,再读取
; 1. 为高电平,则PB0改为输出,输出134.5us低电平,再置高电平,并置10H标志为0
; 2. 为低电平,则置10H标志为1
; PB0 输入等待537.5us->高电平->输出134.5us低电平->输出高电平
; 输入等待537.5us->低电平->退出
; 即PB0输出数据位1
S_1C0H:
MOV R_11H,A
MOVAM R_2BH
MOVLA 0x1D
IODIR PORTB ; PB0 改为输入
BS PORTB,C_Data ; PB0 输出锁存置1
MOVLA 0x4B
MOVAM R_29H
;LCALL S_164H ; 延时 7*75+9 = 534us
L_1C0H_1:
NOP
NOP
LGOTO L_1C0H_3 ; 2
L_1C0H_2:
NOP ; 1
NOP ; 1
DEC R_29H,M ; 1
L_1C0H_3:
MOV R_29H,A ; 1
BTSS STATUS,Z ; 1 or 2
LGOTO L_1C0H_2 ; 2
NOP
NOP
BTSC PORTB,C_Data
LGOTO L_1D2H
MOVLA 0x01
MOVAM R_10H
LGOTO L_1DCH
L_1D2H:
MOVLA 0x1C
IODIR PORTB ; PB0 改为输出
;MOVLA 0xFC
MOVLA 0x1C
MOVAM PB_POD ; PB0 禁止漏极开路
BC PORTB,C_Data ; PB0 输出0
MOVLA 0x12
MOVAM R_29H
;LCALL S_164H ; 延时 7*18+9 = 135us
L_1C0H_4:
NOP
NOP
LGOTO L_1C0H_6 ; 2
L_1C0H_5:
NOP ; 1
NOP ; 1
DEC R_29H,M ; 1
L_1C0H_6:
MOV R_29H,A ; 1
BTSS STATUS,Z ; 1 or 2
LGOTO L_1C0H_5 ; 2
NOP
NOP
;MOVLA 0xFD ; PB0 使能漏极开路
MOVLA 0x1D
MOVAM PB_POD
BS PORTB,C_Data ; PB0 输出1
MOVLA 0x00
MOVAM R_10H
L_1DCH:
MOV R_2BH,A
MOVAM R_11H
RET
;---------------------------------
; PB0接收一个8位数据 并与22H内数据进行比较
; 高位先接收
; 接收数据存放在24H
; 相同则置10H为0
; 不相同则置10H为1
; 调用该程序之前,应确保TMR0预分频为8
S_1DFH:
MOV R_11H,A
MOVAM R_2AH
MOVLA 0x1D
IODIR PORTB ; PB0口改为输入
NOP
L_1E4H:
BTSC PORTB,C_Data
LGOTO L_1E4H ; 循环等待低电平
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
BC IRQF,TM0F
L_1EDH:
BTSS PORTB,C_Data
LGOTO L_1EDH ; 循环等待高电平
MOV TMR0,A
MOVAM R_23H
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
;MOVLA 0x3C
;SUB R_23H,A ; TMR0 - 3CH
;BTSS STATUS,C
MOVLA 0xC3
SUB R_23H,A
BTSC STATUS,C ; 即低电平不超过240us为合法
LGOTO L_1FDH
MOVLA 0x01
MOVAM R_10H
LGOTO L_233H
L_1FDH:
BTSS IRQF,TM0F
LGOTO L_202H
MOVLA 0x01
MOVAM R_10H
LGOTO L_233H
L_202H:
CLR R_24H ; R_24H 为接收数据
MOVLA 0x80
MOVAM R_21H ; R_21H 初始值 80H,因其后会右移,意为接收数据从高位开始读取
CLR R_20H ; R_20H为循环次数
LGOTO L_220H
L_207H:
BTSS PORTB,C_Data
LGOTO L_207H ; 循环等待高电平
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
L_20EH:
BTSC PORTB,C_Data
LGOTO L_20EH
MOV TMR0,A
MOVAM R_23H
;CLR TMR0
MOVLA 0xFF
MOVAM TMR0
;MOVLA 0x64
;SUB R_23H,A
;BTSS STATUS,C
MOVLA 0x9B
SUB R_23H,A
BTSC STATUS,C
LGOTO L_21DH
MOV R_21H,A
IOR R_24H,M ; 接收数据的判断,高电平超过400us为1 高电平少于400us为0
L_21DH:
BC STATUS,C
RR R_21H,M
INC R_20H,M
L_220H:
MOVLA 0x08
SUB R_20H,A
BTSS STATUS,C
LGOTO L_207H
L_224H:
BTSS PORTB,C_Data
LGOTO L_224H ; 循环等待高电平
MOV R_24H,A
XOR R_22H,A ; R_24H(接收数据) 异或 R_22H
BTSS STATUS,Z
LGOTO L_231H
MOVLA 0x00
MOVAM R_10H
LGOTO L_233H
L_231H:
MOVLA 0x01
MOVAM R_10H
L_233H:
MOV R_2AH,A
MOVAM R_11H
RET
;-------------------------------------
; 根据R_22H的低4位数值,PB0 做相应的动作。
; 高位先输出
; 为1:
; PB0 改为输入,等待537.5us,再读取
; 读取为高电平,则PB0改为输出,输出134.5us低电平,再置高电平
; 读取为低电平,这里未做处理
; 为0:
; 输出 135.5us 高电平->538.5us低电平->高电平
S_236H:
MOV R_11H,A
MOVAM R_2AH
MOVLA 0x08
MOVAM R_21H ; 用于位操作的数值
CLR R_20H ; R_20H为循环次数
LGOTO L_248H
L_23CH:
MOV R_22H,A
MOVAM R_11H
MOV R_21H,A
AND R_11H,A
BTSC STATUS,Z
LGOTO L_244H
LCALL S_1C0H ; PB0 输入等待537.5us->高电平->输出134.5us低电平->输出高电平 即数据位1
; 输入等待537.5us->低电平->退出
LGOTO L_245H
L_244H:
LCALL S_24FH ; PB0 输出 135.5us 高电平->538.5us低电平->高电平 即数据位0
L_245H:
BC STATUS,C
RR R_21H,M
INC R_20H,M
L_248H:
MOVLA 0x04
SUB R_20H,A
BTSS STATUS,C
LGOTO L_23CH ; 循环次数<4 则goto L_23CH
MOV R_2AH,A
MOVAM R_11H
RET
;------------------------------------
; PB0 输出 135.5us 高电平->538.5us低电平->高电平 退出
; PB0 为漏极开路输出
; 即PB0输出数据位0
S_24FH:
BS PORTB,C_Data
MOVLA 0x12
MOVAM R_29H
;LCALL S_164H ; 延时 7*18+9 = 135us
L_24FH_1:
NOP
NOP
LGOTO L_24FH_3 ; 2
L_24FH_2:
NOP ; 1
NOP ; 1
DEC R_29H,M ; 1
L_24FH_3:
MOV R_29H,A ; 1
BTSS STATUS,Z ; 1 or 2
LGOTO L_24FH_2 ; 2
NOP
NOP
;MOVLA 0xFC
MOVLA 0x1C
MOVAM PB_POD ; 禁止漏极开路输出
BC PORTB,C_Data
MOVLA 0x4B
MOVAM R_29H
;LCALL S_164H ; 延时 7*75+9 = 534us
L_24FH_4:
NOP
NOP
LGOTO L_24FH_6 ; 2
L_24FH_5:
NOP ; 1
NOP ; 1
DEC R_29H,M ; 1
L_24FH_6:
MOV R_29H,A ; 1
BTSS STATUS,Z ; 1 or 2
LGOTO L_24FH_5 ; 2
NOP
NOP
;MOVLA 0xFD
MOVLA 0x1D
MOVAM PB_POD ; 使能漏极开路输出
BS PORTB,C_Data
RET
;------------------------------------
; PB0 输出1(禁止漏极开路输出)->延时->PB0使能漏极开路输出
; 根据25H的值 决定延时时间
S_259H:
MOVLA 0x1C
IODIR PORTB ; PB0设置为输出
BS PORTB,C_Data
MOV PB_POD,A
ANDLA 0xFE
MOVAM PB_POD ; PB0 禁止漏极开路输出
MOV R_25H,A
MOVAM R_29H
LCALL S_164H ; 延时 7*(29H)+9 cycle
MOV PB_POD,A
IORLA 0x01
MOVAM PB_POD ; PB0 使能漏极开路输出
RET
L_INT:
RETI
ORG 0x03FE
LGOTO L_INT
ORG 0x03FF
LGOTO START
END
我说淘宝ID有点熟悉,像是坛里见过的...哥们速度这么快啊{:shocked:}。汇编都忘了,没看明白,搜半天就这个有点信息,和逻辑分析仪对比了下,数据特征有点相似,不确定。
下为抓取的数据,有请高人分析,抓自NOKIA AD-54(WH-701也是相同的吧,反正我试过两种耳机一样可以在同一手机上使用)。使用很火的那个便宜逻辑分析仪软件打开,你懂得。
汇编源代码还不如驱动逻辑波形的可移植性高。{:smile:} 忘记提醒楼主了,如果你的协议是能在NOKIA上使用的,那百分百也能在IPHONE上使用。 不错貌似不同厂商的线控耳机原理不同
线控耳机里面还有这个高科技,长见识了。
好整齐的代码 这个没有看明白
这个罗辑分析仪是哪个软件 有电路图吗 高手啊{:hug:}{:sleepy:}{:sleepy:}{:sleepy:}{:sleepy:}{:sleepy:} 这个 汇编不是 51,,,更像PIC的吧 mark…
顶一个… 顶一下
页:
[1]