新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 合泰單片機接收紅外遙控器程序(NEC碼)

        合泰單片機接收紅外遙控器程序(NEC碼)

        作者: 時間:2016-12-01 來源:網絡 收藏
        ;;內容:按下PA3接的按鍵進中斷LED數碼管加1

        ;數碼管段碼接法A-PD0,B-PD1....G-PD6,H-PD7
        ;數碼管位碼接法OM0-PC0...COM4-PC3
        ;紅外頭接-PA.3
        ;完整源代碼下載:http://www.51hei.com/f/hthw.rar
        include HT66F50.inc
        ORG0000H
        JMPA1
        ORG04H;外部中斷0入口地址
        JMPZD01;
        ORG0014H ;多功能中斷入口地址
        JMPZD1
        ORG30H;
        Q1:
        DC03FH; 0
        DC006H; 1
        DC05BH; 2
        DC04FH; 3
        DC066H; 4
        DC06DH; 5
        DC07DH; 6
        DC007H; 7
        DC07FH; 8
        DC06FH; 9
        DC077H; A
        DC07CH; B
        DC039H; C
        DC05EH; D
        DC079H; E
        DC071H; F
        A1:

        本文引用地址:http://www.104case.com/article/201612/324338.htm

        MOVA,3FH;顯示內容
        MOV[8AH],A;第一位數碼管段碼顯示內容寄存器
        MOVA,3FH;顯示內容
        MOV[8BH],A;第二位數碼管段碼顯示內容寄存器
        MOVA,3FH;顯示內容
        MOV[8CH],A;第三位數碼管段碼顯示內容寄存器
        MOVA,3FH;顯示內容
        MOV[8DH],A;第四位數碼管顯示內容寄存器
        MOVA,08H;跟CP1C寄存器設置要求選擇數據
        MOVCP1C,A;設置PC口為I/0口而不是中斷口
        CLRPCC;設置pc 口為輸出口
        CLRPDC;設置PD 口為輸出口
        MOVA,1;設置初始顯示位碼顯示第一位
        MOV[80H],A;位碼寄存器
        MOVA,8AH;設置對應第一位段碼寄存器
        MOVMP0,A;間接寄存器指針
        MOVA,00000000B;
        MOVPRM1,A;設置外部中斷0的管腳為PA.3
        MOVA,00000010B;
        MOVINTEG,A;設置外部中斷0為下降沿觸發
        CLRACERL;設置PA口不為AD輸入口
        SETPAPU.3;設置PA.3上拉
        SETPAC.3;設置PA.3為輸入口
        MOVA,08H;
        MOVCP0C,A;設置PA3不為比較器輸入口
        CLRPDC;設置PD口為輸出口
        MOVA,01H;設置PD口初始狀態
        MOVPD,A;PD口顯示初始狀態
        MOVA,00000000B;設置TM2 計數時鐘位為fSYS/4
        MOVTM2C0,A
        MOVA,11000001B ;設置TM2中斷為定時/計數模式選擇比較器A匹配
        MOVTM2C1,A
        MOVA,LOW 5000;設置中斷時間為5000個時鐘周期
        MOVTM2AL,A;低8位
        MOVA,HIGH 5000;設置中斷時間為5000個時鐘周期
        MOVTM2AH,A;高8位
        CLRMF0F;清多功能中斷0標志
        CLRT2AF;清定時器2較器A中斷標志
        SETMF0E;使能多功能0中斷
        SETT2AE;使能定時器2較器A中斷
        CLRINT0F;清中斷0標志
        SETINT0E;使能外部0中斷
        SETEMI;使能總中斷
        SETT2ON;開始計數
        JMP$
        ;*************************************************
        ;外部中斷0服務子程序
        ;*************************************************

        ZD01:;進入中斷自動關閉總中斷
        SETEMI;打開總中斷允許嵌套
        CLRINT0E;關閉外部中斷0避免為完成操作2次中斷
        MOV[0F2H],A;壓棧ACC到0F2H
        MOVA,STATUS;
        MOV[0F3H],A;壓棧status標志寄存器到0F3H
        MOVA,18;設置起始碼時間(0.5*18=9MS)
        MOV[0A0H],A
        A2:CALLM001;調用0.5MS延時
        SZPA.3;9MS時間內判斷PA3是否為高電平
        JMPZD02;是高電平不是起始碼則跳出中斷
        SDZ[0A0H];判斷是否到9MS
        JMPA2;不到則返回繼續等待
        MOVA,9;設置結果碼時間4.5MS(0.5*9=4.5MS)
        MOV[0A0H],A;
        SNZPA.3;判斷是否為高電平(起始碼是否結束,
        JMP$-1;起始碼必須結束,結果碼才能開始)
        A3:CALLM001;調用0.5MS延時
        SNZPA.3;4.5MS時間內判斷PA3是否為低電平
        JMPZD02;是低電平則不是結果碼跳出中斷
        SDZ[0A0H];判斷是否到4.5ms
        JMPA3;不到這繼續等待
        SZPA.3;到了則是結果碼則等待判斷結果碼是否結束
        JMP$-1;結果碼必須結束后才能繼續下一步判斷
        MOVA,8;設置接收的數為8bit
        MOV[0A1H],A;
        MOVA,4;設置接收個數
        MOV[0A2H],A;
        MOVA,3;設置分辨0或1的時間1.5MS以上為1
        MOV[0A0H],A;
        MOVA,0A4H;設置收到的數存到0A4H(地址碼)0A5H(地址反碼)
        MOVMP1,A;0A6H(數據碼)0A7H(數據反碼)
        A4:
        SNZPA.3;判斷0.565MS低電平是否結束
        JMPA4;必須在0.565MS低電平結束后才能判斷所收的數是1還是0
        A5:
        CALLM001;延時0.5MS
        SNZPA.3;1.5MS內判斷PA3是否為0
        JMPA6;是0則說明時間小于1.5MS為0
        SDZ[0A0H];判斷是否到1.5MS
        JMPA5 ;1;否則繼續等待
        SETC;置位標志C
        RLCIAR1;通過帶進位左移指令把當前數保存起來
        JMPA7;
        A6:
        CLRC;清標志C
        RLCIAR1;通過帶進位左移指令把當前數保存起來
        A7:

        MOVA,3;到了1.5MS還是高電平說明為1
        MOV[0A0H],A;重新設置分辨0或1的時間1.5MS以上為1
        SZPA.3;判斷是否結束回到0.565MS低電平狀態
        JMP$-1;必須要回到0.565MS才能接收下一個數
        SDZ[0A1H];判斷是否收夠了8位數
        JMPA4;否則繼續
        MOVA,8;重新設置位數
        MOV[0A1H],A;
        INCMP1;間接寄存器加1
        SDZ[0A2H];判斷是否收夠4個NEC碼
        JMPA4;
        MOVA,[0A4H];地址碼
        MOV[8AH],A;第一位數碼管段碼顯示內容寄存器
        MOVA,[0A5H];地址反碼
        MOV[8BH],A;第二位數碼管段碼顯示內容寄存器
        MOVA,[0A6H];數據碼
        MOV[8CH],A;第三位數碼管段碼顯示內容寄存器
        MOVA,[0A7H];數據反碼
        MOV[8DH],A;第四位數碼管顯示內容寄存器
        ZD02:
        MOVA,[0F3H];彈棧后進先出先進后出
        MOVSTATUS,A;彈棧0F1H的數到標志寄存器
        MOVA,[0F2H];彈棧0F0H的數到acc
        CLRINT0F;清中斷標志
        SETINT0E;使能外部中斷
        RETI;中斷返回
        ;*******************************************************
        ;中斷服務子程序
        ;*******************************************************
        ZD1:
        MOV[0F0H],A;壓棧ACC到0F0H
        MOVA,STATUS;
        MOV[0F1H],A;壓棧status標志寄存器到0F1H
        CLRPC;清PC(清屏幕)
        MOVA,Q1;數據表地址
        CLRTBHP;清數據表地址高位否則出錯
        ADDA,IAR0;利用間接寄存器找到要顯示段碼所在數據表的地址
        MOVTBLP,A;表格指針寄存器TBLP
        ;TABRDPD;查表并將數據存到PD口寄存器
        MOVA,IAR0;
        MOVPD,A;顯示收到的數到LED上
        MOVA,[80H];位碼寄存器
        MOVPC,A;將位碼寄存器的數存到PC口寄存器
        ;段碼和位碼的數都有了所以數碼管被點亮
        INCMP0;間接寄存器指針加1指向下一個段碼寄存器
        RL[80H];左移位碼寄存器控制下一個數碼管
        SNZ[80H].5;判斷是否控制完4個數碼管
        JMPZD2;退出中斷繼續
        MOVA,1;是則從新初始化寄存器數據
        MOV[80H],A;
        MOVA,8AH;千位數碼管對應寄存器
        MOVMP0,A;存到間接寄存器0
        ZD2:
        MOVA,[0F1H];彈棧后進先出先進后出
        MOVSTATUS,A;彈棧0F1H的數到標志寄存器
        MOVA,[0F0H];彈棧0F0H的數到acc
        CLRMF0F;清多功能標志
        CLRT2AF;清定時器2比較器A標志
        RETI;中斷返回
        ;**************************************
        ;延時子程序
        ;**************************************
        M001:
        MOVA,1
        MOV[85H],A
        M002:
        MOVA,3
        MOV[86H],A
        M003:
        MOVA,105
        MOV[87H],A
        M004:
        SDZ[87H]
        JMPM004
        SDZ[86H]
        JMPM003
        SDZ[85H]
        JMPM002
        RET
        END



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 石门县| 垫江县| 唐山市| 彭山县| 金秀| 图们市| 肇源县| 安溪县| 玉溪市| 长岭县| 云阳县| 宁陕县| 清水河县| 宜宾市| 普格县| 工布江达县| 济南市| 黄平县| 兴业县| 宁波市| 嘉义市| 东方市| 恩施市| 乐安县| 怀远县| 张北县| 遵义市| 翁源县| 湘潭市| 积石山| 那曲县| 文成县| 独山县| 丰县| 鄄城县| 昭觉县| 新竹县| 罗源县| 柘荣县| 商河县| 武冈市|