• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 帶存儲功能的學習型紅外遙控器源代碼

    帶存儲功能的學習型紅外遙控器源代碼

    作者: 時間:2012-09-04 來源:網絡 收藏

    很詳細的,儲存在24c64中的匯編子程序,在你自己的設計中只要修改一下IO調用它就可以了,是本人的工程驗證能學習市面常用的絕大部分

    本文引用地址:http://www.czjhyjcfj.com/article/170920.htm

    用的是stc89c52單片機,下面是匯編代碼:

    ;**********************************
    ;---------------------AT24C64 CODE-------------------------
    ;==========================================================
    ICSTART: ;I2C 開始
    SETB SDA
    NOP
    NOP
    NOP
    NOP
    SETB SCK
    NOP
    NOP
    NOP
    NOP
    CLR SDA
    NOP
    NOP
    NOP
    NOP
    CLR SCK
    RET
    ;==========================================================
    ICSTOP: ;I2C 結束
    CLR SDA
    NOP
    NOP
    NOP
    NOP
    CLR SCK
    NOP
    NOP
    NOP
    NOP
    SETB SCK
    NOP
    NOP
    NOP
    NOP
    SETB SDA
    RET
    ;==========================================================
    ICACK: ;I2C 應答
    CLR SDA
    NOP
    NOP
    NOP
    NOP
    SETB SCK
    NOP
    NOP
    NOP
    NOP
    CLR SCK
    RET
    ;==========================================================
    NOACK: ;I2C 無應答
    SETB SDA
    NOP
    NOP
    NOP
    NOP
    SETB SCK
    NOP
    NOP
    NOP
    NOP
    CLR SCK
    RET
    ;==========================================================
    ICREADBIT: ;I2C 讀取一位
    SETB SDA
    NOP
    NOP
    NOP
    NOP
    SETB SCK
    NOP
    NOP
    NOP
    NOP
    MOV C,SDA
    CLR SCK
    RET
    ;----------------------------------------------------------
    ICREADACK:
    MOV R7,#200
    SETB SDA
    NOP
    NOP
    NOP
    NOP
    SETB SCK
    NOP
    NOP
    NOP
    NOP
    READACKS:
    JNB SDA,ACKEND
    DJNZ R7,READACKS
    SETB C
    CLR SCK
    RET
    ACKEND:
    CLR C
    CLR SCK
    RET

    ;==========================================================
    ICREADBYTE: ;I2C 讀取一個字節
    MOV R7,#8
    READLOOP:
    LCALL ICREADBIT
    RLC A
    DJNZ R7,READLOOP
    MOV R7,A
    RET
    ;==========================================================
    ICWRITEBIT: ;I2C 寫一位
    MOV SDA,C
    NOP
    NOP
    NOP
    NOP
    SETB SCK
    NOP
    NOP
    NOP
    NOP
    CLR SCK
    RET
    ;==========================================================
    ICWRITEBYTE: ;I2C 寫一個字節
    MOV A,R7
    MOV R7,#8
    WRITELOOP:
    RLC A
    LCALL ICWRITEBIT
    DJNZ R7,WRITELOOP
    RET
    ;==========================================================
    READAT:
    MOV A,R7 ;計算I2C地址
    MOV B,#208 ;144
    MUL AB
    MOV R2,B
    MOV R3,A


    LCALL ICSTART ;I2C 數據讀入緩沖區
    MOV R7,#0A0H ;R2R3 I2C地址
    LCALL ICWRITEBYTE ;R0 緩沖區地址
    LCALL ICREADACK ;R1 數據個數
    JNC RACKEND
    RET
    ;
    RACKEND:
    MOV A,R2
    MOV R7,A
    LCALL ICWRITEBYTE
    LCALL ICREADACK
    MOV A,R3
    MOV R7,A
    LCALL ICWRITEBYTE
    LCALL ICREADACK

    LCALL ICSTART
    MOV R7,#0A1H
    LCALL ICWRITEBYTE
    LCALL ICREADACK
    MOV R0,#LRDBUF
    MOV R1,#208 ;144

    READDATAS:
    LCALL ICREADBYTE
    LCALL ICACK
    MOV @R0,A
    INC R0
    DJNZ R1,READDATAS
    LCALL NOACK
    LCALL ICSTOP
    RET

    ;==========================================================
    WRITEAT: ;緩沖區數據寫入 I2C

    MOV A,R7 ;計算I2C地址
    MOV B,#208 ;;144
    MUL AB
    MOV R2,B
    MOV R3,A
    MOV R5,#13 ;9 13*16=208

    MOV R0,#LRDBUF

    ICWRITENEXT:
    LCALL ICSTART
    MOV R7,#0A0H
    LCALL ICWRITEBYTE
    LCALL ICREADACK
    JNC WACKEND
    ;
    ;
    WACKEND:
    MOV A,R2
    MOV R7,A
    LCALL ICWRITEBYTE
    LCALL ICREADACK
    MOV A,R3
    MOV R7,A
    LCALL ICWRITEBYTE
    LCALL ICREADACK


    MOV R1,#16
    WRITEDATAS:
    MOV A,@R0
    INC R0
    MOV R7,A
    LCALL ICWRITEBYTE
    LCALL ICREADACK
    DJNZ R1,WRITEDATAS
    LCALL ICSTOP


    MOV R7,#250
    DELAY_D:
    MOV R6,#20
    DJNZ R6,$
    DJNZ R7,DELAY_D

    MOV A,R3
    ADD A,#16
    MOV R3,A
    MOV A,R2
    ADDC A,#0
    MOV R2,A


    DJNZ R5,ICWRITENEXT
    RET
    ;*****************************************************************

    ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    LRDREAD:
    ;代碼讀取
    MOV R0,#LRDBUF ;代碼緩沖區清零
    MOV R1,#208 ;144
    CLR A
    CLRLRDBUF:
    MOV @R0,A
    INC R0
    DJNZ R1,CLRLRDBUF
    MOV R0,#LRDBUF
    SETB LRDR
    LRDTEST:
    SETB TR2
    SETB ES ;紅外代碼起始檢測
    JB RI,LLOOP ;這里是檢測有鍵按下時。。。。。。
    CLR TR2
    JNB LRDR,READSTART
    JB HWXX,LRDTEST ;紅外學習標志位
    LJMP LLLOOP
    LLOOP: ;
    CLR RI
    MOV A,SBUF
    MOV R0,#250
    MOV R1,#250
    LP4: JB RI,LP3
    DJNZ R0,LP4
    DJNZ R1,LP4
    LJMP LRDTEST
    LP3: CLR RI
    CLR ES
    MOV A,SBUF
    MOV A,#00H

    LP2:
    CLR HONGWAI ;紅外按鈕標志位
    CLR P3.3
    CLR HWXX
    MOV SBUF,#37H
    JNB TI,$
    CLR TI
    DEC SP
    DEC SP
    LJMP LOOP
    LLLOOP: RET

    ;--------------------------------------
    READSTART:
    CLR EA
    ;SETB P0.6
    MOV TH1,#0
    MOV TL1,#12
    SETB LRDR
    ;--------------------------------------
    READLOOP_S:
    SETB TR1
    CLR TF1
    TEST_LRDR:
    MOV A,TH1
    JB TF1,LRDOVER
    JNB LRDR,TEST_LRDR
    CLR TR1 ;

    INC R0
    MOV A,TL1
    MOV @R0,A
    INC R0
    MOV A,TH1
    MOV @R0,A
    INC R1 ;紅外線時間 1
    ;--------------------------------------
    ;--------------------------------------
    MOV TH1,#0
    MOV TL1,#12
    SETB TR1
    CLR TF1

    TESTLRD:
    MOV A,TH1
    JB TF1,LRDOVER
    JB LRDR,TESTLRD

    CLR TR1
    INC R0
    MOV A,TL1
    MOV @R0,A
    INC R0
    MOV A,TH1
    MOV @R0,A ;代碼 2
    INC R1
    ;**************************************

    TEST_DATA:
    MOV TH1,#0
    MOV TL1,#12
    SETB TR1
    CLR TF1

    MOV A,R1
    SUBB A,#101 ;44H
    JC READLOOP_S ;下一代碼
    ;--------------------------------------
    LRDOVER:
    CLR TR1
    SETB EA
    MOV A,R1
    MOV LRDBUF,A ;代碼個數緩沖
    RET
    ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    LRD1SEND:
    CLR EA
    MOV R1,LRDBUF
    MOV R0,#LRDBUF
    MOV A,R1
    JZ LRD_END
    SUBB A,#101 ;72
    JNC LRD_END
    CLR EA
    MOV TH1,#0

    LRD1OUTLOOP:
    CLR TR1
    INC R0
    MOV A,@R0
    CPL A
    MOV TL1,A
    INC R0
    MOV A,@R0
    CPL A
    MOV TH1,A
    SETB TR1
    CLR TF1
    ;--------------------------------------
    LRD1CONT:
    CPL LRD1
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP ;發送紅外波形 38K HZ
    JNB TF1,LRD1CONT ;紅外前導代碼
    CLR LRD1
    DJNZ R1,SEND_DATA
    LJMP LRD_END

    SEND_DATA:
    ;--------------------------------------

    CLR TR1
    INC R0
    MOV A,@R0
    CPL A
    MOV TL1,A
    INC R0
    MOV A,@R0
    CPL A
    MOV TH1,A
    SETB TR1
    CLR TF1
    DJNZ R1,OUT_1_CODE


    LRD_END:
    CLR TR1
    CLR TF1
    SETB EA
    RET
    OUT_1_CODE:
    JNB TF1,$ ;紅外代碼
    ;--------------------------------------
    LJMP LRD1OUTLOOP
    RET ;取下一個代碼
    ;==========================================================
    ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


    DELAY:
    MOV R7,#200
    DEL_L:
    MOV R6,#30
    DJNZ R6,$
    DJNZ R7,DEL_L
    RET

    DELY_2:
    MOV R7,#250
    DEL_2:
    LJMP DELAY
    DJNZ R7,DEL_2
    MOV R7,#250
    DEL_3: LJMP DEL_2
    DJNZ R7,DEL_3
    RET

    萬能遙控器相關文章:萬能遙控器代碼


    紅外遙控器相關文章:紅外遙控器原理


    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 孙吴县| 江永县| 饶平县| 石阡县| 仁怀市| 六盘水市| 古丈县| 邛崃市| 左云县| 昌吉市| 凉山| 抚远县| 南靖县| 玉屏| 藁城市| 盱眙县| 宁安市| 永济市| 伊金霍洛旗| 榆社县| 项城市| 满洲里市| 唐山市| 琼结县| 抚州市| 阿拉善盟| 信宜市| 临清市| 渝中区| 平泉县| 随州市| 荥经县| 玉溪市| 神木县| 商洛市| 修文县| 松滋市| 佛教| 德庆县| 靖宇县| 遵化市|