⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldmsapp.asm

📁 学林电子实验箱源码 完整板
💻 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 + -