西安科技大学高新学院 毕业论文
keydata equ 30h ;//该地址和31H地址用来存放遥控器按键编码。 org 00h main:
mov keydata,#0 ;// 清零
mov tmod ,#09h ;//设臵定时0方式1,GATE=1 mov r7,#0 ;//计数器,用来计数是否满8位
mov r6,#0 ;//计数器,用来计数是否满2字节(解16位编码) jb p3.2,$ ;//是否为低电平
again: ;//如果为低,继续往下面执行 mov tl0,#0 ;//清零TL0 mov th0,#0 ;//清零TH0 setb tr0 ;//开启定时器0 jnb p3.2,$ ;//等待高电平到来 jb p3.2,$ ;//高电平到来,此时开始计数 clr tr0 ;//高电平结束,停止计数 mov a,th0 ;//读取th0 值,TL0忽略不计 clr c ;// subb a,#12 ;//
jc again ;//th0<12则转,即小于3.4ms,你可以算一下这个时间 mov a,#14 ;// clr c ;//
subb a,th0 ;//和14比较,如果TH0>14则大于3.8ms
- 6 -
西安科技大学高新学院 毕业论文
jc again ;//大于3.8ms,从新再检测 nextbit: ;//起始位找到了,然后下一位 mov tl0,#0 ;// mov th0,#0 ;// setb tr0 ;//启动定时器 jnb p3.2,$ ;//等待高电平
jb p3.2,$ ;//高电平到来,此时开始计数 clr tr0 ;//高电平结束,停止计数 mov a,th0 ;//读取计数值,TL0忽略不计 clr c ;//
subb a,#8 ;//th0和8比较
jc next ;;;;//若 <2.2ms则转,再判断是否大于0.84ms mov a,#10 ;//再跟10比较 clr c ;// subb a,th0 ;//
jc again ;;;;;;;//若 >2.7ms,则放弃,从新检测 mov a,keydata ;// 符合大于2.2ms 小于2.7ms,即为“1” setb c ;//C = 1 rrc a ;//把1移位进A mov keydata,a ;//保存 inc r7 ;//计数器加1
cjne r7,#8,nextbit ;//是否满8位
- 7 -
西安科技大学高新学院 毕业论文
inc r6 ;//计数加1
cjne r6,#2,last8 ;//是否满两字节 sjmp seach ;//不满两字节,再新采集 last8: ;//满1字节,再接下来第二字节
mov keydata+1,a ;//把第一字节编码数据保存到31h里 mov r7,#0 ;//计数器R7清零 sjmp nextbit ;//继续采集数据 next: ;//小于2.2ms时转到这里 mov a,th0 ;//读取计数值TH0 swap a ;//高4位与低4位对换 mov r1,a ;//保存到R1
anl tl0,#0f0h ;//取TL0高4位,低4位忽略不计 mov a,tl0 ;// clr c ;// rrc a ;// rrc a ;// rrc a ;// rrc a ;// add a,r1 ;// mov r1,a ;//
subb a,#30 ;//以上几行是把TH0的低4位和TL0的高4位合并为1字节作为计数值
- 8 -
西安科技大学高新学院 毕业论文
jc nextbit ; //判断是否 <0.84ms,是则放弃,继续采集 mov a,r1 ;//否 clr c ;//
cjne a,#64,continue ;//跟64比较 continue: ;//
jnc nextbit ; //a>64表示采样值 >1.11ms mov a,keydata ;//否则 ,符合位“0” clr c ;//C = 0 rrc a ;//把零右移进A mov keydata,a ;//保存 inc r7 ;//计数器加1
cjne r7,#8,nextbit ;//是否满8位 inc r6 ;//计数器加1
cjne r6,#2,last_8 ;//是第一字节已经满 sjmp seach ;//
last_8: ;//如果为第二字节
mov keydata+1,a ;//则保存第一字节到31h mov r7,#0 ;//清零R7 sjmp nextbit ;// seach: ;//匹配按键编码
mov r0,#-2 ;//按键编码字节个数计数器 mov r1,#-1 ;//按键顺序计数器
- 9 -
放弃 西安科技大学高新学院 毕业论文
seach1: ;// inc r0 ;// seach2: ;// inc r0 ;// inc r1 ;//
cjne r1,#29,compare ;//是否R1=29 sjmp exit0 ;// compare: ;//开始匹配 mov a,r0 ;//
mov dptr,#keycode ;//地址指针指向码表首址 movc a,@a+dptr ;//取码 cjne a,keydata,seach1 ;//比较
inc r0 ;//R0+1,再比较下一字节(每个按键编码为2字节) mov a,r0 ;//
;mov dptr,#keycode ;// movc a,@a+dptr ;//比较
cjne a,keydata+1,seach2 ;//是否匹配,不匹配则继续跟下一字节比较 mov p1,r1 ;//如果匹配,把按键顺序号输出到p1 send: ;//
mov tmod,#20h ; //设臵timer 1,mode 2 mov tl1,#0fdh ;//设臵定时器初值 mov th1,#0fdh ;//
- 10 -