;遥控器控制显示123456789数据保持;*************************************************************************** ;* gehuiwy@ Create by :葛辉*;*************************************************************************** REC_DATA EQU 20H ;数码管段选的数据存放在片内RAM 20H单元REC_DATA1 EQU 21H ;数码管段选的数据存放在片内RAM 21H单元ORG 0000HSJMP MAINORG 0003H ;外部中断0引脚链接红外接收头输出LJMP INT0_SERVICEORG 0030HMAIN:MOV IE,#10000001B ;外部中断使能,全局中断使能MOV REC_DATA,#00000000B ;数码管灭MOV REC_DATA,#7EH ;数码管亮MOV REC_DATA1,#7EH ;数码管亮MOV P1,#11111110B ;选中左边的数码管MOV P3,#0FFHLOOP:LCALL DISPLAY;MOV REC_DATA,#0FFH ;数码管亮;MOV P2,REC_DATA ;段选送P2,P2链接数码管驱动244的输入SJMP LOOP ;循环显示INT0_SERVICE: ;中断0服务程序SETB P1.0SETB P1.1MOV R4,#8 ;8毫秒为高电平错误SBA:MOV R5,#250SBB:JB P3.2,SXB1DJNZ R5,SBBDJNZ R4,SBAMOV R4,#2JMP SBCSXB1:MOV R5,#5SXB2: ;去掉20US的尖峰干扰信号JNB P3.2,SBBDJNZ R5,SXB2JMP EXITSBC:MOV R5,#250SB1:JB P3.2,SB2 ;2MS内不为高电平错误(监测9MS的低电平引导码)DJNZ R5,SB1DJNZ R4,SBCJMP EXITSB2: ;去掉20US的尖峰干扰信号MOV R5,#5SB2_A:JNB P3.2,SB1DJNZ R5,SB2_AMOV R4,#3SB2_1:MOV R5,#250SB3: ;监测4.5MS高电平,如3MS内出现低电平错误JNB P3.2,SXCDJNZ R5,SB3DJNZ R4,SB2_1MOV R4,#2JMP SB3_1SXC: ;去掉20US的尖峰干扰信号MOV R5,#5SXC1:JB P3.2,SB3DJNZ R5,SXC1JMP EXITSB3_1: ;监测4.5MS高电平,如5MS内不为低电平错误MOV R5,#250SB3_2:JNB P3.2,SB4DJNZ R5,SB3_2DJNZ R4,SB3_1JMP EXITSB4: ;去掉20US的尖峰干扰信号MOV R5,#5SB4_1:JB P3.2,SB3_2DJNZ R5,SB4_1MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4PP: MOV R3,#8JJJJ:MOV R5,#250JJJJ2: ;1MS内不为低电平错误JB P3.2,JJJJ3DJNZ R5,JJJJ2JMP EXITJJJJ3:LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU ;如果为0就跳转到UUUMOV R5,#250JJJJ4:JNB P3.2,UUUNOPDJNZ R5,JJJJ4JMP EXITUUU: M OV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1中DJNZ R3,JJJJ ;接收地址码的高8位INC R1 ;对R1中的值加1,换成下一个RAMDJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM 中;以下对代码是否正确和定义进行识别MOV A,1AH ;比较高8位地址码XRL A,#00000000B ;判断1AH的值是否等于00000000,相等的话A为0JNZ EXIT ;如果不相等说明解码失败退出解码程序MOV A,1BH ;比较低8位地址XRL A,#11111111B ;再判断高8位地址是否正确JNZ EXIT ;如果不相等说明解码失败退出解码程序LCALL YS3MOV A,1CH ;比较数据码和数据反码是否正确?CPL AXRL A,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确JNZ EXIT ;如果不相等说明解码失败退出解码程序LCALL YS3AJMP BIJIAO;判断在118毫秒内是否有连发码AA: MOV R1,#25XX: ACALL YS2JNB P3.2,HH ;跳转到判断连发代码是否正确的程序段DJNZ R1,XXEXIT:RETI ;退出中断服务程序;连发码判断程序段-----------HH: MOV R6,#4S: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序DJNZ R6, S ;重复4次,目的是确认连发码的低电平信号波形JNB P3.2, $ ;等待高电?LCALL YS3AJMP AABIJIAO: MOV A,1CH ;按键数值判断执CJNE A,#5Fh,TT1 ;判断接收到的是不是1MOV REC_DATA,#00011000B ;数码管显示1MOV REC_DATA1,#01111110BAJMP AATT1:CJNE A,#50h,TT2 ;判断接收到的是不是2MOV REC_DATA,#01101101B ;数码管显示2MOV REC_DATA1,#01111110BAJMP AATT2:CJNE A,#5Dh,TT3 ;判断接收到的是不是3MOV REC_DATA,#00111101B ;数码管显示3MOV REC_DATA1,#01111110BAJMP AATT3:CJNE A,#44h,TT4 ;判断接收到的是不是4MOV REC_DATA,#00011011B ;数码管显示4MOV REC_DATA1,#01111110BAJMP AATT4:CJNE A,#41h,TT5 ;判断接收到的是不是5MOV REC_DATA,#00110111B ;数码管显示5MOV REC_DATA1,#01111110BAJMP AATT5:CJNE A,#0Ah,TT6 ;判断接收到的是不是6MOV REC_DATA,#01110111B ;数码管显示6MOV REC_DATA1,#01111110BAJMP AATT6:CJNE A,#42h,TT7 ;判断接收到的是不是7MOV REC_DATA,#00011100B ;数码管显示7MOV REC_DATA1,#01111110BAJMP AATT7:CJNE A,#46h,TT8 ;判断接收到的是不是8 MOV REC_DATA,#01111111B ;数码管显示8MOV REC_DATA1,#01111110BAJMP AATT8:CJNE A,#47h,TT9 ;判断接收到的是不是9 MOV REC_DATA,#00111111B ;数码管显示9MOV REC_DATA1,#01111110BAJMP AATT9: CJNE A,#49h,TT10MOV REC_DATA,#7EHMOV REC_DATA1,#18HAJMP AATT10: CJNE A,#05h,TT11MOV REC_DATA,#18HMOV REC_DATA1,#18HAJMP AATT11: CJNE A,#06h,TT12MOV REC_DATA,#6DHMOV REC_DATA1,#18HAJMP AATT12:CJNE A,#07h,TT13MOV REC_DATA,#3DHMOV REC_DATA1,#18HAJMP AATT13:CJNE A,#09h,TT14MOV REC_DATA,#1BHMOV REC_DATA1,#18HAJMP AATT14:CJNE A,#45h,TT15MOV REC_DATA,#37HMOV REC_DATA1,#18HAJMP AATT15:CJNE A,#03h,TT16MOV REC_DATA,#77HMOV REC_DATA1,#18HAJMP AATT16:CJNE A,#5Ch,TT17MOV REC_DATA,#1CHMOV REC_DATA1,#18HTT17:CJNE A,#1Eh,TT18 MOV REC_DATA,#7FHMOV REC_DATA1,#18HAJMP AATT18:CJNE A,#5Eh,TT19 MOV REC_DATA,#3FHMOV REC_DATA1,#18HAJMP AATT19:CJNE A,#02h,TT20 MOV REC_DATA,#7EHMOV REC_DATA1,#6DHAJMP AATT20:CJNE A,#58h,TT21 MOV REC_DATA,#18HMOV REC_DATA1,#6DHAJMP AATT21:CJNE A,#1Ah,TT22 MOV REC_DATA,#6DHMOV REC_DATA1,#6DHAJMP AATT22:CJNE A,#5Bh,TT23 MOV REC_DATA,#3DHMOV REC_DATA1,#6DHAJMP AATT23:CJNE A,#01h,TT24 MOV REC_DATA,#1BHMOV REC_DATA1,#6DHAJMP AATT24:CJNE A,#1Bh,TT25 MOV REC_DATA,#37HMOV REC_DATA1,#6DHAJMP AATT25:CJNE A,#59h,TT26 MOV REC_DATA,#77HMOV REC_DATA1,#6DHAJMP AATT26:CJNE A,#5Ah,TT27 MOV REC_DATA,#1CHMOV REC_DATA1,#6DHAJMP AATT27:CJNE A,#18h,TT28 MOV REC_DATA,#7FHMOV REC_DATA1,#6DHTT28:YS1:MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETDISPLAY:SETB P1.1CLR P1.0MOV P2,REC_DATA ;段选送P2,P2链接数码管驱动244的输入LCALL YS1SETB P1.0CLR P1.1MOV P2,REC_DATA1 ;段选送P2,P2链接数码管驱动244的输入LCALL YS1RETYS2:MOV R4,#10 ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: M OV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#248DJNZ R5,$DJNZ R4,D3RETEND。