|
发表于 2010-12-19 17:59:53
|
显示全部楼层
按单片机的12M晶振算。
下面是改自网上的一段程序,原作摒弃了键连_发功能,我这里加上了。原作者每行都注释了,对初学者很有用。
;=============外部中断0服务程序 ,实现软件解码=========================================
INT: CLR EA ;关中断
MOV R6,#10
JM0: ACALL YS1 ;调用882微秒延时子程序
JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ R6, JM0 ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲
LCALL YS4 ;等待2.25毫秒再判断是否连_发
JB P3.2,JM1X ;为高电平则不是连_发
SETB LF_FLAG ;为低电平则置连_发标志
AJMP EXIT ;退出解码
JM1X: ACALL YS5 ;延时4.74毫秒避开4.5毫秒的结果码
MOV R7,#16 ;忽略前16位系统识别码,HT6221共发送32位数据,前16位为用户码,后16为数据码才是我们需要的
JM1: JNB P3.2,$ ;等待地址码第一位的高电平信号
LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
JNC JM2 ;如果为0就跳转到JM2
LCALL YS3 ;检测到高电平1的话延时1毫秒等待脉冲高电平结束
JM2: DJNZ R7,JM1
MOV R1,#1AH ;设定1AH为起始RAM区
MOV R2,#2 ;接收从1AH到1BH的2个内存,用于存放操作码和操作反码,
;16位数据分前8位和后8位,后8位是前8位的反码,用于检验
JM3: MOV R3,#8 ;每组数据为8位
JM4: JNB P3.2,$ ;等待地址码第一位的高电平信号
LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
JNC JM5 ;如果为0就跳转到JM5
LCALL YS3 ;检测到高电平1的话延时1毫秒等待脉冲高电平结束,然后把C中的1存入R1
JM5: MOV A,@R1 ;将R1中的数据给A
RRC A ;将C中的值0或1移入A中的最低位
MOV @R1,A ;将A中的数暂时存放在R1数值的内存中
DJNZ R3,JM4 ;接收满8位换一个内存
INC R1 ;对R1中的值加1,换下一个RAM
DJNZ R2,JM3 ;接收完8位数据码和8位数据反码,存放在1AH/1BH中
MOV A,1AH
CPL A ;对1AH取反后和1BH比较
CJNE A,1BH,EXIT ;如果不等表示接收数据发生错误,放弃
CPL A ;再取反还原键值
MOV KVALUE,A ;键值送KVALUE和KTEMP
MOV KTEMP,A
SETB DF_FLAG
EXIT: SETB EA ;开中断
RETI ;退出解码子程序
;=============延时子程序1,精确延时882微秒,晶振11.0592M,下同=========================================
YS1: MOV TH0,#0FCH
MOV TL0,#0D4H
SETB TR0
JNB TF0,$
CLR TF0
RET
;============延时子程序2,精确延时4740微秒==========================================
YS2: MOV TH0,#0EEH
MOV TL0,#0EFH
SETB TR0
JNB TF0,$
CLR TF0
RET
;=============延时程序3,精确延时1000微秒===========================================
YS3: MOV TH0,#0FCH
MOV TL0,#66H
SETB TR0
JNB TF0,$
CLR TF0
RET
;=============延时程序4,精确延时2.25微秒===========================================
YS4: MOV TH0,#0F7H
MOV TL0,#0E6H
SETB TR0
JNB TF0,$
CLR TF0
RET
;=============延时程序5,精确延时2.49微秒===========================================
YS5: MOV TH0,#0F7H
MOV TL0,#09H
SETB TR0
JNB TF0,$
CLR TF0
RET |
|