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

📄 key.a51

📁 我实验板带的实验程序
💻 A51
字号:

    public WaitKey

    ;------------------------------------------

    PIN_6221  equ  p3.7

    ;------------------------------------------

    ?DT?WaitKey?KeyAsm segment data overlayable
    rseg ?DT?WaitKey?KeyAsm

    caryKeyBuf:  ds 4

    ;------------------------------------------

    KeyAsmCodeSeg segment code
    rseg KeyAsmCodeSeg

WaitKey:

begin:
    mov p3, #0ffH

WaitLoop:
    jnb p3.2, KeyDown
    jnb p3.3, KeyDown
    jnb p3.4, KeyDown
    jnb p3.5, KeyDown
    jb PIN_6221, RemoteDeviceKeyDown
    sjmp WaitLoop
KeyDown:
    mov r7, #0
    ret

RemoteDeviceKeyDown:
    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, #caryKeyBuf
    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位数据反码

    ;以下对代码是否正确和定义进行识别
    mov a, caryKeyBuf;比较高8位地址码
    xrl a, #00000000b ;判断1ah的值是否等于00000000,相等的话a为0
    jnz begin;如果不相等说明解码失败退出解码程序
    mov a, caryKeyBuf + 1;比较低8位地址
    xrl a, #11111111b ;再判断高8位地址是否正确
    jnz begin;如果不相等说明解码失败退出解码程序
    lcall ys3
    mov a, caryKeyBuf + 2  ;比较数据码和数据反码是否正确?
    cpl a
    xrl a, caryKeyBuf + 3  ;将1ch的值取反后和1dh比较 不同则无效丢弃,核对数据是否准确
    jnz begin;如果不相等说明解码失败退出解码程序
    lcall ys3

   ;判断在118毫秒内是否有连发码
aa:
    mov r1, #25
xx:
    lcall ys2
    jnb PIN_6221, hh; 跳转到判断连发代码是否正确的程序段
    djnz r1, xx

    mov r7, caryKeyBuf + 2
    ret


;连发码判断程序段-----------
hh:
    mov r6,#4
s:
    lcall ys1  ;调用882微秒延时子程序
    jb PIN_6221, begin  ;延时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



end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -