📄 ldmsapp.asm
字号:
;遥控器代码测试程序
;***************************************************************************
;* sxj1974@163.com (51c51 test web) www.8951.com *
;* Create by :石学军 www.51c51.com 更多例程请登陆网站 *
;***************************************************************************
RS_PIN equ p3.0
RW_PIN equ p3.1
E_PIN equ p3.5
PIN_6221 equ p3.7
XPOS equ 07eh
YPOS equ 07fh
;------------------------------------------
using 0
org 0000H
jmp start
code_str: db "Key code: ", 0
wait_str: db "Please press key...", 0
start:
lcall clear_screen
mov dptr, #wait_str
lcall showtext
begin:
mov p3, #0ffH
jnb PIN_6221, $ ;等待遥控信号出现
mov r6, #10
sb:
lcall ys1 ;调用882微秒延时子程序
jb PIN_6221, begin ;延时882微秒后判断PIN_6221脚是否出现高电平如果有就退出解码程序
djnz r6, sb ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
jnb PIN_6221, $ ;等待高电平避开9毫秒低电平引导脉冲
lcall ys2 ;延时4.74毫秒避开4.5毫秒的结果码
mov r1, #30H ;设定30h为起始ram区
mov r2, #4
pp:
mov r3, #8
jjjj:
jnb PIN_6221, $ ;等待地址码第一位的高电平信号
lcall ys1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
mov c, PIN_6221 ;将PIN_6221引脚此时的电平状态0或1存入c中
jnc uuu ;如果为0就跳转到uuu
jb PIN_6221, $ ;如果为1就等待高电平信号结束
uuu:
mov a, @r1 ;将r1中地址的给a
rrc a ;将c中的值0或1移入a中的最低位
mov @r1,a ;将a中的数暂时存放在r1中
djnz r3, jjjj ;接收地址码的高8位
inc r1 ;对r1中的值加1,换成下一个ram
djnz r2, pp ;接收完16位地址码和8位数据码和8位数据反码,存放在30h/31h/32h/33h的ram中
;以下对代码是否正确和定义进行识别
mov a, 30H;比较高8位地址码
xrl a, #00000000b ;判断1ah的值是否等于00000000,相等的话a为0
jnz exit;如果不相等说明解码失败退出解码程序
mov a, 31H;比较低8位地址
xrl a, #11111111b ;再判断高8位地址是否正确
jnz exit;如果不相等说明解码失败退出解码程序
lcall ys3
mov a, 32H;比较数据码和数据反码是否正确?
cpl a
xrl a, 33H ;将1ch的值取反后和1dh比较 不同则无效丢弃,核对数据是否准确
jnz exit;如果不相等说明解码失败退出解码程序
lcall ys3
;判断在118毫秒内是否有连发码
aa:
mov r1, #25
xx:
lcall ys2
jnb PIN_6221, hh; 跳转到判断连发代码是否正确的程序段
djnz r1, xx
lcall clear_screen
mov dptr, #code_str
lcall showtext
mov r0, #32h
mov r7, #1
lcall showhex
exit:
sjmp begin
;连发码判断程序段-----------
hh:
mov r6,#4
s:
lcall ys1 ;调用882微秒延时子程序
jb PIN_6221, exit ;延时882微秒后判断PIN_6221脚是否出现高电平如果有就退出解码程序
djnz r6, s ;重复4次,目的是确认连发码的低电平信号波形
jnb PIN_6221, $ ;等待高电平
sjmp aa
ys1:
mov r4, #20 ;延时子程序1,精确延时882微秒
d1:
mov r5, #20
djnz r5, $
djnz r4, d1
ret
ys2:
mov r4, #10 ;延时子程序2,精确延时4740微秒
d2:
mov r5, #235
djnz r5, $
djnz r4, d2
ret
ys3:
mov r4, #2 ;延时程序3,精确延时1000微秒
d3:
mov r5, #248
djnz r5, $
djnz r4, d3
ret
showhex:
; input:
; r0: address r7: bytes count
showhex_loop:
push ar7
mov a, @r0
swap a
anl a, #0fh
clr c
subb a, #0ah
jc label2
add a, #'A'
sjmp label1
label2:
add a, #(0ah + '0')
label1:
push ar0
lcall showchar
pop ar0
mov a, @r0
anl a, #0fh
clr c
subb a, #0ah
jc label4
add a, #'a'
sjmp label3
label4:
add a, #(0ah + '0')
label3:
push ar0
lcall showchar
mov a, #' '
lcall showchar
pop ar0
pop ar7
inc r0
djnz r7, showhex_loop
ret
showtext:
; input:
; dptr : text buffer pointer
mov b, #0
loop_show:
mov a, b
movc a, @a + dptr
inc b
jz showtext_quit
lcall showchar
sjmp loop_show
showtext_quit:
ret
clear_screen:
lcall lcdreset
mov XPOS, #0
mov YPOS, #0
ret
showchar:
push acc
mov a, XPOS
mov r7, YPOS
cjne r7, #0, line2
sjmp setadr
line2:
add a, #040h
setadr:
orl a, #080h ;设置ddram地址
lcall lcdwc
pop acc
lcall lcdwd ;写字符
inc XPOS
mov a, XPOS
cjne a, #10h, showchar_quit
inc YPOS
mov XPOS, #0
showchar_quit:
ret
lcdreset: ;初始化程序
clr E_PIN
call delay5ms ;延时15ms
call delay5ms
call delay5ms
mov a,#38h ;显示模式设置(不检测忙信号)
call lcdwcn ;共三次
call delay5ms
mov a,#38h
call lcdwcn
call delay5ms
mov a,#38h
call lcdwcn
mov a,#38h ;显示模式设置(以后均检测忙信号)
call lcdwc
mov a,#08h ;显示关闭
call lcdwc
mov a,#01h ;显示清屏
call lcdwc
mov a,#06h ;显示光标移动设置
call lcdwc
mov a,#0ch ;显示开及光标设置
call lcdwc
ret
lcdwc: ;送控制字子程序(检测忙信号)
call waitidle
lcdwcn: ;送控制字子程序(不检测忙信号)
clr RS_PIN ;rs=0 rw=0 e=高脉冲
clr RW_PIN
mov p1,a
setb E_PIN
nop
clr E_PIN
ret
lcdwd: ;写字符子程序
call waitidle
setb RS_PIN ;rs=1 rw=0 e=高脉冲
clr RW_PIN
mov p1,a
setb E_PIN
nop
clr E_PIN
ret
waitidle:
push acc ;正常读写操作之前必须检测lcd控制器状态
mov p1,#0ffh
clr RS_PIN ;rs=0 rw=1 e=高电平
setb RW_PIN
setb E_PIN
wtd_pa:
nop ;db7: 0 lcd控制器空闲
jb p1.7,wtd_pa ; 1 lcd控制器忙
clr E_PIN
pop acc
ret
delay5ms:
mov r1,#25 ;延时子程序(5ms)
dl5_pa:
mov r2,#100
djnz r2,$
djnz r1,dl5_pa
ret
delay400ms:
mov r0,#20 ;延时子程序(400ms)
dl4_pa:
mov r1,#100
dl4_pb:
mov r2,#100
djnz r2,$
djnz r1,dl4_pb
djnz r0,dl4_pa
ret
end
/*
org 0
ljmp start
org 01bh
ljmp time1
org 30h
start:
mov 30h, 0
mov tmod, #060h
mov tl1, #0ffh
mov th1, #0ffh
mov ie, #088h
setb tr1
sjmp $
time1:
inc 30h
mov a, 30h
xrl a, #0ffh
cpl p1.0
reti
showa:
push acc
lcall to_showa
pop acc
ret
skiped:
mov a, p1
xrl a, #0ffh
inc a
to_showa:
xrl a, #0ffh
mov p1, a
waittime:
; wait 1 second
mov r2, #100
loop1:
mov r3, #100
loop2:
mov r4, #50
djnz r4, $
djnz r3, loop2
djnz r2, loop1
ret
tab: db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
end
*/
/*
mov tmod, #20h
mov tl1, #0f3h
mov th1, #0f3h
setb tr1
mov scon, #040h
orl pcon, #080h
clr a
mov p1, #0ffh
loop:
lcall showa
mov sbuf, a
jnb ti, $
clr ti
inc a
sjmp loop
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -