新聞中心

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

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

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

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

        本文引用地址:http://www.104case.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

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

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




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 探索| 江西省| 三都| 伊吾县| 阳春市| 东源县| 大悟县| 沙湾县| 建湖县| 玉门市| 阿荣旗| 界首市| 廉江市| 忻城县| 普兰县| 神木县| 偏关县| 漳浦县| 绍兴县| 海宁市| 秦皇岛市| 孝感市| 霞浦县| 阿巴嘎旗| 彩票| 荣成市| 景谷| 麻江县| 凌源市| 临夏县| 丽水市| 潼关县| 来安县| 遵义县| 喀喇| 宁津县| 马关县| 镇原县| 滦平县| 乌拉特前旗| 全州县|