搜索
bottom↓
回复: 12

NOKIA线控耳机源码,协议为NOKIA自定义协议

[复制链接]

出10入61汤圆

发表于 2012-5-15 02:03:09 | 显示全部楼层 |阅读模式
;======================================================
;   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        

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-5-15 02:50:12 | 显示全部楼层
我说淘宝ID有点熟悉,像是坛里见过的...哥们速度这么快啊。汇编都忘了,没看明白,搜半天就这个有点信息,和逻辑分析仪对比了下,数据特征有点相似,不确定。
下为抓取的数据,有请高人分析,抓自NOKIA AD-54(WH-701也是相同的吧,反正我试过两种耳机一样可以在同一手机上使用)。使用很火的那个便宜逻辑分析仪软件打开,你懂得。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-15 06:50:17 | 显示全部楼层
汇编源代码还不如驱动逻辑波形的可移植性高。

出0入0汤圆

发表于 2012-5-15 09:41:57 | 显示全部楼层
忘记提醒楼主了,如果你的协议是能在NOKIA上使用的,那百分百也能在IPHONE上使用。

出0入0汤圆

发表于 2012-12-3 11:54:13 | 显示全部楼层
不错  貌似不同厂商的线控耳机原理不同

出0入0汤圆

发表于 2012-12-3 22:42:06 | 显示全部楼层
线控耳机里面还有这个高科技,长见识了。
好整齐的代码

出0入0汤圆

发表于 2012-12-3 23:11:42 | 显示全部楼层
这个没有看明白

出0入0汤圆

发表于 2013-5-11 18:03:30 | 显示全部楼层
这个罗辑分析仪是哪个软件

出0入0汤圆

发表于 2013-5-11 20:57:24 | 显示全部楼层
有电路图吗

出0入0汤圆

发表于 2013-5-15 23:08:08 | 显示全部楼层
高手啊

出0入0汤圆

发表于 2013-5-15 23:36:24 | 显示全部楼层
这个 汇编  不是 51,,,更像  PIC  的吧

出0入0汤圆

发表于 2013-8-15 14:15:49 来自手机 | 显示全部楼层
mark…
顶一个…

出0入4汤圆

发表于 2013-8-15 14:21:59 | 显示全部楼层
顶一下         
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表